| Autor |
Beitrag |
cs-schukki
Hält's aus hier
Beiträge: 15
|
Verfasst: Fr 23.05.08 18:14
hallo,
ich hab ein Schulprojekt auf und muss einen schrägen Wurf darstellen. Dazu hab ich alles schon fertig. Nun möchte ich jedoch diesen Wurf animiert darstellen. So, dass jeder Linienabschnitt zw y und y1 z.B. aller 100ms gezeichnet wird Kann ich das mit der Timer-Komponete machen? Wenn ja wie? Wenn nicht wie dann? Bin leider auf diesem Gebiet ein Neuling.
Ich würde euch auch gern meinen Quelltext ordentlich anzeigen, doch weiß ich momentan noch nicht wie also poste ich euch den einfach mal hier rein.
Hier mein Quelltext:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| with Image_Koord.canvas do begin Colordialog_func.Execute; For x:=0 to 500 do begin Pen.Color:=Colordialog_func.Color; Pen.Width:=2; y:= Trunc((sin(alpha)/cos(alpha))*x-g/(2*sqr(v0)*sqr(cos(alpha)))*sqr(x)+h); y1:= Trunc((sin(alpha)/cos(alpha))*(x+1)-g/(2*sqr(v0)*sqr(cos(alpha)))*sqr(x+1+h); moveto(x+50,250-y); lineto(x+1+50,250-y1); end; |
Danke für eure Hilfe
Moderiert von Gausi: Delphi-Tags hinzugefügtModeriert von Narses: Topic aus Sonstiges (Delphi) verschoben am Fr 23.05.2008 um 21:27
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Fr 23.05.08 18:39
Hi,
Deinen Quelltext packst du am besten in <span class="inlineSyntax"><span class="codecomment">{PROTECTTAG5cf8aa9e70a7b8d288b64efbf8aec82c}</span></span> Einzelne Stellen markierst du mit dem Highlight-Tag: [highlight ] markierte Stelle [/highlight]
Ja, das geht mit der Timer-Komponente. Wahrscheinlich hast du durch deine Gleichung zum Schrägen Wurf X- und Y-Koordinaten gegeben. Nun lässt du den Timer immer ein Stück weiter laufen(Zeit in einer variable) und zeichnest deinen Ball(oder wasauchimmer) an die Position, die du aufgrund der Timer-Zeit aus deiner Gleichung bekommst.
Deinen Quelltext schaue ich mir gleich nochmal in Delphi-Tags an, falls es dir garnicht um den Ansatz ging  . Dann frag aber besser gleich nach der Stelle, an der du Probleme hast. Mit dem Ansatz müsstest du ja schonmal ein Stück gekommen sein.
mfG,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
cs-schukki 
Hält's aus hier
Beiträge: 15
|
Verfasst: Fr 23.05.08 18:44
Danke für die liebe Antwort.
Hier der Quelltext nochmal:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| with Image_Koord.canvas do begin Colordialog_func.Execute; For x:=0 to 500 do begin Pen.Color:=Colordialog_func.Color; Pen.Width:=2; y:= Trunc((sin(alpha)/cos(alpha))*x-g/(2*sqr(v0)*sqr(cos(alpha)))*sqr(x)+h); y1:= Trunc((sin(alpha)/cos(alpha))*(x+1)-g/(2*sqr(v0)*sqr(cos(alpha)))*sqr(x+1)+h); moveto(x+50,250-y); lineto(x+1+50,250-y1); end; end; |
Ja, genau das meine ich. Jedoch will ich keinen Ball zeichnen sondern einfach nur die Funktion an der jeweiligen Stelle y weiter zeichnen.... so das die dargestellte Kurve "animiert" wird...
Hoffe du vertshest mich.
Leider hab ich noch keine Ahnung im Bezug auf Verwendung eines Timers? Könntest du mir helfen um den Timer zu verwenden?
Vielen Dank
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Fr 23.05.08 19:34
Hi,
TTimer ist eine Klasse, die den Windows-Timer kapselt und den Umgang mit ihm vereinfacht. Ziehe einfach eine TTimer-Komponente auf die Form oder erzeuge sie dynamisch(siehe unten für den zweiten Ansatz).
Wenn du eine Komponente auf die Form ziehst, musst du im Object Inspector, dort, wo du auch die Eigenschaften(Properties) der Form einstellst, unter "Events" eine Prozedur für OnTimer einfügen(doppelklick). In diese Schreibst du dann, was bei jedem Timer-Aufruf passieren soll.
Ich würde dir übrigens raten, statt die Y-Koordinate die Zeit zu nehmen, um die X-Koordinate auszurechnen(oder hattet ihr das noch nicht?). Damit hat der Benutzer dann gleich noch eine Echtzeit-Ansicht des Wurfes. Dann muss das Intervall des Timers aber sehr klein sein, sonst bekommst du unschön lange Strich-Bereiche.
TTimer mit dynamischem Aufruf: 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: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42:
| type TForm1 = class(TForm) FImage: TImage; private FTimer: TTimer; FZeit: Integer; private procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Timer1Timer(Sender: TObject); end;
implementation
const tmrInterval = 50;
procedure TForm1.FormCreate(Sender: TObject); begin FTimer := TTimer.Create(Self); FTimer.Interval := tmrIntervall; FZeit := 0; end;
procedure TForm1.FormDestroy(Sender: TObject); begin FTimer.Free; end;
procedure TForm1.Timer1Timer(Sender: TObject); var lX, lY: Integer; begin lX := f(FZeit).X; lY := f(FZeit).Y; FImage.Canvas.MoveTo(lX, lY); FZeit := FZeit + tmrInterval; lX := f(FZeit).X; lY := f(FZeit).Y; FImage.Canvas.LineTo(lX, lY); end; |
mfG,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
cs-schukki 
Hält's aus hier
Beiträge: 15
|
Verfasst: Fr 23.05.08 19:52
Ich komm da grad gar nicht mehr mit... Danke für deine Mühe, aber das ist für einen pobligen Info-Kurs zu hoch.
Ich schick uppe einfach mal das Programm damit dur dir mal ein Bild machen kannst, wie es bei mir aussieht. Die Timerkomponente habe ich bereits erstellt.
Ich wäre dir sehr verbunden, wenn du dir das mal anschaust und eventl. diesen Timer für mein Anliegen programmieren kannst.
Danke im Vorraus
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Fr 23.05.08 20:03
cs-schukki hat folgendes geschrieben: | Ich komm da grad gar nicht mehr mit... Danke für deine Mühe, aber das ist für einen pobligen Info-Kurs zu hoch.
Ich schick uppe einfach mal das Programm damit dur dir mal ein Bild machen kannst, wie es bei mir aussieht. Die Timerkomponente habe ich bereits erstellt.
Ich wäre dir sehr verbunden, wenn du dir das mal anschaust und eventl. diesen Timer für mein Anliegen programmieren kannst.
Danke im Vorraus |
Nimm dir doch mal meinen Quelltext und markiere mit dem Highlight-Tag die Stellen, die du nicht verstehst. Bringt ja nichts, wenn ich dir das schreibe 
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
cs-schukki 
Hält's aus hier
Beiträge: 15
|
Verfasst: Fr 23.05.08 20:18
1. Ist vllt bisschen doof gefragt, doch warum haben alle Komponentenbezeichner das F vor dem Komponentennamen? also zum Beispiel FTimer oder FZeit.
2. Ich versteh schon was du in deiem Quelltext vor hast, nur an der Umsetzung haperts, da ich z.B. keine Gleichung für die Koordinate X habe, sondern Y in einer Schleife For x:=o to 500 laufen lasse und somit die Y Koordinate errechnet bekomme. Was trage ich nun laut deinem Quelltext für die X Koordinate in den Quelltext der Timer-Komponente ein?
3. Was beudeutet das markierte genau:
Delphi-Quelltext 1: 2: 3:
| begin lX := f(FZeit).X ; lY := f(FZeit).Y; |
4. Ja du hast recht, wenn du es mir programmierst, hab ich nichts gelernt. Vllt wär es jedoch nicht schlecht, wenn du mal schnell über das gesamte Programm drüber schaust, damit du weißt, von was wir reden...oder soll ich mal den gesamten Quelltext der Unit posten?
Danke für deine Unterstüzung
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Fr 23.05.08 22:56
Hi,
Zu 1: Das "F" steht für "Feld", einfach zur Unterscheidung, um welche Art von Variable es sich handelt. Bestimmt nicht doof gefragt
Zu 2: Der Wagerechte Wurf ist ja einfach nur eine Überlagerung zweier Bewegungen. X = X_0 - t * v_0.X und Y durch: 1:
| Y = Y_0 - t * v_0.Y + g / 2 * t^2 |
Am Computer must du dann, da der Koordinatenursprung in der Ecke links oben liegt, rechnen: Y = Y_0 + t * v_0.Y + g / 2 * t^2
Wie gesagt: Nur, wenn ihr das schon hattet. Wenn ihr das schon hattet kannst du, je nachdem, wie viel Zeit du noch dafür hast und, was die Aufgabenstellung war, dich ja auch mal tiefer in die Materie einarbeiten. Ansonsten komme ich jetzt nochmal auf deinen alten Ansatz(nach der Y-Koordinate) zurück.
Du kannst einen Timer laufen lassen, in dem du eine Variable "YPosition" erhöhst. Dann ermittelst du den zugehörigen X-Wert und zeichnest ihn ein. Wenn XPosition <= 0 ist, schaltest du den Timer aus(enabled := false).
Im Object Inspector musst du den Timer nun noch auf Enabled=false setzen, als Standardwert. Zur Animation setzt du dann YPosition auf 0 und startest den Timer(enabled := true).
mfG,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Sa 24.05.08 15:33
Hi,
Ich habe mir deinen Quelltext jetzt nochmal angesehen und ein wenig kommentiert. Die gemeinsamen Teile der Berechnung kannst du ja auch ruhig gemeinsam ausrechnen. Getrennte Teilschritte sind übrigens für den Mathematiker ein Graus, lassen sich aber besser kommentieren.
Das With-Statement habe ich mal entfernt, sollte man nicht machen. Bei einer Prozedur einer Form ist ja praktisch immer schon ein with-Statement da. Du musst ja nicht schreiben "Form1.PiantBox1.DoSomething;", sondern kannst ja einfach "PaintBox1.Dosomething;" schreiben.
Im Prinzip ist also bei jeder Methode einer Klasse schon ein "with self do begin" vorhanden. Bei verschachtelten With-Statements kann es zu Problemen kommen, wenn mehrere Objekte gleichnamige Methoden haben.
Deshalb gilt das with-Statement im allgemeinen als unsauber. Es wird trotzdem immer wieder gerne benutzt, weil es Tipparbeit spaart. Bei deinen drei Verwendungen lohnt sich das aber wohl kaum  .
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure ZeichneFunktion(v0, h, Alpha: Single); var X, Y, Y1: Integer; begin if not Colordialog_func.Execute then ColorDialog_func.Color := clRed; Image_Funkt.Pen.Color := Colordialog_func.Color; Image_Funkt.Pen.Width := 2; for x := 0 to 500 do begin y:= Trunc((Sin(Alpha) / Cos(Alpha)) * x - g / (2 * Sqr(v0) * Sqr(Cos(Alpha))) * Sqr(x) + h); y1:= Trunc((Sin(Alpha) / Cos(Alpha)) * (x + 1) - g / (2 * Sqr(v0) * Sqr(Cos(Alpha))) * Sqr(x + 1) + h); Image_Funkt.MoveTo(x + 50, 250 - y); Image_Funkt.LineTo(x + 1 + 50, 250 - y1); end; end; |
Edit: Die Rechnung würde ich so machen: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| function FunktionsWert(X: Integer; h, v0, Alpha: Single): Integer; var TangensAlpha: Single; Helfer2: Single; begin TangensAlpha := (Sin(Alpha) / Cos(Alpha)); Helfer2 := g / (2 * Sqr(v0 * Cos(Alpha))); result := h + X * TangensAlpha - Sqr(X) * Helfer2 end; |
So, jetzt setz dich mal länger drüber. Wenn etwas unklar ist, gibt es den Highlight-Tag
mfG,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
cs-schukki 
Hält's aus hier
Beiträge: 15
|
Verfasst: So 25.05.08 16:39
hmmm...ich wollte ja eigentlicht nicht, dass wir uns nun über die Berechnung und Zeichnung der Funktion unterhalten...sondern wollte ich nur, dass die Funktion mit der Timerkomponente animiert wird.
Zudem hast du recht, dass Mathematiker ihre eigenen Regeln haben....bei Mathe/Physik LK kenn ich mich jedoch recht gut damit aus. Aber das ist nicht das Thema.
Ich finde es schade, dass wir nach 3 Tagen immer noch zu keinem Ergebnis gekommen sind. naja, dann muss ich es Wohl oder Übel aufgeben, die Animation zu verwirklichen, da ich, wie schon öfters erwähnt, mich mit der Benutzung der Timerkomponente wenig auskenne. Ich weiß weder welche Anweisung speziel bei meinem Programm zum Berechnen_Button gehört, noch, welche demnach der Timer abbekommen muss. Ohne dieses Wissen und ein konkretes Beispiel nützt mir auch nicht eine Umstruckturierung der Berechnung und Zeichnung der Funktion.
LG cs
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: So 25.05.08 17:16
Hi,
cs-schukki hat folgendes geschrieben: | | Zudem hast du recht, dass Mathematiker ihre eigenen Regeln haben....bei Mathe/Physik LK kenn ich mich jedoch recht gut damit aus. Aber das ist nicht das Thema. |
Oh, sry. Dann geh ich mal back to topic
Zurzeit zeichnest du die Funktion ja schleifenbasiert. Deine Schleifenvariable X deklarierst du nun einfach global, als Feldvariable deiner Form. Im Timer erhöhst du nun die Variable um eins und rufst den Zeichnen-Teil deiner Funktion einmal auf.
Das dürfte dann etwa so aussehen: 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: 27:
| type TForm1 = class(TForm) FTimer: TTimer; procedure Timer1Timer(Sender: TObject); public procedure ZeichneFunktion; private FStelle: Integer; end;
implementation
procedure TForm1.ZeichneFunktion; begin FStelle := 0; FTimer.Interval := 50; FTimer.Enabled := false; end;
procedure TForm1.Timer1Timer(Sender: TObject); begin Canvas.MoveTo(FStelle, f(FStelle)); Inc(FStelle); Canvas.LineTo(FStelle, f(FStelle)); if FStelle = 500 then Timer.Enabled := false; end; |
mfG,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
cs-schukki 
Hält's aus hier
Beiträge: 15
|
Verfasst: So 25.05.08 19:01
Danke.
Also entweder bin ich zu blöd zum Programmieren oder mein PC hat was gegen mich. Schau dir das mal bitte an --> "ungültige Gleitkommaoperation"
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: So 25.05.08 19:24
Hi,
Also deine ungültige Gleitkommaoperation liegt daran, dass du den Timer anfangs enabled hast. Geh mal in den Object Incpector(links, im Grafik-Design) und stell ihn auf enabled = false.
Ausgegeben wird jedoch stets nur eine Liste von Punkten 0/0, danach bin ich noch auf der Suche.
Edit: Ich habe deine globale Variable X durch ein lokales i ersetzt und vergessen, innerhalb der for-Schleife x durch i zu ersetzen
Delphi-Quelltext 1: 2:
| If (StrToFloat(Edit_winkel.Text) > 90) then ShowMessage('Winkel < 91° wählen'); | ~meinst du nicht eher "< 90"?
Delphi-Quelltext 1: 2:
| sw_b:=Trunc(sw); sw_c:=Round(sw_b); |
Ein mithilfe von Trunc abgeschnittener Wert ist immer eine ganze Zahl. Was du meinst ist einfach nur Round - ohne trunc vorher
mfG,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
Zuletzt bearbeitet von Hidden am So 25.05.08 19:34, insgesamt 2-mal bearbeitet
|
|
cs-schukki 
Hält's aus hier
Beiträge: 15
|
Verfasst: So 25.05.08 19:30
Kleiner 90 würde ja bedeuten, dass du 90 nicht eingeben könntest. Das kannst du aber, speziell für den wurf nach oben...du hast recht, ich müsste schreiben "Winkel < oder = 90 wählen"
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: So 25.05.08 19:39
Hi,
du prüfst aber auf <90...
Schau mal im Anhang, die Funktion wird an der falschen Stelle gezeichnet. oben links auf der Form ist eine Parabel zu sehen.
Der Ursprung liegt in der oberen, linken Ecke. Ich glaube du kannst auch g als -9.81 definieren, dann geht das schonmal.
Dort siehst du, was ich meine: es wird das Canvas der Form benutzt, weil dein with-Statement falsch verstanden wird. du musst das with-Statement entfernen und überall Image1.canvas vorschreiben.
Edit: So, wie du es jetzt machst, wird übrigens nur der Zeichenprozess verlangsamt, gegenüber einer for-Schleife. Wenn du mit dem Timer probleme hast, kannst du auch gleich wieder eine Schleife nehmen.
Der Timer ist nur sinnvoll, wenn du die Formel nach der Zeit verwenden willst.
mfG,
Einloggen, um Attachments anzusehen!
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
cs-schukki 
Hält's aus hier
Beiträge: 15
|
Verfasst: So 25.05.08 19:49
Bei mir zeichnet der momentan gar nichts mehr.
Das Problem hatte ich auch, dass er diese links oben zeichnet. Ich hab das Programm geschlossen und wieder geöffnet. Und schwups, er zeichnet keine Funktion mehr links oben. Kannst du mir bitte die .rar, bei der die FUnktion gezeichnet wird, schicken?
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: So 25.05.08 20:05
Hi,
Ich habe dir doch die drei Änderungen geschrieben, die ich gemacht habe
Such doch gerade die Stellen. Wie gesagt funktioniert es bei mir auch nicht, da ich das with-Statement noch ncith aufgelöst habe. Mach das mal so weit, dann sehen wir gleich nochmal.
mfG,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
cs-schukki 
Hält's aus hier
Beiträge: 15
|
Verfasst: So 25.05.08 21:20
Hi,
@Hidden: Wie weit bist du?
LG
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 25.05.08 22:36
Was spricht gegen die Verwendung von Tan (Unit Maths IIRC) zur Berechnung des Tangens???
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
F34r0fTh3D4rk
      
Beiträge: 5285
Erhaltene Danke: 29
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Mo 26.05.08 08:17
Ich hoffe mal der Link geht, vielleicht findest du hiermit was du suchst:
www.delphi-forum.de/download.php?id=5772
mfg
|
|
|