Entwickler-Ecke
Sonstiges (Delphi) - For Schleife mit Extended?
wayne123 - So 28.11.10 22:39
Titel: For Schleife mit Extended?
Hab da ein kleines Problem. Wollte mit Canvas Kurven zeichnen. In meiner Rechnung ist aber eine Dezimalzahl(0,024) und jetzt wollte ich wissen, wie ich mit "i: Extended" "for i:= 1 to 200 do", welches ja nur mit integer funktioniert machen kann. Könnte mi das vielleicht jemand netterweise sagen?
jaenicke - So 28.11.10 22:44
Wie sieht deine Rechnung denn aus?
Du kannst entweder mit i in der Rechnung rechnen oder einfach eine while-Schleife benutzen. ;-)
wayne123 - So 28.11.10 22:48
Ja die Rechnung ist, da ich ja keine Kommazahlen bei Integer benutzen darf, 1 div 50 * i^2+150" und durch das div kommt bei 1 div 50 immer 1 raus, wodurch eine Linie am Ende rauskommt. Wenn ich "i" jetzt zu einer Extended Variable mache, steht da. For Schleifenvariable muss vom ordinalen Typ sein. Mit while wüsste ich gerade nicht, wie man eine quadratische Funktion machen sollte, die dann 100 mal für die x Werte 100 bis 200 rechnen würde.
jaenicke - So 28.11.10 22:52
Dann nimm doch eine normale Division statt einer Integerdivision...
Wenn du eine Integerdivision nutzt, kommen natürlich nur ganze Zahlen heraus.
wayne123 - So 28.11.10 23:08
Dann steht da ja aber, dass Integer und Extended inkompatible Typen sind, weil man ja / bei integer Variabeln doch nicht benutzen kann.
Delete - So 28.11.10 23:11
Wenn du raus gefunden hast, wie man 0,024 Pixel zeichnet, gib mal bitte Bescheid.
wayne123 - So 28.11.10 23:18
Nein, ich rechne ja 3 durch 125 um auf 0,024 zu kommen(bei integer kommt halt 1 raus) und das multipliziere ich dann mit 200 oder solchen großen Zahlen halt, wo dann genau 250 rauskommen soll, was es ja wahrscheinlinlich auch tut, ich möchte halt nur eine kurve.
Delete - So 28.11.10 23:24
In der for-Schleife soll die Kurve gezeichnet werden? Dann berechne die Punkte vorher passend und nicht nachher.
jaenicke - So 28.11.10 23:30
Das Ergebnis musst du dann natürlich noch z.B. runden (Round).
wayne123 - So 28.11.10 23:32
Das sind doch aber 100 Punkte und die soll ich alle vorher ausrechnen. Wenn jetzt z.b. 457,54 als y Koordinate des 2 Punktes rauskommt, dann wird die nicht automatisch gerundet. Ohh man bin ich gerade durcheinander. Also man kann mit einer for Schleife keine Kurven zeichnen, oder wie?
jaenicke - So 28.11.10 23:35
wayne123 hat folgendes geschrieben : |
Wenn jetzt z.b. 457,54 als y Koordinate des 2 Punktes rauskommt, dann wird die nicht automatisch gerundet. |
Warum auch? Wenn du das möchtest, schreib es doch hin. Woher soll der PC "wissen", dass du das möchtest? :nixweiss:
Delete - So 28.11.10 23:35
Dein Programm besteht doch aus zwei Teilen. Im ersten Teil werden die Punkte berechnet und im zweiten wird mit der for-Schleife die Kurve gezeichnet. So, bevor du die Punkte an die Schleife übergibst, rundest du die Punkte auf ganze Werte. Wo ist da jetzt dein Problem?
wayne123 - So 28.11.10 23:37
Ich hab das eher so gemacht
for i:= 100 to 200 do
begin
Canvas.LineTo(i,[quadratische Funktion])
end;
darf man das nicht so machen?
jaenicke - So 28.11.10 23:38
Dann mach es doch so. Wenn du im Code auch hinschreibst, dass der Wert gerundet werden soll, dann passiert das auch...
wayne123 - So 28.11.10 23:45
Ja nur das einzige Problem ist halt, dass die quadratische Gleichung mit 0,024 anfängt und mit integer kann ich keine Dezimalzahl darstellen und mit extended funktioniert der Rest nicht mehr.
jaenicke - So 28.11.10 23:47
Für das Zeichnen kannst du mit den Nachkommastellen doch ohnehin nichts anfangen. Deshalb kannst du genau bei der Berechnung des Koordinatenwertes runden. Ich verstehe das Problem nicht. :nixweiss:
wayne123 - So 28.11.10 23:49
wenn ich dann rechne 0,024 * 200 spielt das doch schon eine Rolle.
Delete - So 28.11.10 23:50
Trozdem würde ich das trennen und der Schleife nur eine Liste der zu zeichnenden Pixel übergeben.
Xion - So 28.11.10 23:53
mir qualmt der Kopf :shock:
Zeig doch mal bitte deinen Sourcecode ;) Ich glaub alle reden hier aneinander vorbei
wayne123 - So 28.11.10 23:57
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.Button1Click(Sender: TObject); var i: integer; begin Canvas.MoveTo(0,0); for i:= 0 to 200 do begin sleep(50); Canvas.LineTo(i,(-1 div 50)*(i-150)*(i-150); end; end; end. |
Also, das ist der Teil meines Quelltextes. Das ist jetzt nur ein Testprogramm alleine für eine Kurve. Das mit dem Trunc einfach da reinsetzen funktioniert so nicht und wie man die zu zeichnenden Pixel an Delphi weitergibt weiß ich nicht, aber braucht man dafür dann auch noch eine Schleife.
Moderiert von
Martok: Delphi-Tags eingefügt
jaenicke - So 28.11.10 23:59
Wie schon x mal geschrieben:
Delphi-Quelltext
1:
| Canvas.LineTo(i, Round((-1 / 50) * (i - 150) * (i - 150))); |
Und wo ist jetzt das Problem?
wayne123 - Mo 29.11.10 00:08
Dann kommt jetzt nur oben in der Mitte ein kleiner Strich. Achja ich dachte wir hätten aneinander vorbeigeredet, kam mir irgendwie nicht logisch vor.
Edit: ahh ok, hab das +400 am Ende vergessen, okay danke, funktioniert jetzt, jetzt muss ich das nur noch mit den Zahlen in meinem richtigem Programm variieren, aber das bekomm ich hin. Round bedeutet jetzt, dass nicht direkt beim geteilt rechnen auf 1 sondern erst am Ende auf eine glatte Zahl gerundet wird, oder?
Delete - Mo 29.11.10 00:19
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.Button1Click(Sender: TObject); var i: integer; begin Canvas.MoveTo(510, 100); for i := 0 to 200 do begin Canvas.LineTo(i, (1 div 50) * (i - 150) * (i - 150)); end; end; |
Zeichnet einen schönen Winkel.
bummi - Mo 29.11.10 00:20
ich vermute Du meinst eine der beiden Varianten:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.Button1Click(Sender: TObject); var i: integer; begin Canvas.MoveTo(0,0); for i:= 0 to 300 do begin
Canvas.LineTo(i,height - Round( (i-150)*(i-150) / 50) - 40); end; end; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!