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

# 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
538
539
540 Function IntegrationGauss(ByRef n As Integer, Optional ByRef noFunction As Integer = 1) As Double
541 Dim i As Integer
542 Dim temp As Double
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 'Dim longueur As Double = Math.Sqrt(u(0) * u(0) + u(1) * u(1))
760 'u(0) /= longueur
761 'u(1) /= longueur
762
763 Dim test(2) As Double
764 test(0) = 1
765 'Debug.Print(Outils_Math.Angle2Vecteurs(test, u))
766 'Debug.Print(Outils_Math.Angle2Vecteurs(test, Pt))
767
768 'temp(0) = u(0) * Pt(0) - u(1) * Pt(1)
769 'temp(1) = u(1) * Pt(0) + u(0) * Pt(1)
770
771 'Debug.Print(Outils_Math.Angle2Vecteurs(test, temp))
772
773 Dim u2(2) As Double
774 u2(0) = u(0)
775 u2(1) = u(1)
776 Dim angleInit As Double = Math.Atan2(u(1), u(0))
777 Dim anglePt As Double = Math.Atan2(Pt(1), Pt(0))
778 Dim longueur As Double = Math.Sqrt(Pt(0) * Pt(0) + Pt(1) * Pt(1))
779
780 Dim anglefinal As Double = anglePt + angleInit
781 temp(0) = Math.Cos(anglefinal) * longueur
782 temp(1) = Math.Sin(anglefinal) * longueur
783
784 Return temp
785
786 End Function
787
788
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 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
818 ''' <summary>
819 ''' Retourne l'angle entre 2 vecteurs
820 ''' </summary>
821 ''' <param name="u">Le premier vecteur</param>
822 ''' <param name="v">Le second vecteur</param>
823 ''' <returns>Un angle en radian</returns>
824 ''' <remarks>Retourne Pi si les 2 vecteurs sont d'orientation identique mais de direction opposés</remarks>
825 Public Function Angle2Vecteurs(ByRef u() As Double, ByRef v() As Double) As Double
826 Dim temp As Double
827 temp = Outils_Math.Prod_scalaire(u, v) / norme(u) / norme(v)
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
836 ''' <summary>
837 ''' Compare 2 vecteur de dimension 3
838 ''' </summary>
839 ''' <param name="u">Premier Vecteur</param>
840 ''' <param name="v">Second vecteur</param>
841 ''' <returns>0 si sans rapport, 1 si identiques, 2 si sens inverse, 3 si même sens mais norme différente, 4 si norme et sens différent</returns>
842 ''' <remarks>Non optimisé pour les vecteurs unitaires</remarks>
843 Public Function ComparerVecteurs3D(ByRef u() As Double, ByRef v() As Double) As Byte
844
845 If u.GetUpperBound(0) <> 2 AndAlso v.GetUpperBound(0) <> 2 Then Return 0
846 If Math.Abs(u(0) - v(0)) < 0.0005 AndAlso Math.Abs(u(1) - v(1)) < 0.0005 AndAlso Math.Abs(u(1) - v(1)) < 0.0005 Then Return 1
847 If Math.Abs(u(0) + v(0)) < 0.0005 AndAlso Math.Abs(u(1) + v(1)) < 0.0005 AndAlso Math.Abs(u(1) + v(1)) < 0.0005 Then Return 2
848
849 Dim u2() As Double = unitaire(u)
850 Dim v2() As Double = unitaire(v)
851
852 If Math.Abs(u2(0) - v2(0)) < 0.0005 AndAlso Math.Abs(u2(1) - v2(1)) < 0.0005 AndAlso Math.Abs(u2(1) - v2(1)) < 0.0005 Then Return 3
853 If Math.Abs(u2(0) + v2(0)) < 0.0005 AndAlso Math.Abs(u2(1) + v2(1)) < 0.0005 AndAlso Math.Abs(u2(1) + v2(1)) < 0.0005 Then Return 4
854
855 Return 0
856
857 End Function
858
859 ''' <summary>
860 ''' Fonction qui inverse le sens d'un vecteur
861 ''' </summary>
862 ''' <param name="u">Le vecteur</param>
863 ''' <returns>Un vecteur de direction inverse</returns>
864 ''' <remarks></remarks>
865 Public Function InverserVecteur(ByRef u() As Double) As Double()
866 Dim v() As Double
867 ReDim v(u.GetUpperBound(0))
868
869 For i As Integer = 0 To u.GetUpperBound(0)
870 v(i) = -u(i)
871 Next
872 Return v
873 End Function
874
875
876
877 End Module