Code permettant de calculer la rotation d'un point en 3D autour d'un vecteur.
Source / Exemple :
'' Ne pas oublier d'initialiser la constante DEGTORAD permettant de convertir les degrée en radian
'' globalDEGTORAD As Double
'' Dans form.laod par exemple je rajoute : DEGTORAD = (4 * Atn(1)) / 180
''
''
'---------------------------------------------------------------------------
' Point en 3D
'---------------------------------------------------------------------------
Public Type Point3
X As Double
Y As Double
Z As Double
End Type
global PI As Double
global RADTODEG As Double
global DEGTORAD As Double
Function Rotation3D(Vect As Point3, Angle As Double, P1 As Point3) As Point3
Dim MRotation(2, 2) As Double
Dim Row As Integer
Dim Col As Integer
Dim Mid As Integer
Dim I(2, 2) As Double
Dim A(2, 2) As Double
Dim A2(2, 2) As Double
Dim Sn As Double
Dim CosM1 As Double
Dim AngleRadian As Double
AngleRadian = Angle * DEGTORAD
' Matrice Identité
I(0, 0) = 1: I(0, 1) = 0: I(0, 2) = 0:
I(1, 0) = 0: I(1, 1) = 1: I(1, 2) = 0:
I(2, 0) = 0: I(2, 1) = 0: I(2, 2) = 1:
' Rotation autour du vecteur
A(0, 0) = 0: A(0, 1) = -Vect.Z: A(0, 2) = Vect.Y:
A(1, 0) = Vect.Z: A(1, 1) = 0: A(1, 2) = -Vect.X:
A(2, 0) = -Vect.Y: A(2, 1) = Vect.X: A(2, 2) = 0:
' A2 = A*A
For Row = 0 To 2
For Col = 0 To 2
A2(Row, Col) = 0
For Mid = 0 To 2
A2(Row, Col) = A2(Row, Col) + A(Row, Mid) * A(Mid, Col)
Next Mid
Next Col
Next Row
Sn = Sin(AngleRadian)
CosM1 = 1 - Cos(AngleRadian)
' rotation est I+sin(angle)*A+[1-cos(angle)]*A*A'
For Row = 0 To 2
For Col = 0 To 2
MRotation(Row, Col) = I(Row, Col) + Sn * A(Row, Col) + CosM1 * A2(Row, Col)
Next Col
Next Row
Rotation3D.X = MRotation(0, 0) * P1.X + MRotation(0, 1) * P1.Y + MRotation(0, 2) * P1.Z
Rotation3D.Y = MRotation(1, 0) * P1.X + MRotation(1, 1) * P1.Y + MRotation(1, 2) * P1.Z
Rotation3D.Z = MRotation(2, 0) * P1.X + MRotation(2, 1) * P1.Y + MRotation(2, 2) * P1.Z
End Function
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.