Einzelnen Beitrag anzeigen

tar

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

canvas - waagerechter wurf mit timer

  Alt 21. Jun 2007, 10:40
hi leute,

ich hab ne schulaufgabe bekommen, an der ich absolut nicht weiterkomme.

die aufgabe lautet:
stelle mittels canvas einen strahl aus einem loch aus einer defekten wasserleitung dar.
- die lochhöhe, sowie die geschwindigkeit des wassers sind per eingabe vorgegeben.


desweiteren soll festgestellt werden, ob der strahl in einen eimer trifft, dessen position man ebenfalls per eingabe verändern kann.

das ganze sieht derzeit wie folgt aus:

http://www.pro-lamer.net/d32_wl.png

input:
lochhöhe = h
geschwindigkeit = v
eimerposition = e

output:
wurfweite = w

sonst habe ich noch 3 dinge umbenannt:
Form1 = frm
Image1 = img
Timer = tmr

Code:
procedure buildimg (e: Integer);
begin
  clearimg;
  with frm.img.canvas do
  begin
  // Leitung
    brush.color:=$00CCCCCC;
    pen.color:=$00000000;
    rectangle(10,0,20,frm.img.height);
  // Eimer
    brush.color:=$0066FF66;
    pen.color:=$00448844;
    rectangle(20+e,frm.img.height-20,40+e,frm.img.height);
  end;
end;

procedure circle (x,y: Integer);
begin
  with frm.img.canvas do
  begin
  // Loch & Kreise
    brush.color:=$00FF6666;
    pen.color:=$00884444;
    ellipse(x,y,x+5,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<261) and (e>-1) and (v>0) then
  begin
    x:=15;
    y:=frm.img.height-h;

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

end;

procedure Tfrm.tmrTimer(Sender: TObject);
begin
  if (y<frm.img.height) then
  begin
//    y:=y+25;
    y:=y+round((a*x*x/(v*v))/150);
    x:=x+round(v*sqrt((y)/a));
    circle(x,y);
  end
  else
  begin
    w:=x;
    edt_out_w.text:=inttostr(w);
    frm.tmr.enabled:=false;      
  end;
end;
nun habe ich das problem, dass

1. w nicht korrekt ausgegeben wird.
das sieht man ja auf dem bild. der eimer ist 20pixel breit und der letzte wasserkreis sollte ja in dem eimer sein.)

2. ich keine regelmäßigen abstände nach unten habe, da y durch das intervall 150 geteilt wird. wenn ich stattdessen y:=y+25; (was hier auskommentiert ist) festlege, kommt seltsamerweise keine parabel mehr zustande. x wird irgendwie falsch berechnet - ich weiß nicht, warum.

3. der letzte wassertropfen sollte direkt auf dem boden aufkommen, da x aber wie gesagt falsch berechnet wird, kriege ich das nicht hin. ich habe es schon wie folgt ausprobiert:

Code:
procedure Tfrm.tmrTimer(Sender: TObject);
begin
  if (y<frm.img.height) then
  begin
//    y:=y+25;
    y:=y+round((a*x*x/(v*v))/150);
    x:=x+round(v*sqrt((y)/a));
    circle(x,y);
  end
  else
  begin
    y:=frm.img.height-5;
    x:=round(v*sqrt((y)/a));
    w:=x;
    edt_out_w.text:=inttostr(w);
    frm.tmr.enabled:=false;      
  end;
end;
wobei er aber x wieder falsch ausgibt. ich bin hier wirklich am verzweifeln. außerdem frage ich mich, wieso ich das überhaupt in einem timer ausgeben muss (teil der aufgabe).

ich bin echt für jede hilfe dankbar.
  Mit Zitat antworten Zitat