Einzelnen Beitrag anzeigen

tar

Registriert seit: 21. Jun 2007
5 Beiträge
 
Delphi 2005 Architect
 
#9

Re: canvas - waagerechter wurf mit timer

  Alt 22. Jun 2007, 09:11
ja nikolas, ich habe ganz einfach y nicht mit der höhe gleichgesetzt, sondern mit den bild-koordinaten (also 300-höhe), was ja nicht funktionieren konnte und so hat er immer falsch gerechnet. ich musste die koordinaten später beim kreismalen nur anpassen und nun klappts.

also, ich habe die berechnung jetzt hinbekommen, allerdings immer noch ein problem:

es gibt nun die 2 formeln:

x = v * t
y = g/2 * t²

daraus ergibt sich für die zeit:

t = x / v
t = sqrt(2*y/g)

daraus ergeben sich für x und y:

x = v * sqrt(2*y/g)
y = g/2 * x*x / (v*v)

hiermit wird die zeit einfach nicht mehr benötigt!

demzufolge ergibt sich nun folgender code:

Delphi-Quellcode:
procedure circle (x,y: Real);
begin
  with frm.img.canvas do
  begin
  // Loch & Kreise
    brush.color:=$00FF6666;
    pen.color:=$00884444;
    ellipse(round(x),frm.img.height-round(y),round(x)+5,frm.img.height-round(y)+5);
  end;
end;

procedure Tfrm.Button1Click(Sender: TObject);
begin
// Eingabe
  a:=9.81/2;
  h:=strtoint(edt_in_h.text);
  v:=strtofloat(edt_in_v.text);
  e:=strtoint(edt_in_e.text);

  if (h<300) and (h>-1) and (e<281) and (e>19) and (v>0) then
  begin
    i:=0;
    x:=15;
    y:=h;

    buildimg(e);
    circle(x,y);
    frm.tmr.enabled:=true;
  end
  else
  edt_out_w.text:='Eingaben falsch!';
end;

procedure Tfrm.tmrTimer(Sender: TObject);
begin
  if (y>5) then // Versuch, abzufangen
  begin
    y:=y-((a * x*x / (v*v))/frm.tmr.interval);
    x:=x+((v * sqrt(y/a))/frm.tmr.interval);
    circle(x,y);
  end
  else
  begin
    w:=round(x);
    if (w>e-1) and (w<e+21) then
    begin
      edt_out_w.text:=inttostr(w)+' Treffer!';
      frm.tmr.enabled:=false;
    end
    else
    begin
      edt_out_w.text:=inttostr(w)+' Daneben!';
      frm.tmr.enabled:=false;
    end;
  end;
end;
das problem ist nun, dass das programm y irgendwie nicht immer rechtzeitig abfangen kann und dann einen fehler erzeugt:

"invaliding float point operation." und auf diese zeile verweist:

Delphi-Quellcode:
y:=y-((a * x*x / (v*v))/frm.tmr.interval);
x:=x+((v * sqrt(y/a))/frm.tmr.interval); // <-- diese
nur habe ich das aber doch schon abgefangen mit y>5, so dass er gar nicht "über den bildrand" darf?
und wieso kann er nicht mit y<5 rechnen? selbst wenn y negativ wär? den kreis würde man ja eh nicht mehr sehen.
  Mit Zitat antworten Zitat