Entwickler-Ecke

Multimedia / Grafik - Winkel an gezeichnetem Berg stimmt nicht


ace1905 - Di 06.05.08 18:25
Titel: Winkel an gezeichnetem Berg stimmt nicht
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


jakobwenzel - Di 06.05.08 18:31

Ohne das Programm jetz angeguckt zu haben: Delphi erwartet Winkel im Bogenmaß, du aber übergibst sie in Grad.


Xion - 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)


ace1905 - 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 - 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*


ace1905 - Di 06.05.08 18:45

Und wie kann ich jetzt den Winkel an der linken Unterseite meines Berges genau zeichnen?


Xion - 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.


ace1905 - 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 - 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


ace1905 - 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


Xion - Fr 09.05.08 10:00

mach dafür bitte einen neuen Thread auf


Narses - 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


ace1905 - 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 - So 11.05.08 17:56

user profile iconace1905 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 - 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 - So 11.05.08 22:05

Sorry, GradToRad war wohl für 400° statt 360° ;). Ich verwende die Funktionen sonst eben nie.


Xion - Mo 12.05.08 10:26

wie willst du mit dieser Methode einen 90° Winkel erreichen?


Tobi482 - Mo 12.05.08 11:03


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:
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
     //Alles weiß machen
     Image1.Canvas.Brush.Color := ClWhite;
     Image1.Canvas.Rectangle(0,0,Image1.Width, Image1.Height);

     {
               + A
          c  / |
           /   | b
         /     |
      B +------+ C
            a

      Gesucht: b
      Gegeben: Alpha

      Tip: GAGA
           HHAG

      Formel:  tan(alpha) = G/A = b/a
               Umstellen nach b
               b = tan(alpha)*a

      Achtung: lim(tan(90 + 180*n)) -> inf

     }


     if (Trunc(alpha) mod 90 = 0and (Trunc(alpha) mod 180 <> 0then
     begin
          //Alles schwarz machen machen
          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)]);

          //Radis einzeichnen
          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);

          //mit der 15 kann man den text verschieben (bin zufaul das zu optimieren^^)
          Image1.Canvas.Font.Color := clred;
          Image1.Canvas.TextOut(   0+(r div 2),
                                   Image1.Height-15,
                                   FloatToStrF(alpha, ffFixed, 4,2) + '°');

          //Kreisbogen verdecken
          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(00)
                                        ]);
     end;
end;


Gruß Tobi


ace1905 - 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