Winkel zwischen drei Punkten

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Christoph

Betreff: Winkel zwischen drei Punkten

BeitragSa, Nov 11, 2006 12:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,
ich habe ein Problemchen:
Ich erstelle per createpivot() 3 Punkte zufällig im Raum.
Der Erste ist mit dem Zweiten verbunden, der Zweite mit dem Dritten.
Nun ergibt sich ein Winkel zwischen den drei Punkten:
user posted image

Diesen Winkel möchte ich messen besser gesagt errechnen Wink , aber mir fällt keine Lösung dazu ein, vllt gibt es ja eine ganz einfache...

Habt ihr eine Idee wie ich Alpha herausfinde?

Lunatix

BeitragSa, Nov 11, 2006 12:43
Antworten mit Zitat
Benutzer-Profile anzeigen
öhm Satz des Pytagoras ?
Google mal oder schau auf Wiki
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen...

Christoph

BeitragSa, Nov 11, 2006 12:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
öhm Satz des Pytagoras ?


Ich dachte immer, dass der Satz des Pytagoras den direkten Weg ausrechnet...

Kann ich damit auch Winkel ausrechnen???

5k41

BeitragSa, Nov 11, 2006 12:45
Antworten mit Zitat
Benutzer-Profile anzeigen
naja also wenn du das nur ( wie du es ja machst ) auf 2 Achsen haben willst dann ist es relativ einfach! zwei mal Atan2 und die differenz, wobei ich grade überlege, dass es bestimmt noch einfacher gehen muss...

MfG
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

Christoph

BeitragSa, Nov 11, 2006 12:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Ich erstelle per createpivot() 3 Punkte zufällig im Raum.


Ich nutze alle drei Achsen, mit zwei Achsen wüsste ich mir selbst zu helfen...

Mr.Keks

BeitragSa, Nov 11, 2006 12:55
Antworten mit Zitat
Benutzer-Profile anzeigen
http://de.wikipedia.org/wiki/Skalarprodukt <- viel spaß damit! Smile))

(tipp: der englische artikel ist etwas netter)
http://en.wikipedia.org/wiki/Dot_product

user posted image
das ist die formel, die du brauchst. aber vorsicht: das a und b da sind vektoren und die multiplikation da muss als skalarprodukt berechnet werden. wie das geht, steht auf den oben genannten seiten.
MrKeks.net
  • Zuletzt bearbeitet von Mr.Keks am Sa, Nov 11, 2006 12:57, insgesamt einmal bearbeitet

Black Spider

BeitragSa, Nov 11, 2006 12:56
Antworten mit Zitat
Benutzer-Profile anzeigen
mit ATan2 kann man winkel ausrechnen. Ich sitze gerade an nem neuen Shader der über die Vektoren arbeitet,
und ich denke mit diesen müsstest du auch was anfangen können.
Wenn du den Winkel am 2. Pivot haben willst, dann musst du den Winkel vom
Vektor des 1. zum 2. Pivots und dem Vektor des 3. zum 2. Pivots berechnen.

Etwas über Vektoren:
http://de.wikipedia.org/wiki/Vektor

Das Skalarprodukt sollte die auch helfen können; wenn man die gleichung umformt, dann kann man den Cosinus des Winkels ausrechnen:
http://de.wikipedia.org/wiki/Skalarprodukt

Falls du zu einem ergebnis kommst, teils mir bitte mit, denn mit dem Shader bin ich gerade in einer Sackgasse;
Coming soon:
http://img132.imageshack.us/im...im2ab6.gif

5k41

BeitragSa, Nov 11, 2006 12:59
Antworten mit Zitat
Benutzer-Profile anzeigen
also ein Winkel an sich ist ja schonmal 2D, also musst du dir erstmal überlegen welche der mindestens 9 Winkel die man so sieht du brauchst!
Mir ist grad noch die beste Lösung für dein Bild da oben eingefallen! Der Cosinussatz:
a² = b² + c² - 2 * b * c * cos (alpha) | / cos (alpha)
a² / cos ( alpha ) = b² + c² - 2 * b * c | / a²
cos ( alpha ) = (b² + c² - 2 * b * c) / a²
alpha = Acos ( (b² + c² - 2 * b * c) / a² )

Funktioniert in jedem Dreieck.
Für die Umformung vom normalen Cosinussatz keine Garantie... Confused

MfG
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

Christoph

BeitragSa, Nov 11, 2006 13:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Gibt es auch eine für einen 9. Klässler verständliche Formel? Smile

Zitat:
also ein Winkel an sich ist ja schonmal 2D

Ich verstehe was du meinst. Die 3 Punkte liegen immer auf einer Ebene (ist bei einem Dreieck immer so...).

Ich hätte das irgendwie versucht, so zu lösen:

Ich peile mit dem 2. Punkt den 1. an. (pointentitity)
Dann merke ich mir die Winkel (Pitch, Yaw)
Dann peile ich mit dem 2. Punkt den 3. an. (pointentity)
Dann merke ich mir die Winkel (Pitch, Yaw)

Aber was fange ich jetzt mit diesen 4 Winkeln an? Ich komme irgendwie nicht weiter

Vertex

BeitragSa, Nov 11, 2006 13:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei den 3 Ortsvektoren A, B und C geht das theoretisch dann so:
EdgeAB = B - A
EdgeCB = B - C
Alpha = ArcCos(EdgeAB x EdgeCB)/(|EdgeAB||EdgeCB|)

bzw. in Blitz:

Code: [AUSKLAPPEN]
Type TVector
   Field X#
   Field Y#
   Field Z#
End Type

Global A.TVector, B.TVector, C.TVector
Global EdgeAB.TVector, EdgeCB.TVector
Global DotProduct#, LengthAB#, LengthCB#
Global Angle#

A.TVector = New TVector
A\X = 0.0
A\Y = 0.0
A\Z = 0.0

B.TVector = New TVector
B\X = 0.0
B\Y = 0.0
B\Z = 0.0

C.TVector = New TVector
C\X = 0.0
C\Y = 0.0
C\Z = 0.0

EdgeAB = New TVector
EdgeAB\X = B\X - A\X
EdgeAB\Y = B\Y - A\Y
EdgeAB\Z = B\y - A\Z

EdgeCB = New TVector
EdgeCB\X = B\X - C\X
EdgeCB\Y = B\Y - C\Y
EdgeCB\Z = B\Z - C\Z

DotProduct = EdgeAB\X*EdgeCB\X + EdgeAB\Y*EdgeCB\Y + EdgeAB\Z*EdgeCB\Z

LengthAB = Sqr(EdgeAB\X*EdgeAB\X + EdgeAB\Y*EdgeAB\Y + EdgeAB\Z*EdgeAB\Z)
LengthCB = Sqr(EdgeCB\X*EdgeCB\X + EdgeCB\Y*EdgeCB\Y + EdgeAB\Z*EdgeCB\Z)

Angle# = ACos(DotProduct#/(LengthAB*LengthCB))


Musst entsprechend bei A, B und C die jeweiligen Koordinaten eintragen...

mfg olli
vertex.dreamfall.at | GitHub
 

Dreamora

BeitragSa, Nov 11, 2006 13:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Mr. Keks hat dir oben doch die Antwort auf deine Frage gegeben. Wo ist da das Problem, diese Methode zu nutzen?
Jede andere Variante wird im Endeffekt wieder auf dieser Lösung landen, sie wird dabei höchstens komplizierter aussehen.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Christoph

BeitragSa, Nov 11, 2006 13:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich werde es mal mit dieser Formel versuchen.
Vielen Dank erstmal

5k41

BeitragSa, Nov 11, 2006 14:10
Antworten mit Zitat
Benutzer-Profile anzeigen
bei meiner formel ( wenn die umformung richtig ist Confused ) Musst du nur a,b und c mit den seitenlängen in deinem Dreick ersetzen und fertig, also:
Code: [AUSKLAPPEN]

C
| \
|   \
A---B

und an der seite a liegt dann alpha, dieses Dreieck ist nur ein Beispiel, stell dir dein Dreieck dort vor und setz die längen ein!

MfG

~Edit~
so also ich versuch mich nochmal an der umformung, die von oben war wegen punkt vor strich bullshit ( die fetten Klammern sind nicht pflicht aber eigentlich unsichtbar wegen punkt vor strich vorhanden, was ich oben vergas ):
a² = b² + c² - ( 2 * b * c * cos (alpha) ) | + ( 2 * b * c * cos ( alpha ) ) , -a²
2 * b * c * cos ( alpha ) = b² + c² - a² | / ( 2 * b * c )
cos ( alpha ) = ( b² + c² - a² ) / ( 2 * b * c )
alpha = Acos ( ( b² + c² - a² ) / ( 2 * b * c ) )
JAAA! Das ist nun so richtig, also einfach die letzte Zeile in Blitz benutzen!
user posted image
soo grad nochmal dein Bild modifiziert, die kleinen Buchstaben sind die Seitennamen, die Bx-Cx usw. sind die berechnungen der Seiten.

Christoph

BeitragSa, Nov 11, 2006 15:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, danke @ all, das Problem hat sich jetzt erledigt Wink

Jetzt wollte ich euch noch ein weiteres (wahrscheinlich letztes) Mal etwas fragen:

Und zwar folgende Situation:

Ich habe den Winkel zwischen Punkt1/2/3 herausgefunden und stelle fest, dass er nicht so groß ist, wie er sein sollte. Nun will ich, ohne die Distanz der Punkte zueinander zu verändern, die Punkte so verschieben, dass der Winkel stimmt. Der 1. Punkt soll dabei so weit verschoben werden wie der dritte, d.h. sie teilen sich die Distanz, die man insgesamt zurücklegen muss, um den "falschen" Winkel zu korrigieren.

Bsp:
Der Winkel ist 50° groß. Er sollte eigentlich nur 90° groß sein.
Nun wird Punkt1 um 20° ((90°-50°)/2) rotiert. Das Rotationszentrum ist Punkt2 um die Distanz der Punkte gleich zu halten.
Nun wird auch Punkt3 um 20° ((90°-50°)/2) rotiert. Das Rotationszentrum ist Punkt2 um auch diese Distanz gleich zu halten.

user posted image

Ich steh auf dem Schlauch...

StepTiger

BeitragSa, Nov 11, 2006 15:08
Antworten mit Zitat
Benutzer-Profile anzeigen
x#=urx#+sin(winky#)*dist#*cos(winkx#)
y#=ury#+sin(winkx#)*dist#
z#=urz#+cos(winky#)*dist#*cos(winkx#)

hoffe, das hilft dir
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

Christoph

BeitragSa, Nov 11, 2006 15:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ging ja schnell Shocked
Stimmt, auf sin(), cos() hätt ich auch selbst kommen können. Thx

5k41

BeitragSa, Nov 11, 2006 15:14
Antworten mit Zitat
Benutzer-Profile anzeigen
nur so aus intresse, mit wessen lösung hast du nun eigentlich den Winkel berechnet?

MfG
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group