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

# Content
1 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