Winkel ausrechnen

  • Hey, ich hoffe ihr könnt mir mal wieder helfen.
    Und zwar hier einfach direkt mal ein Bild

    [Blockierte Grafik: http://s7.directupload.net/images/110406/45s9tr42.png]

    Und zwar wollte ich den gekennzeichneten Winkel ausrechnen.
    Und zwar hiermit:

    Spoiler anzeigen
    [autoit]

    MsgBox(0,"",_GetWinkel2(100, 100, 100, 300))

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

    Func _GetWinkel2($iX1, $iY1, $iX2, $iY2)
    Local $degToRad = 180 / 3.14159265358979
    Local $iA = $iX1 - 1
    Local $iB = Sqrt(Abs($iX2 - $iX1)^2 + Abs($iY2 - $iY1)^2)
    ConsoleWrite('Länge = ' & $iB & @CRLF)
    Local $iWinkel = ACos(($iA / $iB)) * $degToRad
    Return $iWinkel
    EndFunc

    [/autoit]

    Bei dem Beispiel müsste ja exakt 90° rauskommen, jedoch passt irgendwas nicht,
    Seht ihr einen Fehler ?

    Edit: erwähnen sollte ich vllt, dass der Punkt ganz links immer horizontal zu punkt 1 liegt.

    mfg

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Spoiler anzeigen
    [autoit]

    #include <Misc.au3>
    Global Const $PI = ACos(-1)

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

    MsgBox(0, "", _GetWinkel2(100, 100, 110, 95, True))

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

    Func _GetWinkel2(Const $iX1, Const $iY1, Const $iX2, Const $iY2, Const $bDegree = True)
    Local $fAngle = _ATan2($iX1 - $iX2, $iY1 - $iY2) - $PI / 2
    Return _Iif($bDegree, $fAngle * 180 / $PI, $fAngle)
    EndFunc ;==>_GetWinkel2

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

    ; Quadrantenkorrekte Arcus-Tanges Funktion
    Func _ATan2(Const $nY, Const $nX)
    Local $nResult

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

    If IsNumber($nY) = 0 Then
    SetError(1)
    Return 0
    ElseIf IsNumber($nX) = 0 Then
    SetError(1)
    Return 0
    EndIf
    If $nX = 0 Then
    If $nY > 0 Then
    $nResult = $PI / 2.0
    ElseIf $nY < 0 Then
    $nResult = 3.0 * $PI / 2.0
    Else
    SetError(2)
    Return 0
    EndIf
    ElseIf $nX < 0 Then
    $nResult = ATan($nY / $nX) + $PI
    Else
    $nResult = ATan($nY / $nX)
    EndIf
    While $nResult < 0
    $nResult += 2.0 * $PI
    WEnd
    Return $nResult
    EndFunc ;==>_ATan2

    [/autoit]

    Edit: Angepasst - die erste Version war für geodätische Koordinatensysteme gedacht (X und Y vertauscht).

    Einmal editiert, zuletzt von AspirinJunkie (6. April 2011 um 18:54)