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:
|
Clase pública Form1
Polígonos privados como nueva lista (de lista (de punto))
KSpoints privado como lista (de punto) = nada
El submarino privado PictureBox1_MouseUp (remitente de ByVal como objeto, ByVal e como System.Windows.Forms.MouseEventArgs) dirige PictureBox1.MouseUp
Si IsNothing (KSpoints) entonces
KSpoints = nueva lista (de punto)
Polygons.Add (KSpoints)
Terminar si
KSpoints.Add (e.Location)
Si KSpoints.Count = 4 entonces
ptE dévil, ptF como punto
Simples déviles como boleanos = verdad
Si Geometry.SegmentIntersect (KSpoints (0), KSpoints (3), KSpoints (1), KSpoints (2), ptE, ptF) = Geometry.SegmentIntersection.Point entonces
'comprobar para saber si hay intersección entre las líneas formadas por 0 a 3 y 1 a 2.
Para cada pinta como punto en KSpoints
Si no pinta. Iguales (ptE) entonces
Simple = falso
Salir para
Terminar si
Después
Si no simple entonces
'intercambiar los dos puntos pasados
Amortiguar la pinta como el punto = KSpoints (3)
KSpoints.RemoveAt (3)
KSpoints.Insert (2, pinta)
Terminar si
KSpoints = nada
PictureBox1.Refresh ()
Salir el submarino
Terminar si
Si Geometry.SegmentIntersect (KSpoints (0), KSpoints (1), KSpoints (2), KSpoints (3), ptE, ptF) = Geometry.SegmentIntersection.Point entonces
'comprobar para saber si hay intersección entre las líneas formadas por 0 a 1 y 2 a 3.
Para cada pinta como punto en KSpoints
Si no pinta. Iguales (ptE) entonces
Simple = falso
Salir para
Terminar si
Después
Si no simple entonces
'intercambiar los dos puntos medios
Amortiguar la pinta como el punto = KSpoints (2)
KSpoints.RemoveAt (2)
KSpoints.Insert (1, pinta)
KSpoints = nada
PictureBox1.Refresh ()
Salir el submarino
Terminar si
Terminar si
KSpoints = nada
PictureBox1.Refresh ()
PictureBox1.Refresh ()
Terminar si
Terminar el submarino
El submarino privado PictureBox1_Paint (remitente de ByVal como objeto, ByVal e como System.Windows.Forms.PaintEventArgs) dirige PictureBox1.Paint
Colores estáticos () como color = {Color.Red, Color.Green, Color.Blue, Color.Purple}
Para cada polígono como lista (de punto) en polígonos
Si polígono. Cuenta > 1 entonces
Para i como número entero = 0 al polígono. Cuenta - 2
Usar P como nueva pluma (colores (i))
e.Graphics.DrawLine (P, polígono (i), polígono (i + 1))
Extremo usar
Después
Si polígono. Cuenta > 2 entonces
Usar P como nueva pluma (colores (polígono. Cuenta - 1))
e.Graphics.DrawLine (P, polígono (polígono. Cuenta - 1), polígono (0))
Extremo usar
Terminar si
Terminar si
Para cada pinta como punto en polígono
Rc dévil como nuevo rectángulo (pinta, nuevo tamaño (1, 1))
rc. Inflar (3, 3)
e.Graphics.FillRectangle (Brushes.Black, rc)
Después
Después
Submarino del extremo
Clase del extremo
Geometría pública de la clase
Enum público SegmentIntersection
Ninguno = 0 'los segmentos es paralelo y nunca se intersecará
Punto = 1 'que los segmentos se intersecan físicamente en un punto
ExtrapolatedPoint = 2 'que los segmentos se intersecarían físicamente en un punto si un o ambo segmentos eran extendidos
Traslapando = 3 'los segmentos son paralelo y traslapo en un punto o segmento
Extremo Enum
Función compartida público SegmentIntersect (_
ByVal A como punto, ByVal B como punto, _
ByVal C como punto, ByVal D como punto, _
ByRef E como punto, ByRef F como punto) como SegmentIntersection
'Si uno o ambos segmentos pasajeros adentro es realmente un punto entonces apenas hacer un cálculo de PointToSegmentDistance ():
Si A.Equals (B) OrElse C.Equals (D) entonces
Si A.Equals (B) AndAlso C.Equals (D) entonces
Si A.Equals (C) entonces
E = A
F = A
Geometry.SegmentIntersection.Point de vuelta
Geometry.SegmentIntersection.None de vuelta
Terminar si
ElseIf A.Equals (B) entonces
Si Geometry.PointToSegmentDistance (A.X, A.Y, C.X, C.Y, D.X, D.Y) = 0 entonces
E = A
F = A
Geometry.SegmentIntersection.Point de vuelta
Terminar si
ElseIf C.Equals (D) entonces
Si Geometry.PointToSegmentDistance (C.X, C.Y, A.X, A.Y, B.X, B.Y) = 0 entonces
E = C
F = C
Geometry.SegmentIntersection.Point de vuelta
Terminar si
Terminar si
Volver Geometry.SegmentIntersection.None
Terminar si
'Tenemos dos segmentos reales… nos dejamos hacer los cálculos para Det1 y Det2:
Det1 dévil como doble = (A.Y - C.Y) * (D.X - C.X) - (A.X - C.X) * (D.Y - C.Y)
Det2 dévil como doble = (B.X - A.X) * (D.Y - C.Y) - (B.Y - A.Y) * (D.X - C.X)
Si 0 <> entonces 'segmentos no paralelos Det2 (se intersecan o se intersecarían si es extendido)
Det3 dévil como doble = (A.Y - C.Y) * (B.X - A.X) - (A.X - C.X) * (B.Y - A.Y)
Det4 dévil como doble = (B.X - A.X) * (D.Y - C.Y) - (B.Y - A.Y) * (D.X - C.X)
R dévil como doble = Det1/Det2
S dévil como doble = Det3/Det4
'Computar el punto de intersección:
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 entonces 'sin traslapo
Geometry.SegmentIntersection.None de vuelta
'Traslapándose (un punto o un segmento)
'Los segmentos paralelos son iguales
Si (A.Equals (C) AndAlso B.Equals (D)) OrElse (A.Equals (D) AndAlso B.Equals (C)) entonces
E = A
F = B
Geometry.SegmentIntersection.Overlapping de vuelta
Terminar si
'Los segmentos paralelos se traslapan en exactamente un punto
Si B.Equals (C) OrElse B.Equals (D) entonces
E = B
F = B
Geometry.SegmentIntersection.Overlapping de vuelta
Terminar si
Si A.Equals (C) OrElse A.Equals (D) entonces
E = A
F = A
Geometry.SegmentIntersection.Overlapping de vuelta
Terminar si
'Los segmentos paralelos se están traslapando en un segmento
Si Geometry.SegmentContainsPoint (A, B, C) AndAlso Geometry.SegmentContainsPoint (C, D, B) entonces
E = C
F = B
Geometry.SegmentIntersection.Overlapping de vuelta
ElseIf Geometry.SegmentContainsPoint (A, B, D) AndAlso Geometry.SegmentContainsPoint (D, C, B) entonces
E = D
F = B
Geometry.SegmentIntersection.Overlapping de vuelta
ElseIf Geometry.SegmentContainsPoint (B, A, C) AndAlso Geometry.SegmentContainsPoint (C, D, A) entonces
E = C
F = A
Geometry.SegmentIntersection.Overlapping de vuelta
ElseIf Geometry.SegmentContainsPoint (B, A, D) AndAlso Geometry.SegmentContainsPoint (D, C, A) entonces
E = D
F = A
Geometry.SegmentIntersection.Overlapping de vuelta
ElseIf Geometry.SegmentContainsPoint (C, D, A) AndAlso Geometry.SegmentContainsPoint (A, B, D) entonces
E = A
F = D
Geometry.SegmentIntersection.Overlapping de vuelta
ElseIf Geometry.SegmentContainsPoint (C, D, B) AndAlso Geometry.SegmentContainsPoint (B, A, D) entonces
E = B
F = D
Geometry.SegmentIntersection.Overlapping de vuelta
ElseIf Geometry.SegmentContainsPoint (D, C, A) AndAlso Geometry.SegmentContainsPoint (A, B, C) entonces
E = A
F = C
Geometry.SegmentIntersection.Overlapping de vuelta
ElseIf Geometry.SegmentContainsPoint (D, C, B) AndAlso Geometry.SegmentContainsPoint (B, A, C) entonces
E = B
F = C
Geometry.SegmentIntersection.Overlapping de vuelta
Terminar si
'Un segmento contiene totalmente el otro
Si Geometry.SegmentContainsPoint (A, B, C) AndAlso Geometry.SegmentContainsPoint (A, B, D) entonces
E = C
F = D
Geometry.SegmentIntersection.Overlapping de vuelta
Terminar si
Si Geometry.SegmentContainsPoint (C, D, A) AndAlso Geometry.SegmentContainsPoint (C, D, B) entonces
E = A
F = B
Geometry.SegmentIntersection.Overlapping de vuelta
Terminar si
Los 'segmentos son paralelos pero de tactos
Geometry.SegmentIntersection.None de vuelta
Terminar si
Terminar si
Terminar la función
Función compartida público PointToPointDistance (hacha de ByVal como sola, _
ByVal Ay como solo, ByVal Bx como solo, ByVal cerca como solo) _
Como solo
'PointToPointDist = SquareRoot ((Bx - hacha) ^2 + (por - Ay) ^2)
Math.Sqrt de vuelta ((Bx - hacha) * (Bx - hacha) + (por - Ay) * (por - Ay))
Función del final
Función compartida público PointToSegmentDistance (_
ByVal Px como solo, ByVal PY como solo, _
Hacha de ByVal como sola, ByVal Ay como solo, _
ByVal Bx como solo, ByVal cerca como solo) como solo
Q dévil como solo
Si (hacha = Bx) y (Ay = cerca) entonces
'A y B pasaron adentro definen un punto, no una línea.
'Distancia de punto a punto
PointToPointDistance de vuelta (Px, PY, hacha, Ay)
La 'distancia es la longitud de la línea necesaria para conectar el punto con
'(segmento) el tales que las dos líneas serían perpendiculares.
'q es el valor dado parámetros necesario para llegar a la intersección
q = ((Px - hacha) * (Bx - hacha) + (PY - Ay) * (por - Ay)) /_
((Bx - hacha) * (Bx - hacha) + (por - Ay) * (por - Ay))
'Limitar q a 0 <> 1 entonces q = 1
'Distancia
PointToPointDistance de vuelta (_
Px, PY, (1 - q) * hacha + q * Bx, (1 - q) * Ay + q * cerca)
Terminar si
Terminar la función
Función compartida público SegmentContainsPoint (_
ByVal A como punto, ByVal B como punto, ByVal C como punto) como boleano
'Dos segmentos AB y el CD se han determinado ya para tener
la 'misma cuesta y ésa que se traslapan.
El 'AB es el segmento, y C es el punto en la pregunta.
'Si el AB contiene C después verdad de vuelta, si no vuelta falsa
Si C.Equals (A) o C.Equals (B) entonces
De vuelta verdad
ElseIf A.X = B.X entonces 'proyecta al Y-Axis para las líneas verticales
minY dévil como el número entero = Math.Min (A.Y, B.Y)
maxY dévil como el número entero = Math.Max (A.Y, B.Y)
Si minY <>
|