Welcher nächste Punkt auf welcher Geraden?
Strahl Dreieck Kollision
-
- [ offen ]
-
moritz1243 -
20. April 2010 um 16:30 -
Geschlossen -
Erledigt
-
-
Also - gegeben sei Punkt X und die Gerade g
Um den am nähsten liegenden Punkt auf der Gerade g zu finden muss der Bewegungsvektor von Punkt X zum gesuchten Punkt Y orthogonal zur Geraden g sein.
Algebraisch könnte ichs wieder vorrechnen ... -
Jo, das is keine Problem...
Einfach eine Ebene aufstellen mit dem Richtungsvektor von der Geraden durch den Punkt P.
Dann Schnittpunkt von Gerade und Ebene (Einsetzen von Geradengleichung in Ebenengleichung).
Mach ich gleich./Edit:
Spoiler anzeigen
[autoit]$schnittpunkt = _punkt("(3|4|5)", "(6|7|9)", "(9|10|11)")
[/autoit] [autoit][/autoit] [autoit]
MsgBox(0, "", $schnittpunkt)Func _punkt($Aufpunktgerade, $Richtungsvektorgerade, $dritterpunkt)
[/autoit] [autoit][/autoit] [autoit]
Local $splitarr[3] = [$Aufpunktgerade, $Richtungsvektorgerade, $dritterpunkt], $lambda[4]
For $i = 0 To 2
If Not StringRegExp($splitarr[$i], "\(\d+\|\d+\|\d+\)") Then Return -1
Next
$Aufpunktgerade = StringSplit(StringTrimRight(StringTrimLeft($splitarr[0], 1), 1), "|")
$Richtungsvektorgerade = StringSplit(StringTrimRight(StringTrimLeft($splitarr[1], 1), 1), "|")
$dritterpunkt = StringSplit(StringTrimRight(StringTrimLeft($splitarr[2], 1), 1), "|")
;neue Ebene 0 = $Richtungsvektorgerade * (x - $dritterpunkt)
; 0 = $Richtungsvektorgerade * x - c
; für x Geradengleichung einsetzen
; x = $Aufpunktgerade + lambda * $Richtungsvektorgerade
; 0 = $Richtungsvektorgerade * ($Aufpunktgerade + lambda * $Richtungsvektorgerade) - c
$lambda[1] = (0 - (_calculatevector($Richtungsvektorgerade, 'scalar', $Aufpunktgerade) - _calculatevector($Richtungsvektorgerade, 'scalar', $dritterpunkt))) / _calculatevector($Richtungsvektorgerade, 'scalar', $Richtungsvektorgerade)
$lambda[2] = $lambda[1]
$lambda[3] = $lambda[1]
; lamda einsetzen
$ergebnis = _calculatevector($Aufpunktgerade, '+', _calculatevector($lambda, '*', $Richtungsvektorgerade))
Return '(' & $ergebnis[1] & '|' & $ergebnis[2] & '|' &$ergebnis[3] & ')'
EndFunc ;==>_intersectionFunc _calculatevector($parameter1, $arithmetic, $parameter2)
[/autoit]
; kann vektoren addieren, subtrahieren, dividieren, multiplizieren + kreuzprodukt ausrechnen ($aithmetic muss 'x' sein für Kreuzprodukt)
; + Skalarprodukt ($aithmetic muss 'scalar' sein für Skalarprodukt)
Switch $arithmetic
Case 'scalar'
Return $parameter1[1] * $parameter2[1] + $parameter1[2] * $parameter2[2] + $parameter1[3] * $parameter2[3]
Case 'x'
Local $result[4]
$result[1] = ($parameter1[2] * $parameter2[3]) - ($parameter1[3] * $parameter2[2])
$result[2] = $parameter1[3] * $parameter2[1] - $parameter1[1] * $parameter2[3]
$result[3] = $parameter1[1] * $parameter2[2] - $parameter1[2] * $parameter2[1]
Case Else
Local $result[4]
$result[1] = Execute($parameter1[1] & $arithmetic & $parameter2[1])
$result[2] = Execute($parameter1[2] & $arithmetic & $parameter2[2])
$result[3] = Execute($parameter1[3] & $arithmetic & $parameter2[3])
EndSwitch
Return $result
EndFunc ;==>_calculatevectorWenns stimmt isses Glückssache. Ich kann mich kaum noch konzentrieren, rechne bitte nach :).
-
Funktioniert perfekt , danke
-
Noch ne kleine Frage und zwar wie bestimmt ich den schnittpunkt von zwei strahlen?
-
Gleichsetzen und aus dem Ergebnis kann man dann sehen ob es überhaupt einen Schnittpunkt gibt.
In dem Fall setzt man den ausgerechneten Wert des Skalar (r, s) in die jeweilige Geradengleichung ein und erhält den Schnittpunkt.anno2008 kann das sicherlich auch in Autoit
-
Jop habe ich mir auch schon so ähnlich gedacht
-
Ok ich kriegs nicht hin -.-, ich kann irgendwie immer alles weg kürzen nach den gleichsetzten???
-
Keiner ne Ideee?
-