S
Hallo,
keine Entschuldigung nötig. Jede Hilfe ist recht und irren ist menschlich.
Aber leider klappt auch das noch nicht. Also habe ich mal nach alternativen Ideen gesucht. Ich bin im Geiste in meine Schulzeit zurück gegangen und habe mir die Wege und die Formen die ich berechnen möchte einfach mal aufgezeichnet und bin dahinter gekommen, dass ich eigentlich "nur" zwei rechtwinklige Dreiecke berechnen muss, die aneinander hängen.
Ähnlich dem folgenden:
La Ld
+------- +-------
| / | /
|Lb / | /
| / Lc Lc | / R
| / | /
|A/ |B/
|/ |/
Die Bezeichnungen sind natürlich frei gewählt und haben keinerlei mathematischen Bezug, weil ich ja die mathematischen Begriffe nicht kenne.
Das linke Dreieck ist das Dreieck, dass am Boden liegt und das rechte Dreieckt ist das, dass auf dem anderen steht.
Und jetzt Formelsammlung aus der 10. Klasse raus und nach Pytagoras gesucht (und auch Google benutzt).
a²=b²+c²
sin(alpha) = Gegenkathete / Hypotenuse
Ein bisschen Mathematik und Formeln umstellen und schon hatte ich ein paar Formeln erarbeitet. Allerdings arbeite ich ja mit mehr als 90°-Winkeln, also habe ich noch ein bisschen Ausgleich betrieben. Folgende Funktion ist dabei rausgekommen.
/* Punkte */
// Punkt zurück geben
S3DTypes::Point S3DTypes::Vector::PointGet() const
{
S3DTypes::Point toret;
float Ld = sin(B.GetRad()) * L;
float Lc = sqrt((L*L) - (Ld*Ld));
float La = sin(A.GetRad()) * Lc;
float Lb = sqrt((Lc*Lc) - (La*La));
// Ausgleich für negative
if ((A>90) && (A<=270))
{
Lb*=-1;
}
if ((B>90) && (B<=270))
{
Lb*=-1;
}
toret.XSet(La);
toret.YSet(Ld);
toret.ZSet(Lb);
return toret;
}
Ich hab auch wieder meine Winkelnamen A,B und L angenommen um Ähnlichkeiten und Verwechslungen durch bekannte mathematische Begriffe zu vermeiden. Denn mein Koordinatensystem ist nicht linksrum, sondern rechtsrum angelegt. Also A dreht nach rechts und B dreht nach oben.
Die Rechnung von Koordinaten auf die Winkel plus Länge hab ich noch nicht, wird aber wahrscheinlich genauso gehen.
Einen schlimmen Anfängerfehler hab ich auch noch gemacht. Ich rechne mit meinen Winkeln immer in 360°. sin, cos und Freunde denken allerdings anders. Daher auch die Funktion GetRad();
#ifndef M_PIf
#define M_PIf 3.1415926535897932384626433832795f
#endif
float S3DTypes::Angle::GetRad() const
{
return 2.0f * M_PIf * (InAngle / 360.0f);
}
Danke nochmal allen die sich hier mit mir (und über mich) einen Kopf gemacht haben. Ich habe mein Projekt jetzt auch öffentlich gestellt. Vielleicht findet sich ja jemand, der ein bisschen mitprogrammieren möchte. (siehe meine Signatur)
Denn auch wenn hier Kugelkoordinaten nicht mein Weg waren, ich hab viel über Kreise und Kugeln gelernt. (Und eine Bemerkung am Rande: Wikipedia weiß nicht alles!)