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.