Составить программу в графическом режиме, в которой по наклонной катится окружность.
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);
repeat t:=t+0.1; OrtoCon; until ch='q'; CloseGraph End.{program}
Смотрите "Инь-Ян" на экране. И добро пожаловать в тему "философия и философы-что это по вашему?"
volvo
15.11.2008 2:32
Цитата(Чужак)
Окружность катится по наклонной, а не по прямой, т.е. либо по диагонали (к примеру-сверху вниз,слева направо), либо по некой криволинейной траектории.
Цитата
Наклонной, проведенной из данной точки к данной прямой, называется отрезок, соединяющий данную точку с любой точкой прямой, неявляющейся основанием перпендикуляра, опущенного из этой же точки на данную прямую.
( http://neive.by.ru/geometriia/otr1.html ) Я надеюсь, прямолинейность отрезка (в данном контексте) не оспаривается? Откуда взялась "криволинейная траектория", если не секрет?
Айра
15.11.2008 2:34
Уважаемый, Чужак, надеюсь вы не возражаете, если я приведу ваш код к рабочему виду?
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); //думаю зависит от конкретного компа, так что каждому свое ))
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 ) Я надеюсь, прямолинейность отрезка (в данном контексте) не оспаривается? Откуда взялась "криволинейная траектория", если не секрет?
Автор темы, по-моему, не выразился столь конкретно. В разговорном языке "наклонная" означает "находящаяся под наклоном". Впрочем, пусть автор сам решает, какой вариант ему нужен.
Айра, не возражаю. Кстати, у меня выходил без принуждений.
Айра
15.11.2008 3:01
Цитата
Кстати, у меня выходил без принуждений.
Странно, q ведь нигде не вводится..
repeat t:=t+0.1; OrtoCon; until ch='q';
Может IDE просто сама сбрасывала вечный цикл? тут уж я плохо разбираюсь..
Чужак
15.11.2008 3:06
Цитата(Айра @ 14.11.2008 23:01)
Странно, q ведь нигде не вводится..
repeat t:=t+0.1; OrtoCon; until ch='q';
Может IDE просто сама сбрасывала вечный цикл? тут уж я плохо разбираюсь..
сорри, при копировании забыл одну строчку-
Uses Crt, Graph; Const r1=72; r2=36; Var t:Real; ch:char; gd, gm: integer; { вот эту!!!!! }
Айра
15.11.2008 3:12
Это дела не меняет.. все равно значение 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); //думаю зависит от конкретного компа, так что каждому свое ))
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 окружности.
Добавлено через 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 это.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.