IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Модуль GRAPH., Движение объектов.
Psychologist
сообщение 18.03.2008 19:56
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 37
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Добрый вечер.
Вот задача: нарисовать и анимировать неск. объектов. (ну вообще-то задача намного длиннее, но не суть...).
Код программы:
Program Lab_09;
Uses
GRAPH, CRT;
Type
TPoint=object
x , y : Integer;
ox, oy : Integer;
color : Word;
R : Integer;
alpha : Real;
step : Real;
Procedure Show;
Procedure Hide;
Procedure Move;
end;

Procedure TPoint.Show;
Begin
putPixel (x, y, color);
end;

Procedure TPoint.Hide;
Begin
putPixel (x, y, black);
end;

Procedure TPoint.Move;
Begin
Hide;
if (abs(alpha)>=180) or (abs(alpha)<=0) then step:=step*(-1);
alpha:=alpha+step;
x:=round (cos(alpha*Pi/180)*R)+ox;
y:=round (sin(alpha*Pi/180)*R)+oy;
Show;
end;

Var
P1, P2, P3, C1, C2 : TPoint;
a : Integer;
grDr, grMode : Integer;
Begin
grDr:=detect;
grMode:=0;
InitGraph (grDr, grMode, '');

Line (000,240,640,240);
Line (214,000,214,240);
Line (426,000,426,240);
Line (320,240,320,480);
Rectangle (1,1,639,479);

P1.R:=75;
P1.ox:=110; P1.oy:=120;
P1.step:=0.5;
P1.color:=yellow;
P1.Show;

P2.R:=95;
P2.ox:=320; P2.oy:=120;
P2.step:=-0.5;
P2.color:=green;
P2.Show;

P3.R:=55;
P3.ox:=530; P3.oy:=120;
P3.step:=0.3;
P3.color:=white;
P3.Show;

Repeat
P1.Move;
P2.Move;
P3.Move;
Delay (1000);
Until KeyPressed;

closeGraph;
End.

Скачать исходник можно здесь: http://narod.ru/disk/11290000/LAB_09.PAS

Проблема заключается в том, что траектория движение точек - дуга. Программа, после каждого перемещения смотрит: не достигла ли точка 0 или 180 градусов. И если точка доехала до указанных углов, то начинается обратное действие. Всё вроде норм. Только последний объект почему-то "разворачивается" только при 180 градусах, а при 0 - нет. Скажите, в чём ошибка?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 18.03.2008 20:55
Сообщение #2


Гость






Во-первых, ты не инициализировал поле Angle, а во-вторых, лучше:
...
if (abs(alpha)>=180) or (abs(alpha)<abs(step)) then step:=step*(-1);
...

 К началу страницы 
+ Ответить 
Psychologist
сообщение 18.03.2008 21:02
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 37
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


volvo, Огромное спасибо! IF исправил. (Angle - у меня это alpha).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 18.03.2008 21:17
Сообщение #4


Гость






Ну, какая разница. Оно у тебя все равно не инициализировано. А надо бы, это источник ошибок... Кстати, у тебя тема-то какая? ООП или графика? Ибо если ООП - то я бы не принял такую программу: основной принцип ООП нарушен.
 К началу страницы 
+ Ответить 
Psychologist
сообщение 18.03.2008 21:24
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 37
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


ООП, конечно. Но сдавать, слава Богу, не завтра. Я ещё доработаю, как виртуальные методы (сли ты по поводу 3-х кратного описания точек).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 18.03.2008 21:29
Сообщение #6


Гость






Нет, я по поводу отсутствия инкапсуляции... Вот этого:
Цитата
   P1.R:=75;
P1.ox:=110; P1.oy:=120;
P1.step:=0.5;
P1.color:=yellow;
быть не должно. К полям объекта должны иметь доступ только методы объекта.
 К началу страницы 
+ Ответить 
Psychologist
сообщение 19.03.2008 19:12
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 37
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Продолжение... rolleyes.gif
Теперь (по идее) должна появиться окружность в нижнем прямоугольнике и действовать так же, как точки (двигаться по дуге, менять направление при 0 и 180 градусах).
Я сделал вот так, ничего не изменилось:
Program Lab_09;
Uses
GRAPH, CRT;
Type
TPoint=object
x , y : Integer;
ox, oy : Integer;
color : Word;
R : Integer;
alpha : Real;
step : Real;
Procedure Show;
Procedure Hide;
Procedure Move;
end;

TCircle=object (TPoint)
RCirc : Integer;
Procedure Show;
Procedure Hide;
end;

{//--------------------TPoint-------------------//}
Procedure TPoint.Show;
Begin
putPixel (x, y, color);
end;

Procedure TPoint.Hide;
Begin
putPixel (x, y, black);
end;

Procedure TPoint.Move;
Begin
Hide;
if (abs(alpha)>=180) or (abs(alpha)<abs(step)) then step:=step*(-1);
alpha:=alpha+step;
x:=round (cos(alpha*Pi/180)*R)+ox;
y:=round (sin(alpha*Pi/180)*R)+oy;
Show;
end;
{//------------------END_TPoint-----------------//}

{//-------------------TCircle-------------------//}
Procedure TCircle.Show;
Begin
Circle (ox, oy, RCirc);
end;

Procedure TCircle.Hide;
Begin
SetColor (black);
Circle (ox, oy, RCirc);
end;
{//-----------------END_TCircle-----------------//}

Var
P1, P2, P3, C1, C2 : TPoint;
a : Integer;
grDr, grMode : Integer;
Begin
{//--------------------GRAPH--------------------//}
grDr:=detect;
grMode:=0;
InitGraph (grDr, grMode, '');
{//------------------END_GRAPH------------------//}

{//--------------------TABLE--------------------//}
SetColor (green);
Line (000,240,640,240);
Line (214,000,214,240);
Line (426,000,426,240);
Line (320,240,320,480);
Rectangle (1,1,639,479);
{//------------------END_TABLE------------------//}

SetColor (white);

{//-------------------PIXELES-------------------//}
P1.R:=75;
P1.ox:=110; P1.oy:=120;
P1.step:=0.5;
P1.color:=yellow;
P1.Show;
OutTextXY (20, 220, 'R=75 | Step=0.5');

P2.R:=95;
P2.ox:=320; P2.oy:=120;
P2.step:=-0.5;
P2.color:=green;
P2.Show;
OutTextXY (234, 220, 'R=95 | Step=-0.5');

P3.R:=55;
P3.ox:=530; P3.oy:=120;
P3.step:=0.3;
P3.color:=white;
P3.Show;
OutTextXY (446, 220, 'R=55 | Step=0.3');
{//-----------------END_PIXELES-----------------//}

{//-------------------CIRCLES-------------------//}
C1.R:=75;
C1.ox:=160; C1.oy:=360;
C1.step:=0.5;
SetColor (red);
C1.Show;

Repeat
P1.Move;
P2.Move;
P3.Move;
C1.Move;
Delay (1000);
Until KeyPressed;

closeGraph;
End.

В чём ошибка?

Сообщение отредактировано: Psychologist - 19.03.2008 19:13
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 19.03.2008 19:30
Сообщение #8


Гость






Во-первых, C1 и C2 - это окружности, а значит - тип TCircle... А во-вторых - для того, чтобы вызвать из метода предка (Move) метод потомка (Hide/Show), надо использовать виртуальные функции, иначе будут вызываться одноименные методы объекта того же уровня, из которого вызывается Move...

P.S. Не забудь про конструкторы, иначе будут проблемы. yes2.gif
 К началу страницы 
+ Ответить 
Psychologist
сообщение 19.03.2008 19:47
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 37
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


volvo, ещё раз СПС!
Про тип, конечно, забыл, а вот с виртуальными методами прйдётся сейчас повозиться...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 4.06.2024 21:17
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"