ich bin bei der Fehlersuche auf folgendes gestoßen:
Code:
newx := cos(90); newy := sin(90);
Eigentlich würde ich erwarten, dass newx den Wert 0 erhält und newy den Wert 1. Stattdessen errechnet mir Delphi für newx -0,448073625564575 und für newy 0,89399665594101.
Hat irgend jemand eine Idee warum?
_________________ Wissen nennen wir jenen kleinen Teil der Unwissenheit, den wir geordnet und klassifiziert haben. (Ambrose Bierce)
danke für die Starthilfe - bin ich froh, dass ich mein Studium schon einige Zeit in der Tasche habe (Mathe war nie meine Stärke).
Habe meinen Code jetzt wie folgt geändert:
Code:
newx := cos(DegToRad(0));
newy := sin(DegToRad(180));
Aber irgendwie habe ich es noch nicht recht verstanden. Mit DegToRad sollte z.B. 0° ins Bogenmaß umgerechnet werden. Bei einem Cosinus von 0 würde ich 1 erwarten erhalte aber 0. Beim Sinus von 180 würde ich 0 erwarten, bekomme aber -5,42101086242752E-20 als Ergebnis.
Irgendwie stehe ich noch auf dem Schlauch.
_________________ Wissen nennen wir jenen kleinen Teil der Unwissenheit, den wir geordnet und klassifiziert haben. (Ambrose Bierce)
A := (V1.X -0.5)* cos(RotateFactor*Pi/180) - (V1.Z -0.5) * sin(RotateFactor*Pi/180); B := (V1.X -0.5)* sin(RotateFactor*Pi/180) + (V1.Z -0.5) * cos(RotateFactor*Pi/180);
Aus irgendeinem Grund wollte es mit der DegToRad Funktion nicht klappen, aber mit dem Tipp von Delphic hat es dann geklappt.
PS. Falls sich jemand über die -0,5 wundert, die sind dazu da, um das Objekt so zu verschieben, dass der Mittelpunkt des Koordinatensystems auch der Mittelpunkt des Objekts ist (und ja, es wäre wohl einfacher die Zeichenroutine zu ändern und glRotate zu benutzen, aber ich bin ja noch OpenGL Neuling ).
_________________ Wissen nennen wir jenen kleinen Teil der Unwissenheit, den wir geordnet und klassifiziert haben. (Ambrose Bierce)
Ohne das jetzt genau nachgeprüft zu haben, glaube ich mich zu erinnern daß Delphi von links nach rechts optimiert. Heisst er rechnet bei
Code:
RotateFactor*Pi/180
tatsächlich einmal Multiplikation und einmal Division. Du bist in jedem Falle nicht schlechter dran, wenn du den Faktor klammerst
Code:
RotateFactor*(Pi/180.0)
denn so stellst Du sicher, daß nur eine Multiplikation durchgeführt wird. Oder wenn Du ausnutzen willst, daß von links nach rechts optimiert wird kannst Du auch schreiben
Code:
Pi/180.0 * RotateFactor
das führt zum selben Effekt - aber die Variante mit dem Klammern ist verlässlich und lässt dem Optimierer egal welchen Compilers zu egal welcher Sprache kaum eine Option als zu optimieren, ob er nun von links oder von rechts arbeitet. Klammern können in bestimmten Situationen auch dazu genutzt werden, die numerische Stabilität zu erhöhen, das ist aber v.a. dann wichtig, wenn echt subtrahiert wird oder verschieden große Zahlen addiert werden... Das aber nur so als kleine Nebeninfo.
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
Auch wenn das Thema geklärt ist und auch nicht sonderlich komplex ist, sollte man doch evtl. in Betracht ziehen den Threadtitel etwas ausagekräftiger zu gestalten.
Mitglieder in diesem Forum: 0 Mitglieder und 12 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.