На одном из прошлых уроков мы строили графики функций. А как мы заставляли точку двигаться по синусоиде? Создавали цикл, в котором координата Х точки изменялась как параметр цикла, а координата Y точки менялась как синус от Х. А если координату Х заставить изменяться с использованием функции COS от параметра цикла? Если вы хорошо знаете математику, то должны догадаться, что точка будет двигаться по окружности.
Для эксперимента давайте возьмем программу-образец для построения графиков функций, поставим в цикл окружность, у которой координаты центра Х и Y зависят от SIN и COS.
Program planeta; Uses Graph; Var Gd, Gm : SmaLLInt; x, A, B, C: integer; Begin Gd:=Detect; InitGraph(Gd,Gm,''); A:=100; B:=80; C:=20; for x:= 0 to 1000 do Circle(round(A*cos(x/B))+GetMaxX div 2, round(A*sin(x/B))+GetMaxY div 2,14); Readln; CloseGraph; End. |
А как сделать так, чтобы окружность не оставляла след? Это стандартное действие для анимации: прежде чем нарисовать объект в новой позиции нужно его удалить из старой. Можно конечно сразу после нарисованной нами окружности установить черный цвет и заново нарисовать такую же окружность, но окружность будет исчезать очень быстро. Лучше, если мы стирающую окружность (рисуется цветом 0 в координате х-1) будем рисовать в начале цикла, а рисующую за ней.
Program planeta; Uses Graph; Var Gd, Gm : SmaLLInt; x, A, B, C: integer; Begin Gd:=Detect; InitGraph(Gd,Gm,''); A:=100; B:=80; C:=20; for x:= 0 to 1000 do begin Setcolor (0); Circle(round(A*cos((x-1)/B))+GetMaxX div 2, round(A*sin((x-1)/B))+GetMaxY div 2,14); Setcolor (14); Circle(round(A*cos(x/B))+GetMaxX div 2, round(A*sin(x/B))+GetMaxY div 2,14); end; Readln; CloseGraph; End. |
Program planeta; Uses Graph, CRT; Var Gd, Gm : SmaLLInt; x, A, B, C: integer; Begin Gd:=Detect; InitGraph(Gd,Gm,''); A:=100; B:=80; C:=20; for x:= 0 to 1000 do begin Setcolor (0); Circle(round(A*cos((x-1)/B))+GetMaxX div 2, round(A*sin((x-1)/B))+GetMaxY div 2,14); Setcolor (14); Circle(round(A*cos(x/B))+GetMaxX div 2, round(A*sin(x/B))+GetMaxY div 2,14); delay(50); end; Readln; CloseGraph; End. |
Уровень А: Венера вращается вокруг Солнца по часовой стрелке.
Уровень В: Венера (по часовой стрелке) и Земля (против часовой стрелки) вращаются вокруг Солнца.
Уровень С: Венера (по часовой стрелке), Земля (против часовой стрелки) вращаются вокруг Солнца. Луна вращается вокруг Земли.
program sunsystem;
{Сидоров Никита, солнечная система}
uses graph, crt;
var Gd, Gm: smallint;
a, b, c, d, e: integer;
begin
Gd:= detect;
initgraph(Gd,Gm,'');
setcolor(0); setfillstyle(1, 14);
fillellipse(getmaxx div 2, getmaxy div 2, 50, 50);
a:= 100; b:= 60; c:= 150; d:= 25;
for e:= 0 to 1000 do begin
setfillstyle(1, 0);
fillellipse(round(a * cos((e - 1)/b)) + getmaxx div 2, round(a * sin((e - 1)/b)) + getmaxy div 2, 15, 15);
fillellipse(round(d * (cos((-e + 1)/b)) + round(c * (cos((-e + 1)/b))) + getmaxx div 2), round(d * sin((-e + 1)/b)) + round(c * sin((-e + 1)/b)) + getmaxy div 2, 5, 5);
setcolor(0); setfillstyle(1, 6);
fillellipse(round(a * cos(e/b)) + getmaxx div 2, round(a * sin(e/b)) + getmaxy div 2, 15, 15);
setfillstyle(1, 9); setfillstyle(1, 7);
delay(50);
end;
readln;
closegraph;
end.
Uses Graph, CRT;
Var Gd, Gm : SmaLLInt;
x, A, B, C, B1, A1, B2, A2: integer;
Begin
Gd:=Detect;
InitGraph(Gd,Gm,'');
A:=100;
B:=80;
C:=20;
B1:=-80;
A1:=170;
B2:=80;
A2:=250;
setcolor(0);
SetFillStyle(1, 14);
FillEllipse(GetMaxX div 2, GetMaxY div 2, 50, 50);
for x:= 0 to 1000 do begin
setcolor(0);
Setfillstyle(1,0);
Fillellipse(round(A*cos((x-1)/B))+GetMaxX div 2, round(A*sin((x-1)/B))+GetMaxY div 2,14,14);
setfillstyle(1,8) ;
Fillellipse(round(A*cos(x/B))+GetMaxX div 2, round(A*sin(x/B))+GetMaxY div 2,14,14);
setcolor(0);
Setfillstyle(1,0);
Fillellipse(round(A1*cos((x-1)/B1))+GetMaxX div 2, round(A1*sin((x-1)/B1))+GetMaxY div 2,25,25);
setfillstyle(1,6) ;
Fillellipse(round(A1*cos(x/B1))+GetMaxX div 2, round(A1*sin(x/B1))+GetMaxY div 2,25,25);
setcolor(0);
Setfillstyle(1,0);
Fillellipse(round(A2*cos((x-1)/B2))+GetMaxX div 2, round(A2*sin((x-1)/B2))+GetMaxY div 2,25,25);
setfillstyle(1,3) ;
Fillellipse(round(A2*cos(x/B2))+GetMaxX div 2, round(A2*sin(x/B2))+GetMaxY div 2,25,25);
delay(70);
end;
Readln;
CloseGraph;
End.