Доброго времени суток. Прошу помочь разобраться в одной задаче. Я сделал немного, только теперь мне надо в нее добавить возможность вращения объекта вокруг точки с заданными координатами на заданный угол, и еще эта программа должна продемонстрировать работу ветряной мельницы. ООП довольно-таки сложная тема, я с трудом разобрался с примитивом, а на более сложное не хватило уже. Вот код:
uses
Crt, Graph;
type
PGraphObject=^TGraphObject;
TGraphObject=object{базовый объект}
Active: Boolean; {признак видимости объекта}
x,y: Integer; {координаты объекта}
Color: Integer; {цвет объекта}constructor Init; {конструктор объекта}destructor Done;virtual; {деструктор}procedure Locate (Nx,Ny:Integer); {задание коорди-нат}procedure Step (Dx,Dy:Integer); {сдвиг объекта}procedure Move; {хаотичное движение}procedure Show; {отобразить объект на экране}procedure Hide; {скрыть объект}procedure Paint;virtual; {процедура рисования объекта}procedure Clear;virtual; {процедура стирания объекта}end;
PPoint=^TPoint;
TPoint=object(TGraphObject) {точка}{Задание координат и цвета точки}constructor InitData(Nx,Ny,c:Integer);
procedure Paint;virtual;
procedure Clear;virtual;
end;
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;
beginifnot Active then{если объект невидим, то...}begin
Active:=True; {установим флажок видимости}
Paint; {нарисуем объект}end;
end;
procedure TGraphObject.Hide;
beginif Active then{если объект видим, то...}begin
Active:=False; {сбросим флажок видимости}
Clear; {сотрем объект}end;
end;
procedure TGraphObject.Paint;
beginend;
procedure TGraphObject.Clear;
beginend;
constructor TPoint.InitData;
begininherited Init; {инициализация унаследованных полей}
x:=Nx; {установим координаты}
y:=Ny;
Color:=c; {зададим цвет}end;
procedure TPoint.Paint;
begin
PutPixel(x,y,Color);
end;
procedure TPoint.Clear;
begin
PutPixel(x,y,0);
end;
constructor TRectangle.InitData;
begininherited Init;
x:=Nx;
y:=Ny;
Width:=W;
Heigh:=H;
Color:=c;
end;
procedure TRectangle.Paint;
var
i,j:Integer;
begin
i:=Width Div2;
j:=Heigh Div2;
SetColor(Color);
Rectangle(x-i,y-j,x+i,y+j);
end;
procedure TRectangle.Clear;
var
i,j:Integer;
begin
i:=Width Div2;
j:=Heigh Div2;
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 thenbegin
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:=1to150docase Random(2) of0:{Точку} 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;
whilenot KeyPressed dofor i:=1to150do
a[i]^.Move; {Хаотично перемещаем объект}
ReadKey;
{Уничтожаем объект}for i:=1to150do
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
сори что долго не отвечал, не было доступа к интеренету в это время) а так спасибо, доработаем малек программку)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.