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 :
119 :
120 :
121 :
122 :
123 :
124 :
125 :
126 :
127 :
128 :
129 :
130 :
131 :
132 :
133 :
134 :
135 :
136 :
137 :
138 :
139 :
140 :
141 :
142 :
143 :
144 :
145 :
146 :
147 :
148 :
149 :
150 :
151 :
152 :
153 :
154 :
155 :
156 :
157 :
158 :
159 :
160 :
161 :
162 :
163 :
164 :
165 :
166 :
167 :
168 :
169 :
170 :
171 :
172 :
173 :
174 :
175 :
176 :
177 :
178 :
179 :
180 :
181 :
182 :
183 :
184 :
185 :
186 :
187 :
188 :
189 :
190 :
191 :
192 :
193 :
194 :
195 :
196 :
197 :
198 :
199 :
200 :
201 :
202 :
203 :
204 :
205 :
206 :
207 :
208 :
209 :
210 :
211 :
212 :
213 :
214 :
215 :
216 :
217 :
218 :
219 :
220 :
221 :
222 :
223 :
224 :
225 :
226 :
227 :
228 :
229 :
230 :
231 :
232 :
233 :
234 :
235 :
236 :
237 :
238 :
239 :
240 :
241 :
242 :
243 :
244 :
245 :
246 :
247 :
248 :
249 :
250 :
251 :
252 :
253 :
254 :
255 :
256 :
257 :
258 :
259 :
260 :
261 :
262 :
263 :
264 :
265 :
266 :
267 :
268 :
269 :
270 :
271 :
272 :
273 :
274 :
275 :
276 :
277 :
278 :
279 :
280 :
281 :
282 :
283 :
284 :
285 :
286 :
287 :
288 :
289 :
290 :
|
Classe publique Form1
Polygones privés en tant que nouvelle liste (de liste (de point))
KSpoints privé comme liste (de point) = rien
Le sous-marin privé PictureBox1_MouseUp (expéditeur de ByVal comme objet, ByVal e comme System.Windows.Forms.MouseEventArgs) manipule PictureBox1.MouseUp
S'IsNothing (KSpoints) puis
KSpoints = nouvelle liste (de point)
Polygons.Add (KSpoints)
Finir si
KSpoints.Add (e.Location)
Si KSpoints.Count = 4 puis
Faible PTE, PTF comme point
Faibles simples comme booléens = rectifient
Si Geometry.SegmentIntersect (KSpoints (0), KSpoints (3), KSpoints (1), KSpoints (2), PTE, PTF) = Geometry.SegmentIntersection.Point alors
'vérifier l'intersection entre les lignes constituées par 0 à 3 et 1 à 2.
Pour chaque pinte comme point dans KSpoints
Sinon pinte. Égales (PTE) puis
Simple = faux
Sortir pour
Finir si
Après
Sinon simple puis
'permuter les deux derniers points
Obscurcir la pinte comme point = KSpoints (3)
KSpoints.RemoveAt (3)
KSpoints.Insert (2, pinte)
Finir si
KSpoints = rien
PictureBox1.Refresh ()
Sortir le sous-marin
Finir si
Si Geometry.SegmentIntersect (KSpoints (0), KSpoints (1), KSpoints (2), KSpoints (3), PTE, PTF) = Geometry.SegmentIntersection.Point alors
'vérifier l'intersection entre les lignes constituées par 0 à 1 et 2 à 3.
Pour chaque pinte comme point dans KSpoints
Sinon pinte. Égales (PTE) puis
Simple = faux
Sortir pour
Finir si
Après
Sinon simple puis
'permuter les deux points moyens
Obscurcir la pinte comme point = KSpoints (2)
KSpoints.RemoveAt (2)
KSpoints.Insert (1, pinte)
KSpoints = rien
PictureBox1.Refresh ()
Sortir le sous-marin
Finir si
Finir si
KSpoints = rien
PictureBox1.Refresh ()
Autrement
PictureBox1.Refresh ()
Finir si
Finir le sous-marin
Le sous-marin privé PictureBox1_Paint (expéditeur de ByVal comme objet, ByVal e comme System.Windows.Forms.PaintEventArgs) manipule PictureBox1.Paint
Couleurs statiques () comme couleur = {Color.Red, Color.Green, Color.Blue, Color.Purple}
Pour chaque polygone comme liste (de point) dans les polygones
Si polygone. Compte > 1 puis
Pour I comme nombre entier = 0 au polygone. Compte - 2
Using P en tant que nouveau stylo (couleurs (i))
e.Graphics.DrawLine (P, polygone (i), polygone (I + 1))
Extrémité Using
Après
Si polygone. Compte > 2 puis
Using P en tant que nouveau stylo (couleurs (polygone. Compte - 1))
e.Graphics.DrawLine (P, polygone (polygone. Compte - 1), polygone (0))
Extrémité Using
Finir si
Finir si
Pour chaque pinte comme point dans le polygone
Faible rc en tant que nouveau rectangle (pinte, nouvelle taille (1, 1))
rc. Gonfler (3, 3)
e.Graphics.FillRectangle (Brushes.Black, rc)
Après
Après
Sous-marin d'extrémité
Classe d'extrémité
La géométrie publique de classe
Enum public SegmentIntersection
Aucun = 0 'les segments n'est parallèle et n'intersectera jamais
Point = 1 'que les segments intersectent physiquement à un point
ExtrapolatedPoint = 2 'que les segments intersecteraient physiquement à un point si un ou les deux segments étaient prolongés
Recouvrant = 3 'les segments sont parallèle et chevauchement à un point ou segment
Extrémité Enum
Fonction partagée par public SegmentIntersect (_
ByVal A comme point, ByVal B comme point, _
ByVal C comme point, ByVal D comme point, _
ByRef E comme point, ByRef F comme point) comme SegmentIntersection
'Si un ou tous les deux segments passés dedans est réellement un point puis juste faire un calcul de PointToSegmentDistance () :
Si A.Equals (B) OrElse C.Equals (D) alors
Si A.Equals (B) AndAlso C.Equals (D) alors
Si A.Equals (C) alors
E = A
F = A
Geometry.SegmentIntersection.Point de retour
Autrement
Geometry.SegmentIntersection.None de retour
Finir si
ElseIf A.Equals (B) alors
Si Geometry.PointToSegmentDistance (A.X, A.Y, C.X, C.Y, D.X, D.Y) = 0 puis
E = A
F = A
Geometry.SegmentIntersection.Point de retour
Finir si
ElseIf C.Equals (D) alors
Si Geometry.PointToSegmentDistance (C.X, C.Y, A.X, A.Y, B.X, B.Y) = 0 puis
E = C
F = C
Geometry.SegmentIntersection.Point de retour
Finir si
Finir si
Renvoyer Geometry.SegmentIntersection.None
Finir si
'Nous avons deux segments réels… nous avons laissés faire les calculs pour Det1 et Det2 :
Faible Det1 comme double = (A.Y - C.Y) * (D.X - C.X) - (A.X - C.X) * (D.Y - C.Y)
Faible Det2 comme double = (B.X - A.X) * (D.Y - C.Y) - (B.Y - A.Y) * (D.X - C.X)
Si 0 <> puis 'segments Det2 non-parallèles (ils intersectent ou intersecteraient si prolongé)
Faible Det3 comme double = (A.Y - C.Y) * (B.X - A.X) - (A.X - C.X) * (B.Y - A.Y)
Faible Det4 comme double = (B.X - A.X) * (D.Y - C.Y) - (B.Y - A.Y) * (D.X - C.X)
Faible r comme double = Det1/Det2
Faible s comme double = Det3/Det4
'Calculer le point d'intersection :
E.X = A.X + r * (B.X - A.X)
E.Y = A.Y + r * (B.Y - A.Y)
F = E
Si (>= 0 AndAlso de r r <>= 0 AndAlso s <> 0 puis 'non-recouverts
Geometry.SegmentIntersection.None de retour
Autrement 'recouvrant (un point ou un segment)
'Les segments parallèles sont identiques
Si (A.Equals (C) AndAlso B.Equals (D)) OrElse (A.Equals (D) AndAlso B.Equals (C)) puis
E = A
F = B
Geometry.SegmentIntersection.Overlapping de retour
Finir si
'Les segments parallèles recouvrent à exactement un point
Si B.Equals (C) OrElse B.Equals (D) alors
E = B
F = B
Geometry.SegmentIntersection.Overlapping de retour
Finir si
Si A.Equals (C) OrElse A.Equals (D) alors
E = A
F = A
Geometry.SegmentIntersection.Overlapping de retour
Finir si
'Les segments parallèles recouvrent dans un segment
Si Geometry.SegmentContainsPoint (A, B, C) AndAlso Geometry.SegmentContainsPoint (C, D, B) alors
E = C
F = B
Geometry.SegmentIntersection.Overlapping de retour
ElseIf Geometry.SegmentContainsPoint (A, B, D) AndAlso Geometry.SegmentContainsPoint (D, C, B) alors
E = D
F = B
Geometry.SegmentIntersection.Overlapping de retour
ElseIf Geometry.SegmentContainsPoint (B, A, C) AndAlso Geometry.SegmentContainsPoint (C, D, A) alors
E = C
F = A
Geometry.SegmentIntersection.Overlapping de retour
ElseIf Geometry.SegmentContainsPoint (B, A, D) AndAlso Geometry.SegmentContainsPoint (D, C, A) alors
E = D
F = A
Geometry.SegmentIntersection.Overlapping de retour
ElseIf Geometry.SegmentContainsPoint (C, D, A) AndAlso Geometry.SegmentContainsPoint (A, B, D) alors
E = A
F = D
Geometry.SegmentIntersection.Overlapping de retour
ElseIf Geometry.SegmentContainsPoint (C, D, B) AndAlso Geometry.SegmentContainsPoint (B, A, D) alors
E = B
F = D
Geometry.SegmentIntersection.Overlapping de retour
ElseIf Geometry.SegmentContainsPoint (D, C, A) AndAlso Geometry.SegmentContainsPoint (A, B, C) alors
E = A
F = C
Geometry.SegmentIntersection.Overlapping de retour
ElseIf Geometry.SegmentContainsPoint (D, C, B) AndAlso Geometry.SegmentContainsPoint (B, A, C) alors
E = B
F = C
Geometry.SegmentIntersection.Overlapping de retour
Finir si
'Un segment contient complètement l'autre
Si Geometry.SegmentContainsPoint (A, B, C) AndAlso Geometry.SegmentContainsPoint (A, B, D) alors
E = C
F = D
Geometry.SegmentIntersection.Overlapping de retour
Finir si
Si Geometry.SegmentContainsPoint (C, D, A) AndAlso Geometry.SegmentContainsPoint (C, D, B) alors
E = A
F = B
Geometry.SegmentIntersection.Overlapping de retour
Finir si
Les 'segments sont parallèles mais ne touchant pas
Geometry.SegmentIntersection.None de retour
Finir si
Finir si
Finir la fonction
Fonction partagée par public PointToPointDistance (hache de ByVal comme simple, _
ByVal Ay comme simple, ByVal Bx comme simple, ByVal près en tant que simple) _
Comme simple
'PointToPointDist = SquareRoot ((Bx - hache) ^2 + (par - Ay) ^2)
Math.Sqrt de retour ((Bx - hache) * (Bx - hache) + (par - Ay) * (par - Ay))
Fonction de fin
Fonction partagée par public PointToSegmentDistance (_
ByVal Px comme simple, ByVal PY comme simple, _
Hache de ByVal comme simple, ByVal Ay comme simple, _
ByVal Bx comme simple, ByVal près comme simple) comme simple
Faible q comme simple
Si (hache = Bx) et (Ay = près) puis
'A et B ont passé définissent dedans un point, pas une ligne.
'Distance point par point
PointToPointDistance de retour (Px, PY, hache, Ay)
Autrement
La 'distance est la longueur de la ligne requise pour relier le point à
'(segment) les tels que les deux lignes seraient perpendiculaires.
'q est la valeur paramétrisée requise pour arriver à l'intersection
q = ((Px - hache) * (Bx - hache) + (le PY - Ay) * (par - Ay)) /_
((Bx - hache) * (Bx - hache) + (par - Ay) * (par - Ay))
'Limiter q à 0 <> 1 puis q = 1
'Distance
PointToPointDistance de retour (_
Px, PY, (1 - q) * hache + q * Bx, (1 - q) * Ay + q * près)
Finir si
Finir la fonction
Fonction partagée par public SegmentContainsPoint (_
ByVal A comme point, ByVal B comme point, ByVal C comme point) comme booléen
'Deux segments ab et CD ont été déjà déterminés pour avoir
la 'même pente et cela qu'ils recouvrent.
Le 'ab est le segment, et C est le point en question.
'Si l'ab contient C puis vrai de retour, autrement retour faux
Si C.Equals (A) ou C.Equals (B) alors
De retour rectifier
ElseIf A.X = B.X alors 'projettent à l'axe des ordonnées pour les lignes verticales
Faible minY comme nombre entier = Math.Min (A.Y, B.Y)
Faible maxY comme nombre entier = Math.Max (A.Y, B.Y)
Si minY <>
|