Спутник вращается вокруг земли, при нажатии кнопки, он переходит в эллипсоидную орбиту - PascalABC.NET
Формулировка задачи:
Доброго времени суток. Хотел попросить помощи с задачками, похожих не нашел, создал тему. Заранее спасибо!
Задача 2. Анимация: «Спутник вращается вокруг земли, при нажатии кнопки, он переходит в эллипсоидную орбиту, относительно той точки в которой находится.» (т.е. начать двигаться по наклонному эллипсу, из той точки в которой он находится). У меня получилось только так:
Решение задачи: «Спутник вращается вокруг земли, при нажатии кнопки, он переходит в эллипсоидную орбиту»
textual
Листинг программы
uses graphABC,crt; var x,y,x1,y1,n,x2,y2, k:integer; ox, oy, oz: real; u:real; //движение по эллипсам procedure DvOsX(var x,y,x1,y1,x2: integer; u:real); begin repeat delay(50); setpencolor(clWhite); circle(x2,y1,10); u:=u+0.04; setpencolor(clRed); x2:=2*x-x1+round(200*cos(u)); y1:=y-round(150*sin(u)); circle(x2,y1,10); FloodFill(x2,y1,clblack) ; textout(20,370,'Нажмите "Enter" для запуска двигателей'); until k=1000 end; procedure DvOsY(var x,y,x1,y1,y2: integer; u:real); begin repeat delay(50); setpencolor(clWhite); circle(x1,y2,10); u:=u+0.04; setpencolor(clRed); x1:=x+round(150*cos(u)); y2:=2*y-y1-round(200*sin(u)); circle(x1,y2,10); FloodFill(x1,y2,clblack) ; {цвет спутника} textout(20,370,'Нажмите "Enter" для запуска двигателей'); until k=1000 end; procedure DvOsi(var x,y,x1,y1,x2,y2: integer; u:real); begin repeat delay(50); setpencolor(clWhite); circle(x2,y2,10); u:=u+0.04; setpencolor(clRed); x2:=2*x-x1+round(200*cos(u)); y2:=2*y-y1-round(200*sin(u)); circle(x2,y2,10); FloodFill(x2,y2,clblack); textout(20,370,'Нажмите "Enter" для запуска двигателей'); until k=1000 end; begin //описание картинки textout(20,370,'Нажмите "Enter" для запуска двигателей'); circle(320,200,75); {Земля} FloodFill(320,200,clskyblue) ; {цвет земли} hidecursor; x:=320; y:=200; u:=0; setpencolor(clRed); x1:=x+round(100*cos(u)); y1:=y-round(100*sin(u)); //если поменять синус и косинус, вращение в другую сторону circle(x1,y1,10); FloodFill(x1,y1,clblack) ; {цвет спутника} repeat delay(50); setpencolor(clWhite); circle(x1,y1,10); u:=u+0.04; setpencolor(clRed); x1:=x+round(100*cos(u)); y1:=y-round(100*sin(u)); circle(x1,y1,10); FloodFill(x1,y1,clblack) ; {цвет спутника} until keypressed; hidecursor; //замазка setpencolor(clWhite); circle(x1,y1,10); //выход на нужную ось oz:= 7800; ox:= Sqr(x-x1); oy:= Sqr(y-y1); if (ox > oy) and ( ox > oz) then DvOsX (x,y,x1,y1,x2,u) else if (ox < oy) and (oy > oz) then DvOsY (x,y,x1,y1,y2,u) else DvOsi (x,y,x1,y1,x2,y2,u) end.
Объяснение кода листинга программы
- В этом коде спутник движется по эллиптической орбите вокруг Земли.
- При нажатии кнопки
Enter
двигатели спутника включаются. - Синяя точка на экране представляет Землю, а красная точка - спутник.
- Цвет спутника устанавливается через переменную
clblack
. - Движение спутника можно изменить, поменяв значения синуса и косинуса в функциях
DvOsX
,DvOsY
иDvOsi
. - Вращение спутника происходит против часовой стрелки, если смотреть сверху на Землю.
- Для выхода на нужную ось используется функция
DvOsi
. - Значения переменных
ox
,oy
иoz
используются для определения текущего положения спутника относительно Земли. - Если расстояние от спутника до Земли по оси X больше, чем по оси Y и Z, то выполняется функция
DvOsX
. - Если расстояние от спутника до Земли по оси X меньше, чем по оси Y, но больше, чем по оси Z, то выполняется функция
DvOsY
. - Во всех остальных случаях выполняется функция
DvOsi
.