Avatar billede stefmeister Nybegynder
04. september 2004 - 18:00 Der er 10 kommentarer og
1 løsning

Bevæge sig i cirkel

Hej

Jeg har sat en Shape på min form, der forstiller en cirkel.

Den lille cirkel kunne jeg godt tænke mig at få til at gå i ring. Altså at den køre rundt på skærmen i en cirkel. Jeg skal bruge den som sekundviser i et ur.
Avatar billede jonat Nybegynder
04. september 2004 - 23:55 #1
hehe... 2 sek... :D

// Jonat.
Avatar billede jonat Nybegynder
05. september 2004 - 00:10 #2
procedure TForm1.Timer1Timer(Sender: TObject);
var
  x,y : real; Grad : integer;
begin
  y := (Form1.Height div 2) + Sin(Grad)*10-(Shape1.Height div 2);
  x := (Form1.Width div 2) + Cos(Grad)*10-(Shape1.Width div 2);
  Shape1.Left := round(x) - (Shape1.Width div 2);
  Shape1.Top := round(y) - (Shape1.Height div 2);
  inc(grad);
end;

// Jonat.
Avatar billede jonat Nybegynder
05. september 2004 - 00:11 #3
Det skulle havde været et svar
Avatar billede hrc Mester
05. september 2004 - 11:14 #4
Et par smårettelser så virker det.

const
  OneSecond = 360 div 60;

procedure TfrmMain.Timer1Timer(Sender: TObject);
var
  x,y : real;
  Grad : integer;
  h,m,s,s100 : word;
begin
  DecodeTime(now,h,m,s,s100);
  inc(grad,(60 - s) * OneSecond);
  y := (frmMain.Height shr 1) + Sin(Grad)*10-(sCircle.Height shr 1);
  x := (frmMain.Width shr 1) + Cos(Grad)*10-(sCircle.Width shr 1);
  sCircle.Left := round(x) - (sCircle.Width shr 1);
  sCircle.Top := round(y) - (sCircle.Height shr 1);
end;

procedure TfrmMain.Button1Click(Sender: TObject);
begin
  Timer1.Enabled := not Timer1.Enabled;
end;
Avatar billede stefmeister Nybegynder
05. september 2004 - 14:05 #5
jonat -> det virker ikke helt. Der sker ikke så meget.

hrc -> Den kører ikke i en særlig pæn cirkel, og den bruger kun 2-3 sek. på at komme hele vejen rundt. Det skal tage 60 sek.
Avatar billede stefmeister Nybegynder
05. september 2004 - 14:36 #6
aarh... havde ikke lige set Const OneSecond etc.

Men den køre stadig for hurtigt rundt.
Avatar billede nico26 Nybegynder
05. september 2004 - 15:55 #7
I skal bare regne i radianer i stedet for grader. Det for øvrigt en god idé at prekalkulere alle positionerne, så man ikke beregner de samme værdier igen og igen

const
  CENTER_X = 200;
  CENTER_Y = 200;
  RADIUS  = 100;

var
  Positions : array[0..59] of TPoint;
  Counter  : Integer;
  Shape    : TShape;

procedure TForm1.FormCreate(Sender: TObject);
var
  i : Integer;
  a : Double;
begin
  Shape := TShape.Create(Form1);
  with Shape do
  begin
    Parent := Form1;
    Shape  := stCircle;
    Width  := 17;
    Height := 17;
  end;

  for i := 0 to 59 do
  begin
    a := i * ((2*Pi)/60);
    Positions[i].x := CENTER_X + Trunc(Cos(a) * RADIUS);
    Positions[i].y := CENTER_Y + Trunc(Sin(a) * RADIUS);
  end;

  Counter := 0;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Shape.Left := Positions[Counter].x;
  Shape.Top  := Positions[Counter].y;

  Inc(Counter);
  if Counter >= 60 then
    Counter := 0;
end;
Avatar billede stefmeister Nybegynder
05. september 2004 - 17:00 #8
nico26 -> det virker. Drop et svar
Avatar billede nico26 Nybegynder
05. september 2004 - 17:04 #9
svar
Avatar billede stefmeister Nybegynder
05. september 2004 - 17:07 #10
takker.
Avatar billede hrc Mester
06. september 2004 - 09:21 #11
Beklager mit fejlende indlæg - sådan går det når konen skælder på en om at der er vigtigere ting at foretage sig (såsom støvsuge, vaske op, ordne papirer og .. aaarrhhh). :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester