Coordonnées polaires vers cartésiennes et inversement

Contenu du snippet

Voici un code pour retrouver un vecteur en fonction des coordonées polaires et inversement

ce que j'appelle coordonnées polaires c'est un angle vertical qui va de 0° en haut de la sphère à 180° en bas
et un angle équatorial qui va de 0° derrière la sphère à 360° (fait un tour complet de la droite vers la gauche)

A noter que pour renvoyer les coordonnées polaires je n'ai pas trouvé mieux que de créer un vexteur 2 car une fonction ne renvoi qu'une valeur
    Function coordonnées_polaires_vers_cartésiennes(ByVal origine As Vector3, ByVal angle_XY_vertical As Single, ByVal angle_XZ_equatorial As Single, ByVal rayon As Single)
        'Angle vertical de 0° (haut) jusque 180°MAXIMUM (180° sont en bas) 
        'Angle équatorial : 0° (0° derrière 180° devant) jusque 360°
        'APRES 180DEGRES L'ANGLE VERTICAL CHANGE L'ANGLE EQUATORIAL 
      If angle_XY_vertical < 0 Then
            angle_XY_vertical = angle_XY_vertical + 180
            angle_XZ_equatorial = angle_XZ_equatorial - 180
        End If
        If angle_XY_vertical > 180 Then
            angle_XY_vertical = angle_XY_vertical - 180
            angle_XZ_equatorial = angle_XZ_equatorial + 180
        End If
       If angle_XZ_equatorial < 0 Then angle_XZ_equatorial = angle_XZ_equatorial + 360
        If angle_XZ_equatorial > 360 Then angle_XZ_equatorial = angle_XZ_equatorial - 360
        Dim longitude, latitude As Single
        If angle_XZ_equatorial > 270 Then
            longitude = 360 - angle_XZ_equatorial + 90
        Else
            longitude = 90 - angle_XZ_equatorial
        End If
        If angle_XY_vertical > 270 Then
            latitude = 360 - angle_XY_vertical + 90
        Else
            latitude = 90 - angle_XY_vertical
        End If
        latitude = Math.PI * latitude / 180
        longitude = Math.PI * longitude / 180
        Dim x, y, z As Decimal
        x = origine.X + rayon * Math.Cos(latitude) * Math.Cos(longitude)
        y = origine.Y + rayon * Math.Sin(latitude)
        z = origine.Z + rayon * Math.Cos(latitude) * Math.Sin(longitude)
        Return New Vector3(x, y, z)
    End Function

Function coordonnées_cartésiennes_vers_polaires(ByVal vectorA As Vector3, ByVal vectorB As Vector3) As Vector2
       'Angle vertical de 0° (haut) jusque 180°MAXIMUM (180°en bas)
        'Angle équatorial : 0° (derrière) jusque 360° de droite vers la gauche
        'Utilisation de la méthode normalize
        Dim c As Vector3 = vectorB - vectorA
        c.Normalize()
        Dim latitude, longitude As Single
        latitude = Math.Asin(c.Y)
         longitude = Math.Acos((c.X) / (Math.Cos(latitude) + 0.000001)) * 180 / Math.PI
        latitude = latitude * 180 / Math.PI
         If vectorB.Z - vectorA.Z < 0 Then longitude = -longitude
       Dim angle_XY_vertical As Single
        Dim angle_XZ_equatorial As Single
        If latitude <= 90 And latitude >= 0 Then
            angle_XY_vertical = 90 - latitude
        Else
            angle_XY_vertical = 360 - latitude + 90
        End If
        If longitude <= 90 And longitude >= 0 Then
            angle_XZ_equatorial = 90 - longitude
        Else
            angle_XZ_equatorial = 360 - longitude + 90
        End If
        If angle_XY_vertical < 0 Then angle_XY_vertical = angle_XY_vertical + 360
        If angle_XZ_equatorial < 0 Then angle_XZ_equatorial = angle_XZ_equatorial + 360
        If angle_XY_vertical > 360 Then angle_XY_vertical = angle_XY_vertical - 360
        If angle_XZ_equatorial > 360 Then angle_XZ_equatorial = angle_XZ_equatorial - 360
       If angle_XZ_equatorial > 0 Or angle_XZ_equatorial < 0 Or angle_XZ_equatorial = 0 Then
        Else
            angle_XZ_equatorial = 0
        End If
        If angle_XZ_equatorial = -360 Then angle_XZ_equatorial = 0
        Return New Vector2(angle_XY_vertical, angle_XZ_equatorial)
    End Function
    

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.