1 |
+ |
Imports System.Math |
2 |
+ |
|
3 |
|
Module Outils_Math |
4 |
|
|
5 |
|
|
534 |
|
|
535 |
|
trapezes = aire |
536 |
|
End Function |
537 |
+ |
|
538 |
+ |
|
539 |
+ |
|
540 |
|
Function IntegrationGauss(ByRef n As Integer, Optional ByRef noFunction As Integer = 1) As Double |
541 |
|
Dim i As Integer |
542 |
|
Dim temp As Double |
756 |
|
' function qui effectue la rotation d'un point Pt par le vecteur UNITAIRE u |
757 |
|
Public Function Rotation2D(ByRef u() As Double, ByVal Pt() As Double) As Double() |
758 |
|
Dim temp(1) As Double |
759 |
< |
Dim longueur As Double = Math.Sqrt(u(0) * u(0) + u(1) * u(1)) |
760 |
< |
u(0) /= longueur |
761 |
< |
u(1) /= longueur |
759 |
> |
'Dim longueur As Double = Math.Sqrt(u(0) * u(0) + u(1) * u(1)) |
760 |
> |
'u(0) /= longueur |
761 |
> |
'u(1) /= longueur |
762 |
> |
|
763 |
> |
Dim test(2) As Double |
764 |
> |
test(0) = 1 |
765 |
> |
'Debug.Print(Outils_Math.Angle2Vecteurs(test, u)) |
766 |
> |
'Debug.Print(Outils_Math.Angle2Vecteurs(test, Pt)) |
767 |
> |
|
768 |
> |
'temp(0) = u(0) * Pt(0) - u(1) * Pt(1) |
769 |
> |
'temp(1) = u(1) * Pt(0) + u(0) * Pt(1) |
770 |
> |
|
771 |
> |
'Debug.Print(Outils_Math.Angle2Vecteurs(test, temp)) |
772 |
> |
|
773 |
> |
Dim u2(2) As Double |
774 |
> |
u2(0) = u(0) |
775 |
> |
u2(1) = u(1) |
776 |
> |
Dim angleInit As Double = Math.Atan2(u(1), u(0)) |
777 |
> |
Dim anglePt As Double = Math.Atan2(Pt(1), Pt(0)) |
778 |
> |
Dim longueur As Double = Math.Sqrt(Pt(0) * Pt(0) + Pt(1) * Pt(1)) |
779 |
> |
|
780 |
> |
Dim anglefinal As Double = anglePt + angleInit |
781 |
> |
temp(0) = Math.Cos(anglefinal) * longueur |
782 |
> |
temp(1) = Math.Sin(anglefinal) * longueur |
783 |
|
|
784 |
< |
temp(0) = u(0) * Pt(0) - u(1) * Pt(1) |
759 |
< |
temp(1) = u(1) * Pt(0) + u(0) * Pt(1) |
784 |
> |
Return temp |
785 |
|
|
786 |
+ |
End Function |
787 |
|
|
788 |
|
|
789 |
< |
Return temp |
789 |
> |
'Private Function Angle2D(ByRef u() As Double) As Double |
790 |
> |
' If Math.Sign(u(0)) = 1 AndAlso Math.Sign(u(1)) = 1 Then |
791 |
> |
' Return (Math.Atan(u(1) / u(0))) |
792 |
> |
' ElseIf Math.Sign(u(0)) = -1 AndAlso Math.Sign(u(1)) = 1 Then ' 2nd quadrant |
793 |
> |
' Return (Math.Atan(u(1) / u(0))) |
794 |
> |
' ElseIf Math.Sign(u(0)) = -1 AndAlso Math.Sign(u(1)) = 1 Then ' 3ieme quadrant |
795 |
> |
' Return (Math.Atan(u(1) / u(0))) + 2 * Math.PI |
796 |
> |
' Else |
797 |
> |
' Return (Math.Atan(u(1) / u(0))) + 2 * Math.PI |
798 |
> |
' math. |
799 |
> |
' End If |
800 |
> |
'End Function |
801 |
|
|
765 |
– |
End Function |
802 |
|
|
803 |
|
Public Sub Rotation2D(ByRef u() As Double, ByRef Ptx As Double, ByRef Pty As Double) |
804 |
|
Dim temp(1) As Double |
814 |
|
|
815 |
|
End Sub |
816 |
|
|
817 |
+ |
|
818 |
+ |
''' <summary> |
819 |
+ |
''' Retourne l'angle entre 2 vecteurs |
820 |
+ |
''' </summary> |
821 |
+ |
''' <param name="u">Le premier vecteur</param> |
822 |
+ |
''' <param name="v">Le second vecteur</param> |
823 |
+ |
''' <returns>Un angle en radian</returns> |
824 |
+ |
''' <remarks>Retourne Pi si les 2 vecteurs sont d'orientation identique mais de direction opposés</remarks> |
825 |
|
Public Function Angle2Vecteurs(ByRef u() As Double, ByRef v() As Double) As Double |
826 |
|
Dim temp As Double |
827 |
|
temp = Outils_Math.Prod_scalaire(u, v) / norme(u) / norme(v) |
832 |
|
End If |
833 |
|
End Function |
834 |
|
|
835 |
+ |
|
836 |
+ |
''' <summary> |
837 |
+ |
''' Compare 2 vecteur de dimension 3 |
838 |
+ |
''' </summary> |
839 |
+ |
''' <param name="u">Premier Vecteur</param> |
840 |
+ |
''' <param name="v">Second vecteur</param> |
841 |
+ |
''' <returns>0 si sans rapport, 1 si identiques, 2 si sens inverse, 3 si même sens mais norme différente, 4 si norme et sens différent</returns> |
842 |
+ |
''' <remarks>Non optimisé pour les vecteurs unitaires</remarks> |
843 |
+ |
Public Function ComparerVecteurs3D(ByRef u() As Double, ByRef v() As Double) As Byte |
844 |
+ |
|
845 |
+ |
If u.GetUpperBound(0) <> 2 AndAlso v.GetUpperBound(0) <> 2 Then Return 0 |
846 |
+ |
If Math.Abs(u(0) - v(0)) < 0.0005 AndAlso Math.Abs(u(1) - v(1)) < 0.0005 AndAlso Math.Abs(u(1) - v(1)) < 0.0005 Then Return 1 |
847 |
+ |
If Math.Abs(u(0) + v(0)) < 0.0005 AndAlso Math.Abs(u(1) + v(1)) < 0.0005 AndAlso Math.Abs(u(1) + v(1)) < 0.0005 Then Return 2 |
848 |
+ |
|
849 |
+ |
Dim u2() As Double = unitaire(u) |
850 |
+ |
Dim v2() As Double = unitaire(v) |
851 |
+ |
|
852 |
+ |
If Math.Abs(u2(0) - v2(0)) < 0.0005 AndAlso Math.Abs(u2(1) - v2(1)) < 0.0005 AndAlso Math.Abs(u2(1) - v2(1)) < 0.0005 Then Return 3 |
853 |
+ |
If Math.Abs(u2(0) + v2(0)) < 0.0005 AndAlso Math.Abs(u2(1) + v2(1)) < 0.0005 AndAlso Math.Abs(u2(1) + v2(1)) < 0.0005 Then Return 4 |
854 |
+ |
|
855 |
+ |
Return 0 |
856 |
+ |
|
857 |
+ |
End Function |
858 |
+ |
|
859 |
+ |
''' <summary> |
860 |
+ |
''' Fonction qui inverse le sens d'un vecteur |
861 |
+ |
''' </summary> |
862 |
+ |
''' <param name="u">Le vecteur</param> |
863 |
+ |
''' <returns>Un vecteur de direction inverse</returns> |
864 |
+ |
''' <remarks></remarks> |
865 |
+ |
Public Function InverserVecteur(ByRef u() As Double) As Double() |
866 |
+ |
Dim v() As Double |
867 |
+ |
ReDim v(u.GetUpperBound(0)) |
868 |
+ |
|
869 |
+ |
For i As Integer = 0 To u.GetUpperBound(0) |
870 |
+ |
v(i) = -u(i) |
871 |
+ |
Next |
872 |
+ |
Return v |
873 |
+ |
End Function |
874 |
+ |
|
875 |
+ |
|
876 |
+ |
|
877 |
|
End Module |