Warum fünktioniert MathEx3DS_SphereRadiusAndAngle() nicht?

  • Guckt sich mal bitte einer diese Funktion an?

    Spoiler anzeigen
    [autoit]

    Func MathEx3DS_SphereRadiusAndAngle($cX, $cY, $cZ, $pX, $pY, $pZ)
    If Not IsNumber($cX) Then
    SetError(1)
    Return 0
    EndIf
    If Not IsNumber($cY) Then
    SetError(2)
    Return 0
    EndIf
    If Not IsNumber($cZ) Then
    SetError(3)
    Return 0
    EndIf
    If Not IsNumber($pX) Then
    SetError(4)
    Return 0
    EndIf
    If Not IsNumber($pY) Then
    SetError(5)
    Return 0
    EndIf
    If Not IsNumber($pZ) Then
    SetError(6)
    Return 0
    EndIf
    Dim $Return[3]
    $Width=$pX-$cX
    $Height=$pY-$cY
    $Depth=$pZ-$cZ
    $Radius=MathExSTE_Cuboid_GetRoomDiagonal($Width, $Height, $Depth)
    ;ATan
    $Phi=ATan($Width/$Height*$MATHEX_CONST_RADIAN)
    $Theta=ACos($Depth/$Radius*$MATHEX_CONST_RADIAN)
    $Return[0]=$Radius
    $Return[1]=$Theta
    $Return[2]=$Phi
    Return $Return
    EndFunc

    [/autoit]

    Ich Will damit einen beliebigen Punkt im Koordinatensystem mit Hilfe einer Kugel zugänglich machen.

    Danke

    PS: Sinn der Funktion :Du gibst die Koordinaten von einem Punkt an, dessen Koordinaten/Winkel relativ zu einem ausgewählten Punkt haben möchtest :rolleyes:

  • Was macht die Funktion?
    Wo kommt sie her?
    Was willst du genau damit erreichen?
    Was ist konkret das Problem das du mit dieser Funktion hast?


    1. Du gibst die Koordinaten von einem Punkt an, dessen Koordinaten/Winkel relativ zu einem ausgewählten Punkt haben möchtest

    2. Hab ich selber gemacht

    3. 1.

    4. Es kommen keine korrekten werte Raus (r=1,73; theta=1,56; phi=0,01)

  • Also möchtest du relative Kugelkoordinaten eines Punktes p bezüglich einen Punktes c?
    Testen kann deine Funktion sowieso keiner da du sie selbst geschrieben hast und Funktionen angesprochen werden die nicht enthalten sind.

    Daher hab ich mal eine eigene Funktion gebastelt:

    Spoiler anzeigen
    [autoit]

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

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

    $a_Kugelkoordinaten = MathEx3DS_SphereRadiusAndAngle(0, 0, 0, 10, 10, 10)
    _ArrayDisplay($a_Kugelkoordinaten)

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

    Func MathEx3DS_SphereRadiusAndAngle(Const $cX, Const $cY, Const $cZ, Const $pX, Const $pY, Const $pZ)
    If Not IsNumber($cX) Then Return SetError(1, 1, 0)
    If Not IsNumber($cY) Then Return SetError(1, 2, 0)
    If Not IsNumber($cZ) Then Return SetError(1, 3, 0)
    If Not IsNumber($pX) Then Return SetError(1, 4, 0)
    If Not IsNumber($pX) Then Return SetError(1, 5, 0)
    If Not IsNumber($pX) Then Return SetError(1, 6, 0)

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

    Local Const $dx = $pX - $cX
    Local Const $dy = $pY - $cY
    Local Const $dz = $pZ - $cZ

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

    Local $f_r = Sqrt($dx ^ 2 + $dy ^ 2 + $dz ^ 2)
    Local $phi = ATan2($dy, $dx)
    Local $theta = ATan2($dx, $dz)

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

    Local $a_Ret[3] = [$f_r, $phi, $theta]
    Return $a_Ret
    EndFunc ;==>MathEx3DS_SphereRadiusAndAngle

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

    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]


    Winkelangaben in Radiant.

  • Danke AspirinJunkie

    Aber leider funktioniert es auch nicht so, obwohl es auch einleuchtend ist. eigendlich müssten nähmlich sowohl Tetha=45° als auch Phi=45° sein.

    Warum? Hiiiiilfeeeeee ;(.

    Hier ist der Code mal mit allen Funktionen:

    Spoiler anzeigen
    [autoit]

    Global Const $MATHEX_CONST_PI = 3.14159265358979
    Global Const $MATHEX_CONST_RADIAN = ($MATHEX_CONST_PI/180)

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

    Func MathEx3DS_SphereRadiusAndAngle($cX, $cY, $cZ, $pX, $pY, $pZ)
    If Not IsNumber($cX) Then
    SetError(1)
    Return 0
    EndIf
    If Not IsNumber($cY) Then
    SetError(2)
    Return 0
    EndIf
    If Not IsNumber($cZ) Then
    SetError(3)
    Return 0
    EndIf
    If Not IsNumber($pX) Then
    SetError(4)
    Return 0
    EndIf
    If Not IsNumber($pY) Then
    SetError(5)
    Return 0
    EndIf
    If Not IsNumber($pZ) Then
    SetError(6)
    Return 0
    EndIf
    Dim $Return[3]
    $Width=$pX-$cX
    $Height=$pY-$cY
    $Depth=$pZ-$cZ
    $Radius=MathExSTE_Cuboid_GetRoomDiagonal($Width, $Height, $Depth)
    ;ATan
    $Phi=ATan($Width/$Height*$MATHEX_CONST_RADIAN)
    $Theta=ACos($Depth/$Radius*$MATHEX_CONST_RADIAN)
    $Return[0]=$Radius
    $Return[1]=$Theta
    $Return[2]=$Phi
    Return $Return
    EndFunc

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

    Func MathExSTE_Cuboid_GetRoomDiagonal($a, $b, $c)
    Return Sqrt($a*$a+$b*$b+$c*$c)
    EndFunc ;==> MathExSTE_Cuboid_GetRoomDiagonal

    [/autoit]
  • Aber leider funktioniert es auch nicht so, obwohl es auch einleuchtend ist. eigendlich müssten nähmlich sowohl Tetha=45° als auch Phi=45° sein.

    Du meinst für dein Beispiel mit Punkt c = <0,0,0> und Punkt p = <10,10,10>?
    Da kommt doch 45°, 45° heraus.

    Vorsichtshalber zitiere ich mich einfach mal selbst:

    Winkelangaben in Radiant.

    P.S.: du brauchst mir keine PN schicken - ich krieg das auch so mit ;)

  • Für was steht eig $ny bzw. $nx?

    Die kartesische x-und y-Koordinate bzw, kartesische Koordinatendifferenz.

    Und wie Funktioniert deine ATan funktion?

    Das ist der quadrantenkorrekte Arkustangens welcher meistens als atan2 bezeichnet wird.
    Der normale Arkustangens hat nur einen Wertebereich zwischen -π/2 und +π/2. Für eine Umrechnung von kartesischen in Polarkoordinaten brauchen wir allerdings eine Definition für den gesamten möglichen Wertebereich.
    Dies ist die atan2-Funktion welche anhand der Vorzeichen der x-und-y-Koordinate den Kreisquadranten ermittelt und entsprechend das Ergebnis des Arkustangens verändert um so die korrekte Quadrantenangabe zu erhalten.
    Ob die Funktion von mir ist oder von woanders weiß ich nicht mehr - die Notation spricht eher dafür dass ich sie irgendwo anders her habe.
    Ist aber eh kein Hexenwerk sondern nur einfache Abfragen des Quadranten.