Необходимо обеспечить полет точек к центру по спирали, с различной скоростью — Pascal(Паскаль)

uses crt,graph;
const nmax=1000;
type point=record
           x,y,k:longint;
           c:integer;
           n,r,ht,hr,t:real;
           end;
     tch=array[1..nmax] of point;
var gd,gm:integer;
    xc,yc:longint;
    xx,yy:longint;
    a:array[1..nmax] of point;
    z,i,j,maxk,n,d:integer;
    u:real;
    c:char;
begin
clrscr;
randomize;
write('Kolichestvo tochek n=');
readln(n);
repeat
write('Zaderzka v mls(1-20) z=');
readln(z);
until z in [1..20];
gd:=0;
initgraph(gd,gm,'');
xc:=getmaxx div 2;
yc:=getmaxY div 2;
setcolor(12);
setfillstyle(1,15);
bar(0,0,getmaxX,20);
outtextXY(xc-30,5,'Abort any key...');
for i:=1 to n do
 begin
  repeat
  a[i].x:=random(2*yc);
  a[i].y:=random(2*yc);
  until sqrt(sqr(xc-a[i].x)+sqr(yc-a[i].y))<yc-20;
  a[i].n:=random(5)+1;
  a[i].r:=sqrt(sqr(a[i].x-xc)+sqr(a[i].y-yc));
  a[i].ht:=(random(16)+1)/1000;
  a[i].k:=round(a[i].n*pi*2/a[i].ht);
  a[i].hr:=a[i].r/a[i].k;
  if (abs(xc-a[i].x)<1) then
    begin
     if a[i].y>yc then  a[i].t:=pi/2
     else a[i].t:=3*pi/2;
    end
  else
    begin
     u:=arctan((a[i].y-yc)/(a[i].x-xc));
     if a[i].x<xc then a[i].t:=pi+u
     else a[i].t:=2*pi-u;
    end;
  a[i].c:=random(14)+2;
 end;
maxk:=0;
for i:=1 to n do
if a[i].k>maxk then maxk:=a[i].k;
i:=1;
while (i<=maxk)and not keypressed do
 begin
  delay(z);
  setfillstyle(1,0);
  bar(0,20,getmaxX,getmaxY);
  for j:=1 to n do
   if i<a[j].k then
     begin
      xx:=round(xc+a[j].r*cos(a[j].t));
      yy:=round(yc-a[j].r*sin(a[j].t));
      setcolor(a[j].c);
      circle(xx,yy,1);
      a[j].t:=a[j].t+a[j].ht;
      a[j].r:=a[j].r-a[j].hr;
     end;
  i:=i+1;
 end;
outtextXY(xc-30,yc,'Press any key...');
readkey;
end.

Leave a Comment

+ 56 = 64