Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Движение предметов

Автор: Spaun 14.11.2008 11:57

Составить программу в графическом режиме, в которой по наклонной катится окружность.


program speed;
uses crt, graph;
var
gd,gm:integer;
begin
gd:=VGA;
gm:=VGAhi;
initgraph (gd,gm,'C:\BP\BGI');
if graphresult =grOk then
begin
line (0,0,639,479);
circle (15,20,15);
...
end;
end.



Вот на что меня хватило, может кто подскажет как сделать иллюзию движения

Автор: volvo 14.11.2008 14:01

Цитата
может кто подскажет как сделать иллюзию движения
Сделать рисование окружности в цикле... Ну, например, чтобы окружность двигалась из левого верхнего в правый нижний угол, можно сделать:
x := 0;				{ начинаем с X = 0 }
while x < 640 do begin { пока не выйдем за пределы экрана }
line (0,0,639,479); { рисуем линию, по которой "катится" откужность }
circle (x, (3 * x) div 4, 15); { и саму окружность }
x := x + 10; { На следующем шаге будем рисовать правее }
delay(1000); { Сохраняем рисунок какое-то время на экране }
cleardevice; { А потом чистим экран и переходим к следующей итерации }
end;

Теперь о том, почему (3 * x) div 4: все очень просто - разрешение экрана 640*480, то есть, длина относится к высоте (X к Y) как 640/480 = 4/3... У нас есть X. Надо получить Y. Если X/Y = 4/3, то Y = 3*x/4, но деление должно быть целочисленным, поэтому используем div... Если тебе нужно движение НЕ из одного угла в другой - придётся заводить ещё одну переменную - Y - и изменять её там же, где и X...

Автор: Чужак 15.11.2008 2:04

Уважаемый volvo, по моему, условие содержит два варианта:

Цитата(Spaun @ 14.11.2008 7:57) *

Составить программу в графическом режиме, в которой по наклонной катится окружность.
....
Вот на что меня хватило, может кто подскажет как сделать иллюзию движения


Окружность катится по наклонной, а не по прямой, т.е. либо по диагонали
(к примеру-сверху вниз,слева направо), либо по некой криволинейной траектории. Если по диагонали-то ваш вариант верен, если по криволинейной, приведу свой.


Uses Crt, Graph;
Const r1=72; r2=36;
Var t:Real;
.........
Procedure OrtoCon;
Begin {procedure}
Setcolor(5);
Circle(120,80,r1);

Setcolor(7);
Circle(Round(120+r2*cos(t)), Round(80+r2*sin(t)),r2);
Circle(Round(120-r2*cos(t)), Round(80-r2*sin(t)),r2);
Delay(1000);

Setcolor(0);
Circle(Round(120+r2*cos(t)), Round(80+r2*sin(t)),r2);
End;{procedure}

Begin {program}
InitGraph(gd,gm,''); t:=0;

repeat
t:=t+0.1;
OrtoCon;
until ch='q';
CloseGraph
End.{program}


Смотрите "Инь-Ян" на экране. blum.gif
И добро пожаловать в тему "философия и философы-что это по вашему?" cool.gif

Автор: volvo 15.11.2008 2:32

Цитата(Чужак)
Окружность катится по наклонной, а не по прямой, т.е. либо по диагонали
(к примеру-сверху вниз,слева направо), либо по некой криволинейной траектории.
Цитата
Наклонной, проведенной из данной точки к данной прямой, называется отрезок, соединяющий данную точку с любой точкой прямой, неявляющейся основанием перпендикуляра, опущенного из этой же точки на данную прямую.
( http://neive.by.ru/geometriia/otr1.html ) Я надеюсь, прямолинейность отрезка (в данном контексте) не оспаривается? Откуда взялась "криволинейная траектория", если не секрет?

Автор: Айра 15.11.2008 2:34

Уважаемый, Чужак, надеюсь вы не возражаете, если я приведу ваш код к рабочему виду? wink.gif

Uses Crt, Graph, wincrt;
Const r1=72; r2=36;
Var t:Real;
gd,gm: integer;
Procedure OrtoCon;
Begin {procedure}
Setcolor(5);
Circle(120,80,r1);

Setcolor(7);
Circle(Round(120+r2*cos(t)), Round(80+r2*sin(t)),r2);
Circle(Round(120-r2*cos(t)), Round(80-r2*sin(t)),r2);
Delay(100); //думаю зависит от конкретного компа, так что каждому свое ))

Setcolor(0);
Circle(Round(120+r2*cos(t)), Round(80+r2*sin(t)),r2);
End;{procedure}

Begin {program}
gd:=VGA;
gm:=VGAhi;
InitGraph(gd,gm,''); t:=0;
repeat
t:=t+0.1;
OrtoCon;
until keypressed; { выполнение закончится, когда будет нажата любая клавиша,
в предыдущем варианте приходилось завершать принудительно }
while heypressed do readkey; //очищаем буфер клавиатуры
CloseGraph
End.{program}

Автор: Чужак 15.11.2008 2:56

Цитата(volvo @ 14.11.2008 22:32) *

( http://neive.by.ru/geometriia/otr1.html ) Я надеюсь, прямолинейность отрезка (в данном контексте) не оспаривается? Откуда взялась "криволинейная траектория", если не секрет?

Автор темы, по-моему, не выразился столь конкретно. В разговорном языке "наклонная" означает "находящаяся под наклоном". Впрочем, пусть автор сам решает, какой вариант ему нужен. cool.gif

Айра, не возражаю. give_rose.gif
Кстати, у меня выходил без принуждений.

Автор: Айра 15.11.2008 3:01

Цитата
Кстати, у меня выходил без принуждений.

Странно, q ведь нигде не вводится..
 repeat
t:=t+0.1;
OrtoCon;
until ch='q';

Может IDE просто сама сбрасывала вечный цикл? wink.gif тут уж я плохо разбираюсь..

Автор: Чужак 15.11.2008 3:06

Цитата(Айра @ 14.11.2008 23:01) *

Странно, q ведь нигде не вводится..
 repeat
t:=t+0.1;
OrtoCon;
until ch='q';

Может IDE просто сама сбрасывала вечный цикл? wink.gif тут уж я плохо разбираюсь..

сорри, при копировании забыл одну строчку-

Uses Crt, Graph;
Const r1=72; r2=36;
Var t:Real;
ch:char; gd, gm: integer; { вот эту!!!!! }


Автор: Айра 15.11.2008 3:12

no1.gif Это дела не меняет.. все равно значение ch нигде не изменяется, а если делать ввод через readln в цикле, то будет очень некрасиво..

Автор: Spaun 30.11.2008 20:19

Цитата(Айра)


Uses Crt, Graph, wincrt;
Const r1=72; r2=36;
Var t:Real;
gd,gm: integer;
Procedure OrtoCon;
Begin {procedure}
Setcolor(5);
Circle(120,80,r1);

Setcolor(7);
Circle(Round(120+r2*cos(t)), Round(80+r2*sin(t)),r2);
Circle(Round(120-r2*cos(t)), Round(80-r2*sin(t)),r2);
Delay(100); //думаю зависит от конкретного компа, так что каждому свое ))

Setcolor(0);
Circle(Round(120+r2*cos(t)), Round(80+r2*sin(t)),r2);
End;{procedure}

Begin {program}
gd:=VGA;
gm:=VGAhi;
InitGraph(gd,gm,''); t:=0;
repeat
t:=t+0.1;
OrtoCon;
until keypressed; { выполнение закончится, когда будет нажата любая клавиша,
в предыдущем варианте приходилось завершать принудительно }
while heypressed do readkey; //очищаем буфер клавиатуры
CloseGraph
End.{program}





программа делает совсем не то окружность просто зацикливается и крутится на одном месте, причем внутри неевращаются еще 2 окружности. sad.gif

Добавлено через 18 мин.
Цитата(volvo)


x := 0; { начинаем с X = 0 }
while x < 640 do begin { пока не выйдем за пределы экрана }
line (0,0,639,479); { рисуем линию, по которой "катится" откужность }
circle (x, (3 * x) div 4, 15); { и саму окружность }
x := x + 10; { На следующем шаге будем рисовать правее }
delay(1000); { Сохраняем рисунок какое-то время на экране }
cleardevice; { А потом чистим экран и переходим к следующей итерации }
end;




Не знаю почему но не работает, мерцает курсор и все.

Автор: volvo 30.11.2008 20:46

Цитата
Не знаю почему но не работает, мерцает курсор и все.
Не знаю, почему (и главное - ЗАЧЕМ), но я все программы проверяю прежде чем выложить... Странно, да? Правила Раздела - обычно для того, чтобы их соблюдать, а не для того, чтоб они там были в красивой рамочке:
Цитата(Правила Раздела "Задачи")
7. Проверяйте программы перед тем, как разместить их на форуме!!!
Так вот у меня все отработало. Если у тебя не работает - значит, что-то делал не так. Приводи программу полностью, и название компилятора тоже (а то BP\BGI наводит на некоторые подозрения)

Автор: Айра 30.11.2008 20:56

Цитата
программа делает совсем не то окружность просто зацикливается и крутится на одном месте, причем внутри неевращаются еще 2 окружности.

Тебе это как вариант предложили..

Цитата
Не знаю почему но не работает, мерцает курсор и все.

У меня код volvo работает нормально..


Автор: Spaun 30.11.2008 21:12

Чисто логически код составлен правильно, наверное это у меня что-то с паскалем другого быть не может.
Может ктонибудь даст ссылку на нормальный паскаль а то уже замучился скачивать. Заранее благодарен!

Автор: Айра 30.11.2008 21:22

выложи весь свой код.. может где-то допустил вне этого кусочка ошибки.. и какой компилятор то у тебя?

Автор: Spaun 30.11.2008 21:35

Вот полный код программы:


program speed;
uses crt,graph;
var gd,gm,x:integer;
begin
gd:=VGA;
gm:=VGahi;
initgraph(gd,gm,'');
x := 0;
while x < 640 do begin
line (0,0,639,479);
circle (x, (3 * x) div 4, 15);
x := x + 10;
delay(1000);
cleardevice;
end;
closegraph;
readkey;
end.


Не работае мерцает курсор в верхнем левом углу и все.
Компилятор из tp7 вроде...
У кого не спрашивал говорят работает, возможно это проблемы с компилятором, но как их решить? если кто может выложите пожалуйста рабочий код.

Автор: Lapp 1.12.2008 18:25

Цитата(Spaun @ 30.11.2008 17:35) *
Не работае мерцает курсор в верхнем левом углу и все.
Компилятор из tp7 вроде...
У кого не спрашивал говорят работает, возможно это проблемы с компилятором, но как их решить? если кто может выложите пожалуйста рабочий код.
Код - рабочий, тебе уже несколько раз сказали.
С компилятором тоже все должно быть ок, если остальные проги работают.
Такое (мигающий курсор) может быть, если программа слишком быстро проскакивает (быстрее, чем твой монитор переключается в граф. моду), и срабатывает CloseGraph. Попробуй сделать следующее:

1. Переставь местами ReadKey и CloseGraph. Это вообще, надо сказать, нонсенс, выполнять задержку после закрытия графики. Что ты собирался увидеть? Надо задерживать ДО выхода из графики.

2. Переставь ClearDevice в НАЧАЛО цикла (сразу за while). Иначе ты все сотрешь и все равно ничего не увидишь.

3. Увеличь задержку. Хотя, она у тебя и так большая, но все же увеличь. Сделай 10000 вместо 1000.

А прежде всего, вообще-то, стоит убедиться, что у тебя графика включается. Судя по всему - да (в других прогах ты что-то видишь, и экран чистый - да?), но все же double check это.