par Anonyme » 30 Avr 2005, 16:44
"Vincent BENNER - PAGE UP" wrote:
>Bonjour,
>
>Je suis en train d'implémenter un outil de conversion
>de coordonnées géographiques au format WGS84
>(données issues d'un GPS Garmin) vers le format
>UTM.
>
>J'ai trouvé sur le site de l'IGN tous les outils et autres
>algorithmes de conversion.
>
>Cependant, j'arrive à la dernière étape et je sèche
>car je dois, à priori, résoudre une équation avec des
>nombres complexes !
>
>Voici l'algorithme utilisé :
>
>C = c(e) e est une constante, c(e) est une fonction
>que j'ai réussi à implémenter. On obtient un tableau
>de C1 à C5
>
>L = L(Phi, e) : Phi est la latitude (en radians), L(a,b)
>est une fonction que j'ai réussi à implémenter.
>
>Teta = arcsin(sin(Lambda - LambdaC)/(ch(L)) : LambdaC
>est une constante, Lambda est la longitude (radians)
>
>Ls = L(Teta, 0) : on utilise à nouveau la fonction L(a,b)
>
>Delta = arctan (sh(L) / (cos(Lambda - LambdaC))
>
>
>
>Et maintenant, c'est là que je coince :
>
> PetitZ = Delta + i * Ls (i^2 = -1)
>
>
>
>
>GrandZ = n*C1*PetitZ + n*C2*sin(2 * k * PetitZ) +
> n*C3*sin(2 * k * PetitZ) + n*C4*sin(2 * k * PetitZ) +
> n*C5*sin(2 * k * PetitZ)
>
>
>
>X = Im(GrandZ)
>Y = Re(GrandZ)
>
>
>
>
>Voilà, je ne sais pas comment calculer PetitZ, ni Im(GrandZ) ni
>Re(Z).
>
>J'ai besoin de programmer cet algorithme en Visual Basic !!!
>
>Quelqu'un peut-il m'aider ?
>
>Merci d'avance,
>
>Vincent BENNER
>Contact : 03 80 66 29 04
>
Un nombre complexe a une partie réelle et une partie imaginaire, qu'on
écrit a+i*b. Par example, pour le complexe PetitZ, la partie réelle
est Delta, et Ls est la partie imaginaire. Le '+' est là juste comme
notation, ce n'est pas vraiment une addition.
Alors pour calculer GrandZ, il faut les opérations +, * et la fonction
sinus complexe, ceci devrait etre suffisant (contactez moi par email
si vous avez besoin de plus d'explications):
'--------------------
Option Explicit
Type Complexe
re As Double
im As Double
End Type
' Cosinus hyperbolique avec argument réel
Public Function Cosh(a As Double)
Cosh = (Exp(a) + Exp(-a)) / 2
End Function
' Sinus hyperbolique avec argument réel
Public Function Sinh(a As Double)
Sinh = (Exp(a) - Exp(-a)) / 2
End Function
' Additionner 2 complexes
Public Function AddComplexe(a As Complexe, b As Complexe) As Complexe
AddComplexe.re = a.re + b.re
AddComplexe.im = a.im + b.im
End Function
' Multipler 2 complexes
Public Function Mult2Complexe(a As Complexe, b As Complexe) As
Complexe
Mult2Complexe.re = a.re * b.re - a.im * b.im
Mult2Complexe.im = a.re * b.im + a.im * b.re
End Function
' Multiplier un complexe et un double
Public Function MultComplexeDouble(a As Complexe, b As Double) As
Complexe
MultComplexeDouble.re = a.re * b
MultComplexeDouble.im = a.im * b
End Function
' Sinus avec argument complexe
Public Function SinComplexe(a As Complexe) As Complexe
SinComplexe.re = Sin(a.re) * Cosh(a.im)
SinComplexe.im = Cos(a.re) * Sinh(a.im)
End Function