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 pública Form1
Polígono confidenciais como a lista nova (de lista (de ponto))
KSpoints confidencial como a lista (de ponto) = nada
O submarino confidencial PictureBox1_MouseUp (remetente de ByVal como o objeto, ByVal e como System.Windows.Forms.MouseEventArgs) segura PictureBox1.MouseUp
Se IsNothing (KSpoints) então
KSpoints = lista nova (de ponto)
Polygons.Add (KSpoints)
Terminar se
KSpoints.Add (e.Location)
Se KSpoints.Count = 4 então
PTE não ofuscante, ptF como o ponto
Simples não ofuscantes como bôoleanos = retificam
Se Geometry.SegmentIntersect (KSpoints (0), KSpoints (3), KSpoints (1), KSpoints (2), PTE, ptF) = Geometry.SegmentIntersection.Point então
'verific para ver se há a interseção entre as linhas dadas forma por 0 a 3 e 1 a 2.
Para cada pinta como o ponto em KSpoints
Se não pinta. Iguais (PTE) então
Simples = falso
Retirar para
Terminar se
Em seguida
Se não simples então
'trocar os últimos dois pontos
Escurecer a pinta como o ponto = o KSpoints (3)
KSpoints.RemoveAt (3)
KSpoints.Insert (2, pinta)
Terminar se
KSpoints = nada
PictureBox1.Refresh ()
Retirar o submarino
Terminar se
Se Geometry.SegmentIntersect (KSpoints (0), KSpoints (1), KSpoints (2), KSpoints (3), PTE, ptF) = Geometry.SegmentIntersection.Point então
'verific para ver se há a interseção entre as linhas dadas forma por 0 a 1 e 2 a 3.
Para cada pinta como o ponto em KSpoints
Se não pinta. Iguais (PTE) então
Simples = falso
Retirar para
Terminar se
Em seguida
Se não simples então
'trocar os dois pontos médios
Escurecer a pinta como o ponto = o KSpoints (2)
KSpoints.RemoveAt (2)
KSpoints.Insert (1, pinta)
KSpoints = nada
PictureBox1.Refresh ()
Retirar o submarino
Terminar se
Terminar se
KSpoints = nada
PictureBox1.Refresh ()
Mais
PictureBox1.Refresh ()
Terminar se
Terminar o submarino
O submarino confidencial PictureBox1_Paint (remetente de ByVal como o objeto, ByVal e como System.Windows.Forms.PaintEventArgs) segura PictureBox1.Paint
Cores de estática () como a cor = {Color.Red, Color.Green, Color.Blue, Color.Purple}
Para cada polígono como a lista (de ponto) nos polígono
Se polígono. Contagem > 1 então
Para i como o inteiro = 0 ao polígono. Contagem - 2
Using P como a pena nova (cores (i))
e.Graphics.DrawLine (P, polígono (i), polígono (i + 1))
Extremidade Using
Em seguida
Se polígono. Contagem > 2 então
Using P como a pena nova (cores (polígono. Contagem - 1))
e.Graphics.DrawLine (P, polígono (polígono. Contagem - 1), polígono (0))
Extremidade Using
Terminar se
Terminar se
Para cada pinta como o ponto no polígono
Rc não ofuscante como o retângulo novo (pinta, tamanho novo (1, 1))
rc. Inflar (3, 3)
e.Graphics.FillRectangle (Brushes.Black, rc)
Em seguida
Em seguida
Submarino da extremidade
Classe da extremidade
Geometria pública da classe
Enum público SegmentIntersection
Nenhumas = 0 'os segmentos são paralela e nunca cruzar-se-ão
Ponto = 1 'que os segmentos se cruzam fisicamente em um ponto
ExtrapolatedPoint = 2 'que os segmentos se cruzariam fisicamente em um ponto se um ou ambo o segmento era prolongado
Sobrepor = 3 'os segmentos são paralela e sobreposição em um ponto ou segmento
Extremidade Enum
Função compartilhada público SegmentIntersect (_
ByVal A como o ponto, ByVal B como o ponto, _
ByVal C como o ponto, ByVal D como o ponto, _
ByRef E como o ponto, ByRef F como o ponto) como SegmentIntersection
'Se um ou ambos os segmentos passados dentro é realmente um ponto então apenas fazer um cálculo de PointToSegmentDistance ():
Se A.Equals (B) OrElse C.Equals (D) então
Se A.Equals (B) AndAlso C.Equals (D) então
Se A.Equals (C) então
E = A
F = A
Geometry.SegmentIntersection.Point do retorno
Mais
Geometry.SegmentIntersection.None do retorno
Terminar se
ElseIf A.Equals (B) então
Se Geometry.PointToSegmentDistance (A.X, A.Y, C.X, C.Y, D.X, D.Y) = 0 então
E = A
F = A
Geometry.SegmentIntersection.Point do retorno
Terminar se
ElseIf C.Equals (D) então
Se Geometry.PointToSegmentDistance (C.X, C.Y, A.X, A.Y, B.X, B.Y) = 0 então
E = C
F = C
Geometry.SegmentIntersection.Point do retorno
Terminar se
Terminar se
Retornar Geometry.SegmentIntersection.None
Terminar se
'Nós temos dois segmentos reais… deixamos-nos fazer os cálculos para Det1 e Det2:
Det1 não ofuscante como o dobro = (A.Y - C.Y) * (D.X - C.X) - (A.X - C.X) * (D.Y - C.Y)
Det2 não ofuscante como o dobro = (B.X - A.X) * (D.Y - C.Y) - (B.Y - A.Y) * (D.X - C.X)
Se 0 <> então 'segmentos Det2 Non-Parallel (se cruzam ou se cruzariam se prolongado)
Det3 não ofuscante como o dobro = (A.Y - C.Y) * (B.X - A.X) - (A.X - C.X) * (B.Y - A.Y)
Det4 não ofuscante como o dobro = (B.X - A.X) * (D.Y - C.Y) - (B.Y - A.Y) * (D.X - C.X)
R não ofuscante como o dobro = o Det1/Det2
S não ofuscante como o dobro = o Det3/Det4
'Computar o ponto de interseção:
E.X = A.X + r * (B.X - A.X)
E.Y = A.Y + r * (B.Y - A.Y)
F = E
Se (>= 0 AndAlso de r r <>= 0 AndAlso s <> 0 então 'Non-Overlapping
Geometry.SegmentIntersection.None do retorno
Mais 'sobrepor (um ponto ou um segmento)
'Os segmentos paralelos são os mesmos
Se (A.Equals (C) AndAlso B.Equals (D)) OrElse (A.Equals (D) AndAlso B.Equals (C)) então
E = A
F = B
Geometry.SegmentIntersection.Overlapping do retorno
Terminar se
'Os segmentos paralelos sobrepor em exatamente um ponto
Se B.Equals (C) OrElse B.Equals (D) então
E = B
F = B
Geometry.SegmentIntersection.Overlapping do retorno
Terminar se
Se A.Equals (C) OrElse A.Equals (D) então
E = A
F = A
Geometry.SegmentIntersection.Overlapping do retorno
Terminar se
'Os segmentos paralelos estão sobrepor em um segmento
Se Geometry.SegmentContainsPoint (A, B, C) AndAlso Geometry.SegmentContainsPoint (C, D, B) então
E = C
F = B
Geometry.SegmentIntersection.Overlapping do retorno
ElseIf Geometry.SegmentContainsPoint (A, B, D) AndAlso Geometry.SegmentContainsPoint (D, C, B) então
E = D
F = B
Geometry.SegmentIntersection.Overlapping do retorno
ElseIf Geometry.SegmentContainsPoint (B, A, C) AndAlso Geometry.SegmentContainsPoint (C, D, A) então
E = C
F = A
Geometry.SegmentIntersection.Overlapping do retorno
ElseIf Geometry.SegmentContainsPoint (B, A, D) AndAlso Geometry.SegmentContainsPoint (D, C, A) então
E = D
F = A
Geometry.SegmentIntersection.Overlapping do retorno
ElseIf Geometry.SegmentContainsPoint (C, D, A) AndAlso Geometry.SegmentContainsPoint (A, B, D) então
E = A
F = D
Geometry.SegmentIntersection.Overlapping do retorno
ElseIf Geometry.SegmentContainsPoint (C, D, B) AndAlso Geometry.SegmentContainsPoint (B, A, D) então
E = B
F = D
Geometry.SegmentIntersection.Overlapping do retorno
ElseIf Geometry.SegmentContainsPoint (D, C, A) AndAlso Geometry.SegmentContainsPoint (A, B, C) então
E = A
F = C
Geometry.SegmentIntersection.Overlapping do retorno
ElseIf Geometry.SegmentContainsPoint (D, C, B) AndAlso Geometry.SegmentContainsPoint (B, A, C) então
E = B
F = C
Geometry.SegmentIntersection.Overlapping do retorno
Terminar se
'Um segmento contem completamente o outro
Se Geometry.SegmentContainsPoint (A, B, C) AndAlso Geometry.SegmentContainsPoint (A, B, D) então
E = C
F = D
Geometry.SegmentIntersection.Overlapping do retorno
Terminar se
Se Geometry.SegmentContainsPoint (C, D, A) AndAlso Geometry.SegmentContainsPoint (C, D, B) então
E = A
F = B
Geometry.SegmentIntersection.Overlapping do retorno
Terminar se
'Os segmentos são paralelos mas não tocando
Geometry.SegmentIntersection.None do retorno
Terminar se
Terminar se
Terminar a função
Função compartilhada público PointToPointDistance (machado de ByVal como único, _
ByVal Ay como único, ByVal Bx como único, ByVal perto como o único) _
Como único
'PointToPointDist = SquareRoot ((Bx - machado) ^2 + (por - Ay) ^2)
Math.Sqrt do retorno ((Bx - machado) * (Bx - machado) + (por - Ay) * (por - Ay))
Função do fim
Função compartilhada público PointToSegmentDistance (_
ByVal Px como único, ByVal PY como único, _
Machado de ByVal como único, ByVal Ay como único, _
ByVal Bx como único, ByVal perto como único) como único
Q não ofuscante como único
Se (machado = Bx) e (Ay = perto) então
'A e B passaram definem dentro um ponto, não uma linha.
'Ponto para apontar a distância
PointToPointDistance do retorno (Px, PY, machado, Ay)
Mais
'A distância está a um comprimento da linha necessário para conetar o ponto a
'(segmento) o tais que as duas linhas seriam perpendiculares.
'q é o valor parameterized necessário para começ à interseção
q = ((Px - machado) * (Bx - machado) + (PY - Ay) * (por - Ay)) /_
((Bx - machado) * (Bx - machado) + (por - Ay) * (por - Ay))
'Limitar q a 0 <> 1 então q = 1
'Distância
PointToPointDistance do retorno (_
Px, PY, (1 - q) * machado + q * Bx, (1 - q) * Ay + q * perto)
Terminar se
Terminar a função
Função compartilhada público SegmentContainsPoint (_
ByVal A como o ponto, ByVal B como o ponto, ByVal C como o ponto) como bôoleano
'Dois segmentos AB e o CD têm sido determinados já ter
'a mesma inclinação e a aquela que sobrepor.
'o AB é o segmento, e C é o ponto na pergunta.
'Se o AB contem C a seguir verdadeiro do retorno, se não retorno falso
Se C.Equals (A) ou C.Equals (B) então
Do retorno retificar
ElseIf A.X = B.X então 'projeta-se ao Y-Axis para linhas verticais
minY não ofuscante como o inteiro = o Math.Min (A.Y, B.Y)
maxY não ofuscante como o inteiro = o Math.Max (A.Y, B.Y)
Se minY <>
|