Доброго времени суток. Прошу помочь разобраться в одной задаче. Я сделал немного, только теперь мне надо в нее добавить возможность вращения объекта вокруг точки с заданными координатами на заданный угол, и еще эта программа должна продемонстрировать работу ветряной мельницы. ООП довольно-таки сложная тема, я с трудом разобрался с примитивом, а на более сложное не хватило уже. Вот код:
PRectangle=^TRectangle; TRectangle=object(TGraphObject) {прямоугольник} Width,Heigh:Integer; {ширина и высота прямоугольника}
{Задание координат, размеров и цвета прямоугольника} constructor InitData(Nx,Ny,W,H,c:Integer); procedure Paint;virtual; procedure Clear;virtual; end;
constructor TGraphObject.Init; begin Active:=False; {изначально объект невидим} end; destructor TGraphObject.Done; begin Hide; {перед уничтожением сотрем объект с эк-рана} end;
procedure TGraphObject.Locate; begin Hide; {скроем объект} x:=Nx; {зададим новые координаты} y:=Ny; Show; {отобразим на новом месте} end;
procedure TGraphObject.Step; begin Hide; {скроем объект} x:=x+Dx; {переместим объект} y:=y+Dy; Show; {отобразим на новом месте} end;
procedure TGraphObject.Move; begin Step(Random(5)-2,Random(5)-2); {шагнем случайным образом} end;
procedure TGraphObject.Show; begin if not Active then {если объект невидим, то...} begin Active:=True; {установим флажок видимости} Paint; {нарисуем объект} end; end;
procedure TGraphObject.Hide; begin if Active then {если объект видим, то...} begin Active:=False; {сбросим флажок видимости} Clear; {сотрем объект} end; end;
procedure TRectangle.Paint; var i,j:Integer; begin i:=Width Div 2; j:=Heigh Div 2; SetColor(Color); Rectangle(x-i,y-j,x+i,y+j); end;
procedure TRectangle.Clear; var i,j:Integer; begin i:=Width Div 2; j:=Heigh Div 2; SetColor(0); Rectangle(x-i,y-j,x+i,y+j); end;
{Переход в графический режим} procedure InitVideo; var grDriver,grMode:Integer; begin grDriver:=Detect; InitGraph(grDriver,grMode,''); if GraphResult<>grOk then begin Writeln('Ошибка при инициализации графики !'); Halt(1); end; end;
{Возврат в текстовый режим} procedure DoneVideo; begin CloseGraph; end;
var a:array[1..150] of PGraphObject; {массив произвольных объектов} i:Integer; begin ClrScr; {Переход в графический режим} InitVideo; {Инициализируем генератор случайных чисел} Randomize; {Создаем 150 графических объектов} for i:=1 to 150 do case Random(2) of 0:{Точку} a[i]:=New(PPoint,InitData( 20+Random(600), 20+Random(440), {координаты} 1+Random(14))); {цвет} 1:{создаем прямоугольник} a[i]:=New(PRectangle,InitData( 20+Random(600), 20+Random(440), {координаты} 3+Random(5), 3+Random(5), {размеры} 1+Random(14))); {цвет} end; while not KeyPressed do for i:=1 to 150 do a[i]^.Move; {Хаотично перемещаем объект} ReadKey; {Уничтожаем объект} for i:=1 to 150 do Dispose (a[i],Done); {Возвращаемся в текстовый режим} DoneVideo; end.
volvo
28.03.2010 18:25
Цитата
теперь мне надо в нее добавить возможность вращения объекта вокруг точки с заданными координатами на заданный угол
Тебе для этого придется переписать часть программы. Объект должен САМ хранить свои координаты. И не в виде координата X точки, координата Y точки, ширина, высота. А в виде точек. То есть, TPoint представляется одной точкой с координатами X, Y... Треугольник представится массивом из трех таких точек, TRectangle - соответственно - массивом из четырех точек с координатами X, Y... Естественно, придется изменить и отрисовку объектов тоже.
Вот в таком случае вращение любого объекта вокруг заданной точки на заданный угол сведется к 1) "гашению" объекта; 2) стандартному преобразованию координат всех точек, из которых этот объект состоит; 3) "зажиганию" объекта уже с пересчитанными координатами составляющих его точек.
Так что пока переделай ту часть, что у тебя уже есть, а потом продолжим...
volvo
30.03.2010 1:44
... "А в ответ - тишина..." (С)
Чего молчим? Как только появится что-нибудь интересное - так не отвечают. В общем, вот что получилось. Я специально не стал дорабатывать, можно еще кое-что сделать. Скажем, перед TRotateScene в иерархии воткнуть базовый для него класс - TScene, тогда все будет еще интереснее Но доработка - это уже другое. Комментарии я не стал добавлять, осталось то, что было. Но поскольку код отлаживался в FPC, то кодировка могла сбиться. Методы описаны как Abstract;, поэтому в случае Турбо-Паскаля нужно будет написать пустые "заглушки" для таких методов...
Nike0
31.03.2010 18:40
сори что долго не отвечал, не было доступа к интеренету в это время) а так спасибо, доработаем малек программку)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.