Autor |
Beitrag |
ace1905
      
Beiträge: 73
|
Verfasst: Di 06.05.08 18:25
Hallo,
ich möchte ein physikalisch korrektes Pogramm schreiben, was die Bewegung einer Kugel am Berg simuliert.
Ich habe schon einige Ideen, aber im Moment liegt mein Problem bei der Realisierung des Berges.
Die Neigung des Berges, die ich mit Hilfe von Sinus zeichne stimmt nicht mit dem richtigen Winkel überein.
Ich habe bereits einige Zeit versucht das auszubessern, aber ohne Erfolg. Ich hoffe, dass ihr mir weiterhelfen könnt.
Hier ist mein bisheriger Programmansatz noch im Anhang...
MfG ace
Einloggen, um Attachments anzusehen!
|
|
jakobwenzel
      
Beiträge: 1889
Erhaltene Danke: 1
XP home, ubuntu
BDS 2006 Prof
|
Verfasst: Di 06.05.08 18:31
Ohne das Programm jetz angeguckt zu haben: Delphi erwartet Winkel im Bogenmaß, du aber übergibst sie in Grad.
_________________ I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Di 06.05.08 18:36
Es ist eigentlich ganz einfach: überleg dir doch mal, warum gar nicht mehr als 43 grad gehen. Denn dein Prog KANN garkeine 90° so darstellen
//Edit: und wenn du das gemacht hast, dann guck dir diesen Code an
Delphi-Quelltext 1:
| Image1.Canvas.Polygon([Point(600,600),Point(100,600),Point(Trunc(600*sin(winkel_rad)),Trunc(600*cos(winkel_rad)))]); |
(Der Winkel ist bei der Wand rechts)
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
ace1905 
      
Beiträge: 73
|
Verfasst: Di 06.05.08 18:39
Ja das stimmt. Normalerweise ist dann die obere linke Ecke erreicht.
Wenn ich aber jetzt unten in mein Editfeld 43 Grad eingebe dann ist noch lang nicht die Ecke erreicht. Warum wird der Winkel an dieser Stelle nicht genau berechnet?
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Di 06.05.08 18:42
der Winkel wird sehr wohl genau berechnet. Da du aber die X-Position deines "Höhe-Punktes" festlegst, kannst du nur 90° erreichen für Y -> -unendlich
*grafik macht*
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
ace1905 
      
Beiträge: 73
|
Verfasst: Di 06.05.08 18:45
Und wie kann ich jetzt den Winkel an der linken Unterseite meines Berges genau zeichnen?
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Di 06.05.08 18:58
ok, die 43° stimmten nicht ^^
Siehe Grafik, ein bisschen denken sollst du selbst noch, sonst weißt du am Ende nicht, warum es funktioniert und das ist pöse.
Einloggen, um Attachments anzusehen!
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
ace1905 
      
Beiträge: 73
|
Verfasst: Di 06.05.08 19:15
ich versteh zwar was du da auf dem bild zeigst aber das sagt mir ja nur das der maximale winkel den ich so erreichen kann bei 39,6 liegt. allerdings wollte ich ja nur wissen warum mein programm nicht den richtigen winkel zeichnet.
ich gebe den winkel ein übertrage ihn ins bogenmaß und lasse dann einen y-wert für diesen winkel berechnen.
was ist daran fehlerhaft, dass ich die falschen winkel auf die maloberfläche bekomme?
immer wenn ich mein geodreieck anlege ist der winkel viel kleiner als mein eingegebener...
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Mi 07.05.08 10:17
ja, auf der Zeichnung, siehst du doch, dass wenn du 90° eingiebst, dann kommt 39.4° raus. Das ist ein mathematischer Denkfehler, kein Fehler des Rechners.
Außerdem hab ich doch die Lösung drunter geschrieben
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
ace1905 
      
Beiträge: 73
|
Verfasst: Do 08.05.08 00:16
Ok also ich hab jetzt verstanden wie du es meintest...danke schonmal.
Ich habe jetzt zuerst einmal Funktionen erstellt die mit Hilfe der Hangabtriebskraft die Beschleunigung der Kugel berechnen. Dann wird mit der Beschleunigung die ansteigende Geschwindigkeit berechnet...jedenfalls theoretisch.
Mein Problem ist jetzt, wo soll ich diese Geschwindigkeit unterbringen. Ich hatte mir überlegt den Anstieg des Berges durch tan(winkel) zu berechnen und dann das Intervall des Timers je nach Geschwindigkeit zu verkleinern...
Ist mein Denkansatz in der richtigen Richtung oder bin ich da auf dem Holzweg...? Wenn ja dann bitte ich um eure Hilfe und Anregungen wie es besser klappen könnte...
MfG ace
Einloggen, um Attachments anzusehen!
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Fr 09.05.08 10:00
mach dafür bitte einen neuen Thread auf
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Sa 10.05.08 00:12
Moin!
Und nochmal offiziell: bitte erstelle für deine zweite Frage ein separates Topic, da die Diskussion mehrerer Fragen in einem Topic für gewöhnlich für Verwirrung und Durcheinander sorgt. Danke.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
ace1905 
      
Beiträge: 73
|
Verfasst: So 11.05.08 17:35
Hi,
ich hab nochmal eine Frage zu diesem Thema...
Ich habe irgendwie immer noch keinen korrekten Winkel erhalten un hab mir gedacht, dass ich das mit dieser Formel viel leichter lösen könnte.
sin(alpha) = a/c
a = sin(alpha) * c
a wäre dann die Höhe des Dreiecks. Wenn man das dann in ein Polygon einsetzt dann müsste eigentlich das richige Dreieck rauskommen.
Aber kommt es nicht. Am Anfang, sprich bei 10° oder so sind die Winkel noch genau aber wenn ich höher gehe dann werden sie immer ungenauer. Ich versteh einfach nicht warum... Delphi-Quelltext 1: 2:
| a := 400-Trunc(((cos(winkel)*400))); Image1.Canvas.Polygon([Point(0,400),Point(400,400),Point(400,a)]); |
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 11.05.08 17:56
ace1905 hat folgendes geschrieben: | Delphi-Quelltext 1: 2:
| a := 400-Trunc(((cos(winkel)*400))); Image1.Canvas.Polygon([Point(0,400),Point(400,400),Point(400,a)]); | |
Wenn die Breite des Berges fest ist musst du den Tangens nehmen. Ersetze in deiner Formel cos durch tan ( uses math nicht vergessen)
Und für Winkel 10° verwende winkel := GradToRad(10).
|
|
ace1905 
      
Beiträge: 73
|
Verfasst: So 11.05.08 18:05
mhhh... ok also jetzt siehts schon genauer aus... auch als ich es abgemessen habe, aber immernoch sind es ungefähr 2-3 grad zu wenig...
Liegt das daran dass ich die Nachkommastellen abschneide oder ist es einfach nicht möglich einen genaueren Wert zu erziehlen?
Ansonsten aber schonmal vielen Dank!
Edit: Ah, es lag an GradToRad. Man muss doch DegToRad nehmen, dann bekommt man einen genauen Winkel.
Vielen Dank.
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 11.05.08 22:05
Sorry, GradToRad war wohl für 400° statt 360°  . Ich verwende die Funktionen sonst eben nie.
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Mo 12.05.08 10:26
wie willst du mit dieser Methode einen 90° Winkel erreichen?
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Tobi482
      
Beiträge: 135
|
Verfasst: Mo 12.05.08 11:03
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: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71:
| procedure TForm1.berg(alpha:double); var b : Integer; r : Integer; begin Image1.Canvas.Brush.Color := ClWhite; Image1.Canvas.Rectangle(0,0,Image1.Width, Image1.Height);
if (Trunc(alpha) mod 90 = 0) and (Trunc(alpha) mod 180 <> 0) then begin Image1.Canvas.Brush.Style := bsSolid; Image1.Canvas.Brush.Color := ClBlack; Image1.Canvas.Pen.Color := clWhite; Image1.Canvas.Rectangle(0,0,Image1.Width, Image1.Height); end else begin
b := trunc( tan(alpha/180*PI) * Image1.Width);
Image1.Canvas.Brush.Color := ClBlack; Image1.Canvas.Brush.Style := bsSolid; Image1.Canvas.Pen.Color := clWhite; Image1.Canvas.Polygon( [ Point(0, Image1.Height), Point(Image1.Width, Image1.Height), Point(Image1.Width, Image1.Height-b)]);
r := 80; Image1.Canvas.Brush.Style := bsClear; Image1.Canvas.Pen.Color := clRed; Image1.Canvas.Ellipse(0-r, Image1.Height-r, 0+r, Image1.Height+r);
Image1.Canvas.Font.Color := clred; Image1.Canvas.TextOut( 0+(r div 2), Image1.Height-15, FloatToStrF(alpha, ffFixed, 4,2) + '°');
Image1.Canvas.Brush.Color := clWhite; Image1.Canvas.Brush.Style := bsSolid; Image1.Canvas.Pen.Color := clWhite; Image1.Canvas.Polygon( [ Point(0, Image1.Height), Point(Image1.Width, Image1.Height-b), Point(0, 0) ]); end; end; |
Gruß Tobi
|
|
ace1905 
      
Beiträge: 73
|
Verfasst: Mo 12.05.08 13:24
mein programm bezieht sich ja nur auf die kugel in der geneigten ebene un bei einem berg mit nem winkel von 90 grad wäre es ja schon wieder freier fall. deshalb reicht mir für meine zwecke diese methode vollkommen aus
|
|
|