ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magicsld/Outils_Math.vb
Revision: 205
Committed: Thu Jul 23 20:53:57 2009 UTC (15 years, 9 months ago) by bournival
File size: 26520 byte(s)
Log Message:
Commit de MAGiC_SLD pendant que j'y pense.  Les modifications ne devraient pas concerner personne d'autre que moi.   -- Sylvain

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 bournival 205
538    
539    
540 bournival 40 Function IntegrationGauss(ByRef n As Integer, Optional ByRef noFunction As Integer = 1) As Double
541     Dim i As Integer
542     Dim temp As Double
543     Dim t() As Double
544     Dim w() As Double
545     ReDim w(0)
546     ReDim t(0)
547    
548     Select Case n
549     Case 1 ' un seul point d'intégration
550     ReDim t(0)
551     ReDim w(0)
552    
553     t(0) = 0
554     w(0) = 2
555    
556     Case 2 ' deux points d'intégration
557     ' somme wi f(ri)
558     ReDim t(1)
559     ReDim w(1)
560    
561     t(0) = -0.57735027
562     t(1) = 0.57735027
563    
564     w(0) = 1
565     w(1) = 1
566    
567     Case 3 ' trois points
568     ReDim t(2)
569     ReDim w(2)
570    
571     t(0) = -0.77459667
572     t(1) = 0
573     t(2) = 0.77459667
574    
575     w(0) = 5 / 9
576     w(1) = 8 / 9
577     w(2) = 5 / 9
578    
579     Case 4
580    
581     ReDim t(3)
582     ReDim w(3)
583    
584     t(0) = -0.86113631
585     t(1) = -0.33998104
586     t(2) = 0.33998104
587     t(3) = 0.86113631
588    
589     w(0) = 0.34785485
590     w(1) = 0.65214515
591     w(2) = 0.65214515
592     w(3) = 0.34785485
593    
594    
595     Case 5
596     ReDim t(4)
597     ReDim w(4)
598    
599     t(0) = -0.90617975
600     t(1) = -0.53846931
601     t(2) = 0
602     t(3) = 0.53846931
603     t(4) = 0.90617975
604    
605     w(0) = 0.23692689
606     w(1) = 0.47862867
607     w(2) = 0.56888889
608     w(3) = 0.47862867
609     w(4) = 0.23692689
610    
611     Case Else
612     MsgBox("Problème dans l'intégration de Gauss, nb de points d'intégration non reconnu!?!")
613     End Select
614    
615    
616     For i = 0 To n - 1
617     temp = temp + w(i) * Choose(noFunction, f1(t(i)), f2(t(i)), f3(t(i)), f4(t(i)), f5(t(i)))
618     Next
619    
620     IntegrationGauss = temp
621     End Function
622    
623    
624     Function simpson(ByRef dx As Double, Optional ByVal a As Double = 0, Optional ByVal b As Double = 1) As Double
625    
626    
627     End Function
628    
629     #End Region
630    
631    
632    
633    
634     Public Function f(ByVal x As Double) As Double
635     f = x ^ 2
636     End Function
637     Public Function f1(ByVal r As Double) As Double
638     f1 = -0.04 * (-3 + r) * r ^ 2
639     End Function
640     Public Function f2(ByVal r As Double) As Double
641     f2 = -0.04 * (-3 + r) * r ^ 2
642     End Function
643     Public Function f3(ByVal r As Double) As Double
644     f3 = -0.04 * (-3 + r) * r ^ 2
645     End Function
646     Public Function f4(ByVal r As Double) As Double
647     f4 = -0.04 * (-3 + r) * r ^ 2
648     End Function
649     Public Function f5(ByVal r As Double) As Double
650     f5 = -0.04 * (-3 + r) * r ^ 2
651     End Function
652    
653    
654     ' Secant
655     Public Function Sec(ByVal X As Double) As Double
656     Sec = 1 / Math.Cos(X)
657     End Function
658    
659     ' Cosecant
660     Public Function CoSec(ByVal X As Double) As Double
661     CoSec = 1 / Math.Sin(X)
662     End Function
663    
664     ' Cotangent
665     Public Function CoTan(ByVal X As Double) As Double
666     CoTan = 1 / Math.Tan(X)
667     End Function
668    
669     ' Inverse Sine
670     Public Function ArcSin(ByVal X As Double) As Double
671     ArcSin = Math.Atan(X / Math.Sqrt(-X * X + 1))
672     End Function
673    
674     ' Inverse Cosine
675     Public Function ArcCos(ByVal X As Double) As Double
676     ArcCos = Math.Atan(-X / Math.Sqrt(-X * X + 1)) + 2 * Math.Atan(1)
677     End Function
678    
679     ' Inverse Secant
680     Public Function ArcSec(ByVal X As Double) As Double
681     ArcSec = Math.Atan(X / Math.Sqrt(X * X - 1)) + Math.Sign(X - 1) * (2 * Math.Atan(1))
682     End Function
683    
684     ' Inverse Cosecant
685     Public Function ArcCoSec(ByVal X As Double) As Double
686     ArcCoSec = Math.Atan(X / Math.Sqrt(X * X - 1)) + (Math.Sign(X) - 1) * (2 * Math.Atan(1))
687     End Function
688    
689     ' Inverse Cotangent
690     Public Function ArcCoTan(ByVal X As Double) As Double
691     ArcCoTan = Math.Atan(X) + 2 * Math.Atan(1)
692     End Function
693    
694    
695     ' Hyperbolic Secant
696     Public Function HSec(ByVal X As Double) As Double
697     HSec = 2 / (Math.Exp(X) + Math.Exp(-X))
698     End Function
699    
700     ' Hyperbolic Cosecant
701     Public Function HCoSec(ByVal X As Double) As Double
702     HCoSec = 2 / (Math.Exp(X) - Math.Exp(-X))
703     End Function
704    
705     ' Hyperbolic Cotangent
706     Public Function HCotan(ByVal X As Double) As Double
707     HCotan = (Math.Exp(X) + Math.Exp(-X)) / (Math.Exp(X) - Math.Exp(-X))
708     End Function
709    
710     ' Inverse Hyperbolic Sine
711     Public Function HArcSin(ByVal X As Double) As Double
712     HArcSin = Math.Log(X + Math.Sqrt(X * X + 1))
713     End Function
714    
715     ' Inverse Hyperbolic Cosine
716     Public Function HArcCos(ByVal X As Double) As Double
717     HArcCos = Math.Log(X + Math.Sqrt(X * X - 1))
718     End Function
719    
720     ' Inverse Hyperbolic Tangent
721     Function HArcTan(ByVal X As Double) As Double
722     HArcTan = Math.Log((1 + X) / (1 - X)) / 2
723     End Function
724    
725     ' Inverse Hyperbolic Secant
726     Public Function HArcSec(ByVal X As Double) As Double
727     HArcSec = Math.Log((Math.Sqrt(-X * X + 1) + 1) / X)
728     End Function
729    
730     ' Inverse Hyperbolic Cosecant
731     Public Function HArcCoSec(ByVal X As Double) As Double
732     HArcCoSec = Math.Log((Math.Sign(X) * Math.Sqrt(X * X + 1) + 1) / X)
733     End Function
734    
735     ' Inverse Hyperbolic Cotangent
736     Public Function HArcCoTan(ByVal X As Double) As Double
737     HArcCoTan = Math.Log((X + 1) / (X - 1)) / 2
738     End Function
739    
740     ' Logarithm to base N
741     Public Function LogN(ByVal X As Double, ByVal n As Double) As Double
742     LogN = Math.Log(X) / Math.Log(n)
743     End Function
744    
745     ' function qui effectue la rotation d'un point Pt par la matrice Mat
746     Public Function Rotation2D(ByRef Mat(,) As Double, ByVal Pt() As Double) As Double()
747     Dim temp(1) As Double
748    
749     temp(0) = Mat(0, 0) * Pt(0) + Mat(0, 1) * Pt(1)
750     temp(1) = Mat(0, 1) * Pt(0) + Mat(1, 1) * Pt(1)
751    
752     Return temp
753    
754     End Function
755    
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 bournival 205 'Dim longueur As Double = Math.Sqrt(u(0) * u(0) + u(1) * u(1))
760     'u(0) /= longueur
761     'u(1) /= longueur
762 bournival 40
763 bournival 205 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 bournival 40
768 bournival 205 'temp(0) = u(0) * Pt(0) - u(1) * Pt(1)
769     'temp(1) = u(1) * Pt(0) + u(0) * Pt(1)
770 bournival 40
771 bournival 205 'Debug.Print(Outils_Math.Angle2Vecteurs(test, temp))
772 bournival 40
773 bournival 205 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 bournival 40 Return temp
785    
786     End Function
787    
788 bournival 205
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    
802    
803 bournival 40 Public Sub Rotation2D(ByRef u() As Double, ByRef Ptx As Double, ByRef Pty As Double)
804     Dim temp(1) As Double
805     Dim longueur As Double = Math.Sqrt(u(0) * u(0) + u(1) * u(1))
806     u(0) /= longueur
807     u(1) /= longueur
808    
809     temp(0) = u(0) * Ptx - u(1) * Pty
810     temp(1) = u(1) * Ptx + u(0) * Pty
811    
812     Ptx = temp(0)
813     Pty = temp(1)
814    
815     End Sub
816    
817 bournival 130
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 bournival 40 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)
828     If Math.Abs(temp - 1) < 0.000000000001 Or Math.Abs(temp + 1) < 0.000000000001 Then
829     Return Pi
830     Else
831     Return Math.Acos(temp)
832     End If
833     End Function
834    
835 bournival 130
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 bournival 40 End Module