Strahl Dreieck Kollision

  • 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)")
    MsgBox(0, "", $schnittpunkt)

    [/autoit] [autoit][/autoit] [autoit]

    Func _punkt($Aufpunktgerade, $Richtungsvektorgerade, $dritterpunkt)
    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 ;==>_intersection

    [/autoit] [autoit][/autoit] [autoit]

    Func _calculatevector($parameter1, $arithmetic, $parameter2)
    ; 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 ;==>_calculatevector

    [/autoit]

    Wenns stimmt isses Glückssache. Ich kann mich kaum noch konzentrieren, rechne bitte nach :).

    Einmal editiert, zuletzt von anno2008 (28. April 2010 um 23:05)

  • 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 :D