bonjour
j'ai besoin de trouver le petit axe dans une courbe fermé
j'ai une liste de point et j'ai calculé la plus grande distance
le petit axe est le plus grand segment perpendiculaire au grand axe limité par la courbe.


j'ai fait une méthode qui ne mène pas toujour au résultat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
 
 
	 void PetitAxe(arraylist liste)
		 {
 
 
			 //ici le a1 de la droite D1
			 float a1 = (float)(pointB.Y - pointA.Y) / (float)(pointB.X - pointA.X);
			 //pour le b1 on la calcule par détermination d'un point...
 
			 float b1 =pointA.Y - a1 *pointA.X;
 
			 //je vai vérifier pour le point B..
			 double err = 0.01;
			 if (Math.Abs(a1) >= err)
			 {
 
				 //ici il faut bien voir car dans ce cas 
				 //a2 n'est pas importante donc m'ai l'important c'est le x==>
				 //par conséquent on fait x=const
				 //donc le Y n'est pas importante
				 double max = 0;
 
				 //la distance
				 double distance = 0;
				 int indexA = 0; int indexB = 0;
				 double b2 = 0;
				 for (int i = 0; i < liste.Count; i++)
				 {
					 //chercher le b2
 
					 b2 = liste[i].X;
					 //ici on a trouvé a et b pour la droite...
					 //il faut chercher dans la liste l'autre point 
					 //qui peut etre le plus grand(non ici le point appartenant
					 //a la droite puis calculer la distance...A(x,y)
					 for (int p = 0; p < liste.Count - 1; p++)
					 {
						 if (p != i)
						 {
							 if ((liste[p].X == b2))
							 {
								 //ici on a le point appartient a cette droite donc on fait break
								 //on calcule la distance...
								 distance = liste[p].DistanceTo(liste[i]);
								 if (distance >= max)
								 {
									 max = distance;
									 indexA = i;
									 indexB = p;
								 }
								 break;
							 }
						 }
					 }
				 }
 
//pour le résultat les points AA,BB
				AA = liste[indexA];
				 BB = liste[indexB];
 
 
 
			 }
			 else
			 {
 
 
			 //il faut parcourir toute la liste pour connaitre les perpendiculaires
			 //aussi il faut bien calculer le max de la distance entre le point perpendiculaire
 
			 //ici il faut commencer par déterminer les droites perpendiculaires...
			 double a2 = -1 / a1;
			 //il faut ici calculer le point appartenant a cette droite...
			 double b2;
			 //la distance
			 double distance = 0;
			 //les points extremes...
			 IntPoint A, B;
			 double max = 0;
			 int indexA = 0; int indexB = 0;
 
			 for (int i = 0; i < liste.Count; i++)
			 {
				 //chercher le b2
 
				 b2 = liste[i].Y - a2 * liste[i].X;
				 //ici on a trouvé a et b pour la droite...
				 //il faut chercher dans la liste l'autre point 
				 //qui peut etre le plus grand(non ici le point appartenant
				 //a la droite puis calculer la distance...A(x,y)
				 for (int p = 0; p < liste.Count - 1; p++)
				 {
					 if (p != i)
					 {
						 if ((a2 * liste[p].X + b2) - liste[p].Y == 0)
						 {
							 //ici on a le point appartient a cette droite donc on fait break
							 //on calcule la distance...
							 distance = liste[p].DistanceTo(liste[i]);
							 if (distance >= max)
							 {
								 max = distance;
								 indexA = i;
								 indexB = p;
							 }
							 break;
						 }
					 }
				 }
			 }
			 //ici il aut acquérire les points... AA,BB le résultat
 
			AA = liste[indexA];
			 BB = liste[indexB];
 
			 }
		 }