| Autor |
Beitrag |
RomanMaschbau
Hält's aus hier
Beiträge: 8
Win ME, Win2000
D6
|
Verfasst: So 02.05.04 12:51
Hallo,
ich habe ein Problem, bei dem mir vielleicht jemand weiterhelfen kann: Ich will eine Wurfparabel (hrizontal) in eine Paintbox ausgeben lassen!!
Die Startwerte sollen variabel einzugenben sein (Physikalisch habe ich das Problem im Griff), dann soll die Kurve aber in der Paintbox mit Koordinatensystem ausgegeben werden.
Ich habe also ein Paar fragen:
1. Kann man in so einem Pixel-xy-System zoomen, oder die achsen variabel gestalten? ( verschiedene WErtebereiche, z.B. 1 m Starthöhe und 1 m/s abwurfgeschwindigkeit oder das ganze mit 400m und 30 m/s)
2. wei rechne ich die werte die rauskommen auf die pxieldarstellung um?
Es würde mir auf jeden Fall helfen, wenn jemand so etwas schon mal programmiert hat (ist ja im prinzip trivial, bin aber ein ziemlicher anfänger in delphi) und mir den quelltext zeigen könnte. Ansonsten wäre ich über jede Hilfe froh !!!
Roman
Moderiert von Peter Lustig (13:55, 02.05.2004): Topic verschoben
|
|
Brainiac
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 02.05.04 19:32
Zoomen kannst du direkt nicht, aber da du ja wahrscheinlich sowieso mit Gleitkommazahlen rechnest, brauchst du ja beim Unrechnen auf Pixel nur einen weiteren Vorfaktor einzubauen.
Umrechnen auf Pixel geht einfach mit round.
Berechne die Kurvengleichung für deinen Wurf (x->y) und zeichne dann den passenden Y-Pixel zu jedem X-Pixel mit einer For-Schleife.
|
|
catweasel
      
Beiträge: 487
Erhaltene Danke: 1
Win 7 64bit
Delphi 7 Second Sedition V7.2
|
Verfasst: So 02.05.04 21:28
| Zitat: | | Zoomen kannst du direkt nicht |
Naja, aber mit Stretchblt irgendwie aber schon oder ?
Catweasel
_________________ Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
|
|
umpani
      
Beiträge: 389
|
Verfasst: So 02.05.04 22:41
mit stretchblt soomst du das ganze, jedoch sind dir Pixel dann nur größer, du hast aber nicht einen detailierten Ausschnitt der Parabel.
Die sache mit dem zeichnen geht ganz einfach. Du hast je eine Fomel in der Art
f(x) = ???
Beim zeichne fängst du mit x := 0 an bis zu x := gewünschter Wert.
Wenn der Ursprung also 0/0 ist, dann zunächst
Delphi-Quelltext
für jeden weiteren x-Wert dann
Delphi-Quelltext
Wenn du nur den Pixel setzt, kann es sein, daß du lücken in der Linie hast. Mit Lineo verhinderst du das.
Gruß Umpani
_________________ Lernen, ohne zu denken, ist eitel; denken, ohne zu lernen, ist gefährlich. Konfuzius
|
|
Simon Joker
      
Beiträge: 236
Erhaltene Danke: 1
|
Verfasst: Mo 03.05.04 07:42
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mo 03.05.04 08:11
|
|
RomanMaschbau 
Hält's aus hier
Beiträge: 8
Win ME, Win2000
D6
|
Verfasst: Mo 03.05.04 20:25
Besten Dank für die vielen antworten!
habe es bereits geschafft, die kurven zeichnen zu lassen und die dinger sind auch rund. das mit dem zoomen leuchtet mir jetzt auch ein. ich muss die meter einfach nur in andere anzahl von pixeln umrechnen, mein einzigstes probelm ist jetzt noch die beschriftung vom koordinatensystem!!
ich habe ein raster selbst reingebastelt und will nun die beschriftung vornehmen. das funktioniert ja so weit ich weiß über textout(x,y,' '); ! ich will jetzt aber an der x-achse zum beispiel 10 werte ausgeben. kann ich das irgendwie elegant lösen über eine laufvariable?? man kann ja nur einen string ausgeben, aber dann müsste ich ja 10 mal den befehl da hin schreiben und dass kann ja nicht die einziste lösung sein.
hat jemand eine idee???
ich bin euch sehr sehr dankbar, leute!!!
roman
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mi 05.05.04 09:11
da würde dann in etwa so etwas gehen:
Delphi-Quelltext 1: 2: 3: 4:
| var i:integer; [...] x:=10; for i:=0 to 9 do textout(x+20*i,y,inttostr(i)); |
Der Befehl inttostr(), wandelt einen integer-Wert in einen String um.
_________________ We are, we were and will not be.
|
|
RomanMaschbau 
Hält's aus hier
Beiträge: 8
Win ME, Win2000
D6
|
Verfasst: Fr 07.05.04 15:24
Danke,
Das habe ich jetzt auch soweit geschafft, nur ergibt sich da schon wieder ein neues problem!! an der y-achse geht das ja alles noch so abe an der x-achse verzieht es mein ganzes gitter.
ich habe doch ein eigenes raster eingebaut und wollte unten an den entpunkten halt meine beschriftung anbringen. wenn ich das mache, dann verzieht es das raster und um so größer die werte werden, also um so länger, um so schlimmer. ich habe auch schon versucht mit den koordinaten zu experimentieren, aber es bringt auch nichts, wenn ich die tiefer setzten, oder nach links verschiebe, das ganze raster geht mit.
ich besteh nicht warum. normalerweise hört das raster auch genau mit den achsen auf, aber sobald da die beschriftung dran kommt, zieht er die striche automatisch länger und wenn dann noch eine lange zahl wie 1000 da steht, verschiebt sich alles!
wie gesagt, ich habe es eigentlich schon probiert mit den koordinaten zu varrieren, aber irgendwie? vielleicht hast du da noch ne idee, oder mach ich einfach nur was falsch??
roman
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Fr 07.05.04 15:40
hmm... so ohne Quelltext kann ich dazu leider gar nichts sagen. Ich bin auch nicht der Held mit Grafischer Ausgabe, deswegen kann ich da auch nicht sagen, ob du evtl da nen typischen Fehler gemacht hast....aber wenn du was Quellcode postest, kann ich mir das ja mal angucken.
_________________ We are, we were and will not be.
|
|
RomanMaschbau 
Hält's aus hier
Beiträge: 8
Win ME, Win2000
D6
|
Verfasst: Sa 08.05.04 13:41
hallo du
hier jetzt mal mein quelltext. ich habe die variablen wie folgt initialisiert:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| i:=70; y:=80; j:=1; q:=22;
while i<=520 do begin canvas.pen.Width:=1; canvas.pen.Color:=clgreen; canvas.moveto(i,520); canvas.TextOut(i,535,InttoStr(j)); canvas.LineTo(i,60); i:=i+40; j:=j+2; end; while y<520 do begin canvas.pen.Width:=1; canvas.pen.Color:=clgreen; canvas.moveto(30,y); canvas.TextOut(15,y,IntToStr(q)); canvas.LineTo(520,y); y:=y+40; q:=q-2; end; |
also er zieht die gitterlinien im abstand von 40 pixel und soll da dann die beschriftung kommen, die jetzt erstmal in 2er schritten erfolgt. bei größeren einheiten wird die verzerrung immer schlimmer!!!
ich hofffe, du findest den fehler. ich habe schon andere variante probiert aber irgendwie wird das nicht besser!!!
Vielen dank für deine bemühungen!!
Roman
Moderiert von Peter Lustig (15:06, 08.05.2004): Delphi-Tags hinzugefügt
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Sa 08.05.04 14:39
Probier mal das (nur die Reihenfolge der Befehle geändert)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| while i<=520 do begin canvas.pen.Width:=1; canvas.pen.Color:=clgreen; canvas.moveto(i,520); canvas.LineTo(i,60); canvas.TextOut(i,535,InttoStr(j)); i:=i+40; j:=j+2; end; while y<520 do begin canvas.pen.Width:=1; canvas.pen.Color:=clgreen; canvas.moveto(30,y); canvas.LineTo(520,y); canvas.TextOut(15,y,IntToStr(q)); y:=y+40; q:=q-2; end; |
_________________ We are, we were and will not be.
|
|
RomanMaschbau 
Hält's aus hier
Beiträge: 8
Win ME, Win2000
D6
|
Verfasst: So 09.05.04 10:42
THX!!!
wie geil ist das denn, ich such mir nen ast du dann liegt es nur an der reihenfolge. das war echt die Lösung!
vielen dank!!!!
damit sind vorrübergehend sogar mal alle meine probleme gelöst.
muss jetzt nur noch ne lösung finden, damit die kurven für große und kleine weiten sinnvoll im koordinatensystem erscheinen, aber da bräuchte ich doch nur ne bedingung einbauen, dass bei bestimmten weiten die beschriftung anders ist --> also faktor für pixelumrechnung einbauen.
naja, das schaff ich schon und wenn nicht, dann kann man ja zum glück auf euch/dich zählen!!!
roman
|
|
|