1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Доброго времени суток. Прошу помочь разобраться в одной задаче. Я сделал немного, только теперь мне надо в нее добавить возможность вращения объекта вокруг точки с заданными координатами на заданный угол, и еще эта программа должна продемонстрировать работу ветряной мельницы. ООП довольно-таки сложная тема, я с трудом разобрался с примитивом, а на более сложное не хватило уже. Вот код:
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.
теперь мне надо в нее добавить возможность вращения объекта вокруг точки с заданными координатами на заданный угол
Тебе для этого придется переписать часть программы. Объект должен САМ хранить свои координаты. И не в виде координата X точки, координата Y точки, ширина, высота. А в виде точек. То есть, TPoint представляется одной точкой с координатами X, Y... Треугольник представится массивом из трех таких точек, TRectangle - соответственно - массивом из четырех точек с координатами X, Y... Естественно, придется изменить и отрисовку объектов тоже.
Вот в таком случае вращение любого объекта вокруг заданной точки на заданный угол сведется к 1) "гашению" объекта; 2) стандартному преобразованию координат всех точек, из которых этот объект состоит; 3) "зажиганию" объекта уже с пересчитанными координатами составляющих его точек.
Так что пока переделай ту часть, что у тебя уже есть, а потом продолжим...
Чего молчим? Как только появится что-нибудь интересное - так не отвечают. В общем, вот что получилось. Я специально не стал дорабатывать, можно еще кое-что сделать. Скажем, перед TRotateScene в иерархии воткнуть базовый для него класс - TScene, тогда все будет еще интереснее Но доработка - это уже другое. Комментарии я не стал добавлять, осталось то, что было. Но поскольку код отлаживался в FPC, то кодировка могла сбиться. Методы описаны как Abstract;, поэтому в случае Турбо-Паскаля нужно будет написать пустые "заглушки" для таких методов...