Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Fehlersuche: Canvas (https://www.delphipraxis.net/128763-fehlersuche-canvas.html)

ghostnw 5. Feb 2009 15:59


Fehlersuche: Canvas
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo!

Ich bin relativ ratlos, warum ein kleiner Programmcode, den ich geschrieben habe, sich so verhält. Ich hoffe, ihr könnt mir helfen.
Undzwar habe ich mir zum Ziel gesetzt, eine möglichst reale Bewegung von Objekten zu simulieren. (Das heißt, das Programm soll die Wurfparabeln und die elastischen Stöße berechnen)
Ich habe also einen Timer genommen, und lasse die neuen Positionen immer neu berechnen und mit Canvas zeichnen.
Der Anfang sieht relativ realistisch aus, jedoch nach ca. 8 Sekunden passieren unerwartete Bewegungen,die ich mir nicht erklären kann, bzw. verschwinden auch einfach manche Kreise ganz.

Wenn ihr den Code compiliert, seht ihr sofort, was ich meine, ihr braucht nichts extra einstellen.

Liebe Grüße,
ghostnw

sirius 5. Feb 2009 16:05

Re: Fehlersuche: Canvas
 
Du braucsht das Image nur einmal zu löschen. Nicht bei jedem Schliefendurchlauf.
Delphi-Quellcode:
with Image1.Canvas do begin
 Rectangle(0,0,Image1.Width, Image1.Height); //hier reicht
 for i := 1 to maxObjects do begin
 vx[i] := vx[i];
 vy[i] := vy[i] + g*T ;
 sx[i] := sx[i] + vx[i]*T;
 sy[i] := sy[i] + vy[i]*T;
 Ellipse(ceil(sx[i]-r[i]),ceil(sy[i]-r[i]), ceil(sx[i]+r[i]), ceil(sy[i]+r[i]));
 end;
 end;

 for i := 1 to maxObjects-1 do begin
  for j := i+1 to maxObjects do begin
   if Power((r[i]+r[j]),2) > power((sx[i]-sx[j]),2)+power((sy[i]-sy[j]),2) then
    begin
    vx1 := vx[i];
    vx2 := vx[j];
    vy1 := vy[i];
    vy2 := vy[j];
    vx[i] := k*(2*m[j]*vx2+(m[i]-m[j])*vx1)/(m[i]+m[j]);
    vx[j] := k*(2*m[i]*vx1+(m[j]-m[i])*vx2)/(m[j]+m[i]);
    vy[i] := k*(2*m[j]*vy2+(m[i]-m[j])*vy1)/(m[i]+m[j]);
    vy[j] := k*(2*m[i]*vy1+(m[j]-m[i])*vy2)/(m[j]+m[i]);
    sx[i] := sx[i] + vx[i]*T;
    sx[j] := sx[j] + vx[j]*T;
    with Image1.Canvas do begin
    //weg mit dem Rechteck
    //Rectangle(0,0,Image1.Width, Image1.Height);
    Ellipse(ceil(sx[i]-r[i]),ceil(sy[i]-r[i]), ceil(sx[i]+r[i]), ceil(sy[i]+r[i]));
    Ellipse(ceil(sx[j]-r[j]),ceil(sy[j]-r[j]), ceil(sx[j]+r[j]), ceil(sy[j]+r[j]));
    end;

    end;
   end;
  end;

  for i := 1 to maxObjects do begin
   if sy[i]+r[i] >= Image1.Height then begin
    vx[i] := vx[i];
    vy[i] := -k*vy[i] + g*T;
    sy[i] := sy[i] + vy[i]*T;
    sx[i] := sx[i] + vx[i]*T;
    if sy[i] + r[i] > Image1.Height then begin
     sy[i] := Image1.Height - r[i];
    end;
    with Image1.Canvas do begin
    //und das hier auch
    //Rectangle(0,0,Image1.Width, Image1.Height);
    Ellipse(ceil(sx[i]-r[i]),ceil(sy[i]-r[i]), ceil(sx[i]+r[i]), ceil(sy[i]+r[i]));
    end;
   end;
  end;

end;

ghostnw 5. Feb 2009 16:12

Re: Fehlersuche: Canvas
 
Achja, so ein Mist... da hätt ich auch selbst draufkommen können. Danke dir =)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz