Aus Punkten Ebenen machen/Winkel zwischen 2 Ebenen
-
Hi,
ich bin hier leider voellig buchlos und daher auf Eure Mithilfe/Links angewiesen. Also: ich habe 2 mal 3 Punkte, die eine Ebene aufspannen. Ich wuerde jetzt gerne den Winkel zwischen diesen Ebenen bestimmen.
Kurz gefragt, wie geht das? Gibt es dafuer ein effizientes Verfahren fuer den PC? Ich brauche es Schritt fuer Schritt, da Mathe etwas laenger her ist und ich momentan nicht mal mehr weiss, wie ich ueber die drei Punkte an die Ebene komme (man baut 2 Vektoren, oder?).
Ueber Links zu deutsch- oder englischsprachigen Websites wuerde ich mich sehr freuen. Leider habe ich bisher nur Seiten gefunden, die viel zu tiefgruendig fuer dieses doch recht einfache Problem sind.
-
eine ebene kannst du über 3 punkte aufspannen(die nicht auf einer linie liegen dürfen :))
an den winkel kannst du über die ebenennormale kommen(ich hoffe der vector, der im 90%winkel von der ebene wegzeigt heisst so^^).
kann dir leider im moment auf die schnelle nicht mehr sagen
-
Hab im Moment nicht so viel Zeit, daher nur ne grobe Schritt-für-Schritt-Anleitung:
Was Du eigentlich brauchst ist jeweils der Vektor, der Senkrecht auf der Ebene steht.
Sind x,y,z die Punkte, so kannste zwei Vektoren u,v bestimmen:
u = x-y
v = x-zDann brauchste den Vektor, der senkrecht auf u,v steht. Suchbegriff: Kreuzprodukt
n = u x vDas machste für die andere Ebene auch. Du hast dann n1,n2
Dann benutzt Du:
cos α = (n1 * n2)/(|n1|*|n2|)Jetzt noch den arccos drauf und schon hast Du den Winkel.
MfG Jester
-
Ja, genau, Normalenvektor, da daemmert doch was in meinem verkoksten Gehirn. Tausend Dank an Euch beide. Manchmal braucht man nur ein, zwei Stichworte und man weiss, wonach man genau schauen muss. Super!
-
auf dem pc bist du schneller, wenn du den umweg über arcus tangens nimmst, da das die einzige arcus funktion ist, die ein intel/amd prozessor direkt ausführen kann, z.b.:
float temp = x1*x2 + y1*y2 + z1*z2; return atan2f( sqrtf( ( x1*x1 + y1*y1 + z1*z1 ) * ( x2*x2 + y2*y2 + z2*z2 ) - temp * temp ), temp );
damit kannst du dir auch sparen, zu prüfen, ob der Nenner 0 wird. der Zähler sollte es natürlich schon sein
-
Wenn das schneller ist, warum haben die den arccos dann nicht so implementiert???
Ich glaub's ehrlich gesagt nicht. Mit acos biste biste vermutlich besser dran.
-
nun, acos IST so implementiert, es wird halt noch zusätzlich sqr( 1 - x*x ) berechnet, und dann beide werte an fpatan übergeben; du kannst dich gerne durch einsatz eines debuggers davon überzeugen, es existiert nun mal nur diese eine (fpatan) arcus funktion im coprozessor.
oder mach einfach nen benchmark mit beiden varianten. meine variante ist ca. 30% schneller, ca. 290 gegenüber ca.380 takten auf p4.
-
Sorry, wenn ich diesen Beitrag entstaube
@ camper
Hast Du eine Ahnung, wo ich das dokumentiert finde? Ich habe auf der Intel-Seite nichts gefunden, aber ich kann mir nicht vorstellen, dass das nirgends schwarz-auf-weiss steht.
-
Hallo.
Schau Dir das mal an:
http://www.agner.org/assem/pentopt.pdf
Kapitel 23.2:
FCOS
Micro-ops: 6
Microcode: 175
Latency: 207FPATAN
Micro-ops: 3
Microcode: 92
Latency: 187Gilt für P4.
Gruß
-
Das waere schon mal was, aber gibt es noch eine primaere Quelle? Eine Auflistung der unterstuetzten trigonometrischen Funktionen muesste ja schon reichen.