ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magicsld/Outils_Math.vb
Revision: 130
Committed: Wed Jul 30 21:26:03 2008 UTC (16 years, 9 months ago) by bournival
File size: 25259 byte(s)
Log Message:
Une mise à jour, car on aura peut-être besoin de mon code.

File Contents

# User Rev Content
1 bournival 130 Imports System.Math
2    
3 bournival 40 Module Outils_Math
4    
5    
6    
7    
8     #Region "calcul matriciel & vectoriel"
9    
10     Public Function Addition(ByRef A(,) As Double, ByRef B(,) As Double) As Double(,)
11     'additionne deux matrices et le résultat est renvoyé dans la fonction
12    
13     ' vérification que l'on peut additionner, si toutes les matrices sont de 1 à nb, on devrait pas faire ça car ça bouffe du temps...
14     Dim ua1 As Double, ub1 As Double
15     Dim ua2 As Double, ub2 As Double
16    
17     ua1 = UBound(A, 1)
18     ua2 = UBound(A, 2)
19     ub1 = UBound(B, 1)
20     ub2 = UBound(B, 2)
21    
22     If (Not ua1 - ub1 = 0) Or (Not ua2 - ub2 = 0) Then
23     MsgBox("deux matrices ne peuvent pas s'additionner")
24     Return Nothing
25     End If
26    
27     Dim matC(ua1, ua2) As Double
28    
29     Dim i, j As Integer
30     For i = 0 To ub1
31     For j = 0 To ub2
32     matC(i, j) = A(i, j) + B(i, j)
33     Next j
34     Next i
35    
36     Addition = matC
37     End Function
38    
39     Public Function addition(ByRef a() As Double, ByRef b() As Double) As Double()
40     ' addition de vecteurs
41    
42     If Not UBound(a) = UBound(b) Then
43     MsgBox("Deux vecteurs ne peuvent s'additionner...")
44     Return Nothing
45     End If
46    
47     Dim i As Integer
48     Dim c(UBound(a)) As Double
49    
50     For i = 0 To UBound(a)
51     c(i) = a(i) + b(i)
52     Next
53    
54     Return c
55     End Function
56    
57     Public Function multiscal(ByRef A(,) As Double, ByRef c As Double) As Double(,)
58     ' multiplie la matrice a par le scalaire c
59     Dim i As Integer
60     Dim j As Integer
61    
62     Dim B(UBound(A, 1), UBound(A, 2)) As Double
63    
64     For i = 0 To UBound(A, 1)
65     For j = 0 To UBound(A, 2)
66     B(i, j) = A(i, j) * c
67     Next j
68     Next i
69    
70     multiscal = B
71     End Function
72    
73     Public Function multiscal(ByRef A() As Double, ByRef c As Double) As Double()
74     'multiplie un vecteur par une certaine valeur
75     Dim i As Integer
76     Dim b(UBound(A)) As Double
77     For i = 0 To UBound(A)
78     b(i) = A(i) * c
79     Next
80    
81     multiscal = b
82     End Function
83    
84     Public Function reduit(ByRef A(,) As Double, Optional ByVal colonne As Integer = -1, Optional ByRef ligne As Integer = -1) As Double(,)
85     ' fonction qui retire une colonne et /ou une ligne d'une matrice
86     Dim temp(UBound(A, 1) - 1, UBound(A, 2) - 1) As Double
87     Dim i As Integer, j As Integer, k As Integer, l As Integer
88    
89    
90     For l = 0 To UBound(A)
91     If Not (l = ligne) Then
92     j = 0
93     For k = 0 To UBound(A)
94     If Not (k = colonne) Then
95     temp(i, j) = A(l, k)
96     j += 1
97     End If
98     Next k
99     i += 1
100     End If
101     Next l
102    
103    
104     reduit = temp
105     End Function
106    
107     Public Function reduit(ByRef A() As Double, Optional ByVal colonne As Integer = -1) As Double()
108     ' fonction qui retire un élément d'un vecteur
109     Dim temp(UBound(A)) As Double
110     Dim i As Double, l As Double
111    
112     While l < UBound(A)
113     If Not l = colonne Then
114     temp(i) = A(l)
115     l = l + 1
116     i = i + 1
117     Else
118     i = i + 1
119     End If
120     End While
121    
122     Return temp
123     End Function
124    
125     Public Function multiplication(ByVal A(,) As Double, ByVal B(,) As Double) As Double(,)
126     ' le vecteur C est redimensionné correctement
127     ' [A]*[B] = [C]
128     ' si B est un vecteur alors on va à la partie en bas
129    
130     Dim i, j, k, n, m As Integer
131     Dim c(,) As Double
132    
133     m = UBound(B, 2)
134     n = UBound(A, 1)
135    
136     If UBound(B, 1) <> UBound(A, 2) Then MsgBox(" Incompatibilité de matrices pour la multiplication") : Return Nothing
137    
138     ReDim c(n, m)
139    
140     For j = 0 To m
141     For i = 0 To n
142     For k = 0 To UBound(A, 2)
143     c(i, j) = c(i, j) + A(i, k) * B(k, j)
144     Next k
145     Next i
146     Next j
147    
148     multiplication = c
149     End Function
150    
151     Public Function multiplication(ByRef A(,) As Double, ByRef b() As Double) As Double()
152     ' le vecteur C est redimensionné correctement
153     ' [A]*{B} = {C}
154     ' B est un vecteur ligne
155    
156     Dim i, j, n, m As Integer
157     Dim c() As Double
158    
159     m = UBound(b)
160     n = UBound(A, 1)
161    
162     If UBound(A, 2) <> m Then MsgBox("Impossible de multiplier la matrice avec le vecteur, dimensions incompatibles!") : Return Nothing
163    
164     ' on multiplie une matrice et un vecteur
165    
166     ReDim c(m)
167    
168     For i = 0 To UBound(b)
169     For j = 0 To UBound(b)
170     c(i) = c(i) + A(i, j) * b(j)
171     Next j
172     Next i
173     Return c
174     End Function
175    
176     Public Function multiplication(ByRef a() As Double, ByRef B(,) As Double) As Double()
177     ' le vecteur C est redimensionné correctement
178     ' {A}*[B] = {C}
179     ' A est un vecteur colonne
180    
181     Dim i, j, n, m As Integer
182     Dim c() As Double
183    
184     m = UBound(a)
185     n = UBound(B, 2)
186    
187     If m <> UBound(B, 1) Then MsgBox("Impossible de multiplier le veteur par la matrice.") : Return Nothing
188    
189     ReDim c(m)
190    
191     For i = 0 To UBound(B)
192     For j = 0 To UBound(B)
193     c(i) = c(i) + a(j) * B(j, i)
194     Next j
195     Next i
196     Return c
197     End Function
198    
199     Public Function soustraction(ByRef A(,) As Double, ByRef B(,) As Double) As Double(,)
200     'C = A - B
201     Dim C(,) As Double
202     Dim m As Integer, n As Integer
203     m = UBound(A, 1)
204     n = UBound(A, 2)
205    
206     If (m <> UBound(B, 1)) Or (n <> UBound(B, 2)) Then MsgBox("Impossible de soustraire les matrices, dimensions non compatibles") : Return Nothing
207    
208     ReDim C(m, n)
209    
210     Dim i, j As Integer
211     For i = 0 To m
212     For j = 0 To n
213     C(i, j) = A(i, j) - B(i, j)
214     Next j
215     Next i
216     Return C
217     End Function
218    
219     Public Function transpose(ByRef A(,) As Double) As Double(,)
220    
221     Dim c(,) As Double
222     Dim i, j As Integer
223     ReDim c(UBound(A, 2), UBound(A, 1))
224    
225     For i = 0 To UBound(A, 1)
226     For j = 1 To UBound(A, 2)
227     c(j, i) = A(i, j)
228     Next j
229     Next i
230    
231     Return c
232     End Function
233    
234     Public Function gauss(ByRef A(,) As Double, ByRef C() As Double) As Double()
235     ' [A]{X} = {C}
236     ' les matrices doivent être déjà dimensionnées
237     Dim n As Integer
238     Dim i, j, k As Integer
239     Dim rapport As Double
240    
241     n = UBound(A, 1)
242     Dim rep() As Double
243     ReDim rep(n)
244    
245    
246     For i = 0 To n ' de gauche à droite
247     pivoter(i, A, C)
248    
249     'Call Form1.affiche(mat(), C())
250     'MsgBox i
251    
252     For j = i + 1 To n ' les lignes
253     rapport = A(j, i) / A(i, i)
254     For k = 1 To n ' les colonnes
255     A(j, k) = A(j, k) - A(i, k) * rapport
256     Next k
257     C(j) = C(j) - C(i) * rapport
258     Next j
259    
260     Next i
261    
262    
263     Dim stuff As Double
264     For i = n To 0 Step -1
265     stuff = 0
266     For j = i + 1 To n
267     stuff = stuff + A(i, j) * rep(j)
268     Next j
269     rep(i) = (C(i) - stuff) / A(i, i)
270     Next i
271     C = rep
272     gauss = rep
273     End Function
274    
275     Private Sub pivoter(ByVal i As Integer, ByRef mat(,) As Double, ByRef C() As Double)
276     ' sub qui pivote la ligne i de la matrice a ( et du vecteur C). Si et seulement si le pivotage est nécessaire.
277     Dim n As Integer
278     n = UBound(mat, 1)
279     Dim a_pivoter As Integer
280    
281     Dim z As Integer
282     Dim temp As Double
283     Dim tempC As Double
284    
285     For z = i To n
286     temp = mat(i, i)
287    
288     If mat(z, i) > Math.Abs(temp) Then ' on a trouvé une ligneà pivoter
289     temp = mat(z, i)
290     a_pivoter = z
291     End If
292     Next z
293     'MsgBox a_pivoter
294    
295     If a_pivoter <> 0 Then ' on pivote
296     ' on pivote la ligne i et la ligne a_pivoter
297     tempC = C(i)
298     C(i) = C(a_pivoter)
299     C(a_pivoter) = tempC
300    
301     For z = 0 To n
302     temp = mat(i, z)
303     mat(i, z) = mat(a_pivoter, z)
304     mat(a_pivoter, z) = temp
305     Next z
306    
307     End If
308     ' fin pivot
309     End Sub
310    
311     Private Function pivoter(ByVal i As Integer, ByRef mat(,) As Double) As Integer
312     ' sub qui pivote la ligne i de la matrice a ( et du vecteur C). Si et seulement si le pivotage est nécessaire.
313     Dim n As Integer
314     n = UBound(mat, 1)
315     Dim a_pivoter As Integer
316     pivoter = 1
317    
318     Dim z As Integer
319     Dim temp As Double
320    
321     For z = i To n
322     temp = mat(i, i)
323    
324     If mat(z, i) > Math.Abs(temp) Then ' on a trouvé une ligne à pivoter
325     temp = mat(z, i)
326     a_pivoter = z
327     pivoter = -1
328     End If
329     Next z
330    
331     If a_pivoter <> 0 Then ' on pivote
332    
333     For z = 0 To n
334     temp = mat(i, z)
335     mat(i, z) = mat(a_pivoter, z)
336     mat(a_pivoter, z) = temp
337     Next z
338    
339     End If
340     ' fin pivot
341     End Function
342    
343     Public Function norme(ByRef u() As Double) As Double
344     ' calcul la norme (longueur) d'un vecteur à xDimensions
345     Dim i As Integer
346     Dim temp As Double
347    
348     For i = 0 To UBound(u)
349     temp = temp + u(i) ^ 2
350     Next i
351     Return Math.Sqrt(temp)
352     End Function
353    
354     Public Function Prod_scalaire(ByRef u() As Double, ByRef v() As Double) As Double
355     ' fait le produit scalaire entre deux vecteurs
356     ' en notation indicielle: w = uivi
357     Dim i As Integer
358    
359     For i = 0 To UBound(u)
360     Prod_scalaire = Prod_scalaire + u(i) * v(i)
361     Next i
362    
363     End Function
364    
365     Public Function prod_vect3D(ByRef u() As Double, ByRef v() As Double) As Double()
366     ' fait le produit vectoriel entre les vecteur 3D u et v
367     ' [ i j k ]
368     ' | u1 u2 u3 |
369     ' [ v1 v2 v3 ]
370     '
371     ' w = (u2*v3 - u3*v2) i - (u1*v3 - u3*v1) j + (u1*v2-u2*v1) k
372     Dim w(2) As Double
373     w(0) = u(2) * v(3) - u(3) * v(2)
374     w(1) = -(u(1) * v(3) - u(3) * v(1))
375     w(2) = u(1) * v(2) - u(2) * v(1)
376    
377     prod_vect3D = w
378    
379     End Function
380    
381     Public Function unitaire(ByRef u() As Double) As Double()
382     ' prend le vecteur u et son vecteur unitaire v
383     Dim longueur As Double
384     Dim i As Integer
385     Dim v() As Double
386     ReDim v(UBound(u))
387    
388     Dim temp As Double
389     For i = 0 To UBound(u)
390     temp = temp + u(i) ^ 2
391     Next i
392     longueur = Math.Sqrt(temp)
393     For i = 0 To UBound(u)
394     v(i) = u(i) / longueur
395     Next i
396    
397     unitaire = v
398     End Function
399    
400     Public Function cosdir(ByRef u() As Double, ByRef v() As Double) As Double
401     ' retourne le cosinus entre deux vecteurs, u et v
402     cosdir = Prod_scalaire(u, v) / norme(u) / norme(v)
403     End Function
404    
405     Public Function projection(ByVal u() As Double, ByVal e() As Double) As Double
406     ' projette le vecteur u sur e et retourne
407     ' le résultat est la longueur sur le vecteur e
408     projection = norme(u) * cosdir(u, e)
409     End Function
410    
411    
412    
413     Public Function det(ByRef A(,) As Double) As Double
414     ' calcule le détrminant de la matrice A
415     Dim i As Long
416     Dim temp As Double
417     ' contrôle d'erreur:
418     If UBound(A, 1) <> UBound(A, 2) Then
419     MsgBox("Impossible de calculer le déterminant, la matrice n'est pas carrée")
420     End If
421    
422     Dim n As Integer
423     Dim j As Integer, k As Integer
424     Dim rapport As Double
425    
426     n = UBound(A, 1)
427     Dim rep() As Double
428     ReDim rep(n)
429    
430     temp = 1
431     For i = 0 To n ' de gauche à droite
432     temp *= pivoter(i, A)
433    
434     For j = i + 1 To n ' les lignes
435     rapport = A(j, i) / A(i, i)
436     For k = 1 To n ' les colonnes
437     A(j, k) = A(j, k) - A(i, k) * rapport
438     Next k
439     Next j
440     Next i
441    
442     ' à partir d'ici on a une matrice triangulaire suppérieure. (mais je me casse pas la tête à mettre des 0...)
443    
444     For i = 0 To UBound(A)
445     temp *= A(i, i)
446     Next
447    
448     Return temp
449     End Function
450    
451    
452     Public Function det2(ByRef A(,) As Double) As Double
453     ' calcul du déterminant à l'aide du cofacteur
454    
455     Dim i As Long
456     Dim temp As Double
457     ' contrôle d'erreur:
458     If UBound(A, 1) <> UBound(A, 2) Then
459     MsgBox("Impossible de calculer le déterminant, la matrice n'est pas carrée")
460     End If
461    
462     If UBound(A) = 0 Then det2 = A(0, 0) : Exit Function
463     Dim B(,) As Double
464     ReDim B(UBound(A) - 1, UBound(A) - 1)
465    
466    
467     For i = 0 To UBound(A)
468     B = (reduit(A, i, 0))
469     temp += (-1) ^ i * det2(reduit(A, i, 0)) * A(0, i)
470     Next i
471    
472     det2 = temp
473    
474     End Function
475    
476    
477     'Function qui compare 2 vecteurs. retourne 0 si non alignés. 1 si dans le même sens, 2 si de sens opposé.
478     Public Function CompareSens(ByRef u() As Double, ByRef v() As Double, Optional ByVal Epsilon As Double = 0.000000001) As Integer
479     If ((u(0) - v(0)) < Epsilon) And ((u(1) - v(1)) < Epsilon) And ((u(2) - v(2)) < Epsilon) Then Return 1
480     If ((u(0) + v(0)) < Epsilon) And ((u(1) + v(1)) < Epsilon) And ((u(2) + v(2)) < Epsilon) Then Return 2
481     Return 0
482     End Function
483    
484     #End Region
485    
486     #Region "calcul intégral"
487    
488    
489     Function rectangles(ByRef dx As Double, Optional ByVal a As Double = 0, Optional ByVal b As Double = 1) As Double
490     ' function qui calcule l'intégrale de f par la méthode des rectangles
491     Dim ecart As Double
492     Dim i As Integer
493     Dim nb As Long
494     Dim x As Double
495     Dim aire As Double
496    
497     ecart = b - a
498    
499     nb = CLng(ecart / dx)
500     dx = ecart / nb
501    
502     If nb < 100 Then MsgBox("Attention, moins de 100 rectangles seront utilisés pour calculer l'intégrale")
503    
504     x = a
505     For i = 1 To nb
506     aire += f(x + dx / 2) * dx
507     x += dx
508     Next
509    
510     rectangles = aire
511    
512     End Function
513    
514    
515     Function trapezes(ByRef dx As Double, Optional ByVal a As Double = 0, Optional ByVal b As Double = 1) As Double
516     ' function qui calcule l'intégrale de f par la méthode des trapezes
517     Dim ecart As Double
518     Dim i As Integer
519     Dim nb As Long
520     Dim x As Double
521     Dim aire As Double
522    
523     ecart = b - a
524     nb = CLng(ecart / dx)
525     dx = ecart / nb
526    
527     If nb < 100 Then MsgBox("Attention, moins de 100 trapezes seront utilisés pour calculer l'intégrale")
528    
529     x = a
530     For i = 1 To nb
531     aire += (f(x) + f(x + dx)) / 2 * dx
532     x += dx
533     Next
534    
535     trapezes = aire
536     End Function
537     Function IntegrationGauss(ByRef n As Integer, Optional ByRef noFunction As Integer = 1) As Double
538     Dim i As Integer
539     Dim temp As Double
540     Dim t() As Double
541     Dim w() As Double
542     ReDim w(0)
543     ReDim t(0)
544    
545     Select Case n
546     Case 1 ' un seul point d'intégration
547     ReDim t(0)
548     ReDim w(0)
549    
550     t(0) = 0
551     w(0) = 2
552    
553     Case 2 ' deux points d'intégration
554     ' somme wi f(ri)
555     ReDim t(1)
556     ReDim w(1)
557    
558     t(0) = -0.57735027
559     t(1) = 0.57735027
560    
561     w(0) = 1
562     w(1) = 1
563    
564     Case 3 ' trois points
565     ReDim t(2)
566     ReDim w(2)
567    
568     t(0) = -0.77459667
569     t(1) = 0
570     t(2) = 0.77459667
571    
572     w(0) = 5 / 9
573     w(1) = 8 / 9
574     w(2) = 5 / 9
575    
576     Case 4
577    
578     ReDim t(3)
579     ReDim w(3)
580    
581     t(0) = -0.86113631
582     t(1) = -0.33998104
583     t(2) = 0.33998104
584     t(3) = 0.86113631
585    
586     w(0) = 0.34785485
587     w(1) = 0.65214515
588     w(2) = 0.65214515
589     w(3) = 0.34785485
590    
591    
592     Case 5
593     ReDim t(4)
594     ReDim w(4)
595    
596     t(0) = -0.90617975
597     t(1) = -0.53846931
598     t(2) = 0
599     t(3) = 0.53846931
600     t(4) = 0.90617975
601    
602     w(0) = 0.23692689
603     w(1) = 0.47862867
604     w(2) = 0.56888889
605     w(3) = 0.47862867
606     w(4) = 0.23692689
607    
608     Case Else
609     MsgBox("Problème dans l'intégration de Gauss, nb de points d'intégration non reconnu!?!")
610     End Select
611    
612    
613     For i = 0 To n - 1
614     temp = temp + w(i) * Choose(noFunction, f1(t(i)), f2(t(i)), f3(t(i)), f4(t(i)), f5(t(i)))
615     Next
616    
617     IntegrationGauss = temp
618     End Function
619    
620    
621     Function simpson(ByRef dx As Double, Optional ByVal a As Double = 0, Optional ByVal b As Double = 1) As Double
622    
623    
624     End Function
625    
626     #End Region
627    
628    
629    
630    
631     Public Function f(ByVal x As Double) As Double
632     f = x ^ 2
633     End Function
634     Public Function f1(ByVal r As Double) As Double
635     f1 = -0.04 * (-3 + r) * r ^ 2
636     End Function
637     Public Function f2(ByVal r As Double) As Double
638     f2 = -0.04 * (-3 + r) * r ^ 2
639     End Function
640     Public Function f3(ByVal r As Double) As Double
641     f3 = -0.04 * (-3 + r) * r ^ 2
642     End Function
643     Public Function f4(ByVal r As Double) As Double
644     f4 = -0.04 * (-3 + r) * r ^ 2
645     End Function
646     Public Function f5(ByVal r As Double) As Double
647     f5 = -0.04 * (-3 + r) * r ^ 2
648     End Function
649    
650    
651     ' Secant
652     Public Function Sec(ByVal X As Double) As Double
653     Sec = 1 / Math.Cos(X)
654     End Function
655    
656     ' Cosecant
657     Public Function CoSec(ByVal X As Double) As Double
658     CoSec = 1 / Math.Sin(X)
659     End Function
660    
661     ' Cotangent
662     Public Function CoTan(ByVal X As Double) As Double
663     CoTan = 1 / Math.Tan(X)
664     End Function
665    
666     ' Inverse Sine
667     Public Function ArcSin(ByVal X As Double) As Double
668     ArcSin = Math.Atan(X / Math.Sqrt(-X * X + 1))
669     End Function
670    
671     ' Inverse Cosine
672     Public Function ArcCos(ByVal X As Double) As Double
673     ArcCos = Math.Atan(-X / Math.Sqrt(-X * X + 1)) + 2 * Math.Atan(1)
674     End Function
675    
676     ' Inverse Secant
677     Public Function ArcSec(ByVal X As Double) As Double
678     ArcSec = Math.Atan(X / Math.Sqrt(X * X - 1)) + Math.Sign(X - 1) * (2 * Math.Atan(1))
679     End Function
680    
681     ' Inverse Cosecant
682     Public Function ArcCoSec(ByVal X As Double) As Double
683     ArcCoSec = Math.Atan(X / Math.Sqrt(X * X - 1)) + (Math.Sign(X) - 1) * (2 * Math.Atan(1))
684     End Function
685    
686     ' Inverse Cotangent
687     Public Function ArcCoTan(ByVal X As Double) As Double
688     ArcCoTan = Math.Atan(X) + 2 * Math.Atan(1)
689     End Function
690    
691    
692     ' Hyperbolic Secant
693     Public Function HSec(ByVal X As Double) As Double
694     HSec = 2 / (Math.Exp(X) + Math.Exp(-X))
695     End Function
696    
697     ' Hyperbolic Cosecant
698     Public Function HCoSec(ByVal X As Double) As Double
699     HCoSec = 2 / (Math.Exp(X) - Math.Exp(-X))
700     End Function
701    
702     ' Hyperbolic Cotangent
703     Public Function HCotan(ByVal X As Double) As Double
704     HCotan = (Math.Exp(X) + Math.Exp(-X)) / (Math.Exp(X) - Math.Exp(-X))
705     End Function
706    
707     ' Inverse Hyperbolic Sine
708     Public Function HArcSin(ByVal X As Double) As Double
709     HArcSin = Math.Log(X + Math.Sqrt(X * X + 1))
710     End Function
711    
712     ' Inverse Hyperbolic Cosine
713     Public Function HArcCos(ByVal X As Double) As Double
714     HArcCos = Math.Log(X + Math.Sqrt(X * X - 1))
715     End Function
716    
717     ' Inverse Hyperbolic Tangent
718     Function HArcTan(ByVal X As Double) As Double
719     HArcTan = Math.Log((1 + X) / (1 - X)) / 2
720     End Function
721    
722     ' Inverse Hyperbolic Secant
723     Public Function HArcSec(ByVal X As Double) As Double
724     HArcSec = Math.Log((Math.Sqrt(-X * X + 1) + 1) / X)
725     End Function
726    
727     ' Inverse Hyperbolic Cosecant
728     Public Function HArcCoSec(ByVal X As Double) As Double
729     HArcCoSec = Math.Log((Math.Sign(X) * Math.Sqrt(X * X + 1) + 1) / X)
730     End Function
731    
732     ' Inverse Hyperbolic Cotangent
733     Public Function HArcCoTan(ByVal X As Double) As Double
734     HArcCoTan = Math.Log((X + 1) / (X - 1)) / 2
735     End Function
736    
737     ' Logarithm to base N
738     Public Function LogN(ByVal X As Double, ByVal n As Double) As Double
739     LogN = Math.Log(X) / Math.Log(n)
740     End Function
741    
742     ' function qui effectue la rotation d'un point Pt par la matrice Mat
743     Public Function Rotation2D(ByRef Mat(,) As Double, ByVal Pt() As Double) As Double()
744     Dim temp(1) As Double
745    
746     temp(0) = Mat(0, 0) * Pt(0) + Mat(0, 1) * Pt(1)
747     temp(1) = Mat(0, 1) * Pt(0) + Mat(1, 1) * Pt(1)
748    
749     Return temp
750    
751     End Function
752    
753     ' function qui effectue la rotation d'un point Pt par le vecteur UNITAIRE u
754     Public Function Rotation2D(ByRef u() As Double, ByVal Pt() As Double) As Double()
755     Dim temp(1) As Double
756     Dim longueur As Double = Math.Sqrt(u(0) * u(0) + u(1) * u(1))
757     u(0) /= longueur
758     u(1) /= longueur
759    
760     temp(0) = u(0) * Pt(0) - u(1) * Pt(1)
761     temp(1) = u(1) * Pt(0) + u(0) * Pt(1)
762    
763    
764    
765     Return temp
766    
767     End Function
768    
769     Public Sub Rotation2D(ByRef u() As Double, ByRef Ptx As Double, ByRef Pty As Double)
770     Dim temp(1) As Double
771     Dim longueur As Double = Math.Sqrt(u(0) * u(0) + u(1) * u(1))
772     u(0) /= longueur
773     u(1) /= longueur
774    
775     temp(0) = u(0) * Ptx - u(1) * Pty
776     temp(1) = u(1) * Ptx + u(0) * Pty
777    
778     Ptx = temp(0)
779     Pty = temp(1)
780    
781     End Sub
782    
783 bournival 130
784     ''' <summary>
785     ''' Retourne l'angle entre 2 vecteurs
786     ''' </summary>
787     ''' <param name="u">Le premier vecteur</param>
788     ''' <param name="v">Le second vecteur</param>
789     ''' <returns>Un angle en radian</returns>
790     ''' <remarks>Retourne Pi si les 2 vecteurs sont d'orientation identique mais de direction opposés</remarks>
791 bournival 40 Public Function Angle2Vecteurs(ByRef u() As Double, ByRef v() As Double) As Double
792     Dim temp As Double
793     temp = Outils_Math.Prod_scalaire(u, v) / norme(u) / norme(v)
794     If Math.Abs(temp - 1) < 0.000000000001 Or Math.Abs(temp + 1) < 0.000000000001 Then
795     Return Pi
796     Else
797     Return Math.Acos(temp)
798     End If
799     End Function
800    
801 bournival 130
802     ''' <summary>
803     ''' Compare 2 vecteur de dimension 3
804     ''' </summary>
805     ''' <param name="u">Premier Vecteur</param>
806     ''' <param name="v">Second vecteur</param>
807     ''' <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>
808     ''' <remarks>Non optimisé pour les vecteurs unitaires</remarks>
809     Public Function ComparerVecteurs3D(ByRef u() As Double, ByRef v() As Double) As Byte
810    
811     If u.GetUpperBound(0) <> 2 AndAlso v.GetUpperBound(0) <> 2 Then Return 0
812     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
813     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
814    
815     Dim u2() As Double = unitaire(u)
816     Dim v2() As Double = unitaire(v)
817    
818     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
819     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
820    
821     Return 0
822    
823     End Function
824    
825     ''' <summary>
826     ''' Fonction qui inverse le sens d'un vecteur
827     ''' </summary>
828     ''' <param name="u">Le vecteur</param>
829     ''' <returns>Un vecteur de direction inverse</returns>
830     ''' <remarks></remarks>
831     Public Function InverserVecteur(ByRef u() As Double) As Double()
832     Dim v() As Double
833     ReDim v(u.GetUpperBound(0))
834    
835     For i As Integer = 0 To u.GetUpperBound(0)
836     v(i) = -u(i)
837     Next
838     Return v
839     End Function
840    
841    
842    
843 bournival 40 End Module