ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magicsld/Outils_Math.vb
Revision: 40
Committed: Mon Aug 20 21:30:28 2007 UTC (17 years, 8 months ago) by bournival
File size: 23141 byte(s)
Log Message:
Projet de these de Sylvain Bournival. Attention projet VB.

File Contents

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