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

# Content
1 Imports System.Math
2
3 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
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 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
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 End Module