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:
|
Codice categoria pubblico Form1
Poligoni riservati come nuova lista (della lista (di punto))
KSpoints riservato come lista (di punto) = niente
Il sommergibile riservato PictureBox1_MouseUp (mittente di ByVal come oggetto, ByVal e come System.Windows.Forms.MouseEventArgs) tratta PictureBox1.MouseUp
Se IsNothing (KSpoints) allora
KSpoints = nuova lista (di punto)
Polygons.Add (KSpoints)
Concluder se
KSpoints.Add (e.Location)
Se KSpoints.Count = 4 allora
PTE fioca, ptF come punto
Semplici fiochi come booleani = allineano
Se Geometry.SegmentIntersect (KSpoints (0), KSpoints (3), KSpoints (1), KSpoints (2), PTE, ptF) = Geometry.SegmentIntersection.Point allora
'controllare per vedere se c'è l'intersezione fra le linee costituite da 0 - 3 e 1 - 2.
Per ogni pinta come punto in KSpoints
Se non pinta. Uguali (PTE) allora
Semplice = falso
Uscire per
Concluder se
Dopo
Se non semplice allora
'scambiare gli ultimi due punti
Oscurare la pinta come punto = KSpoints (3)
KSpoints.RemoveAt (3)
KSpoints.Insert (2, pinta)
Concluder se
KSpoints = niente
PictureBox1.Refresh ()
Uscire il sommergibile
Concluder se
Se Geometry.SegmentIntersect (KSpoints (0), KSpoints (1), KSpoints (2), KSpoints (3), PTE, ptF) = Geometry.SegmentIntersection.Point allora
'controllare per vedere se c'è l'intersezione fra le linee costituite da 0 - 1 e 2 - 3.
Per ogni pinta come punto in KSpoints
Se non pinta. Uguali (PTE) allora
Semplice = falso
Uscire per
Concluder se
Dopo
Se non semplice allora
'scambiare i due punti centrali
Oscurare la pinta come punto = KSpoints (2)
KSpoints.RemoveAt (2)
KSpoints.Insert (1, pinta)
KSpoints = niente
PictureBox1.Refresh ()
Uscire il sommergibile
Concluder se
Concluder se
KSpoints = niente
PictureBox1.Refresh ()
Altrimenti
PictureBox1.Refresh ()
Concluder se
Concludere il sommergibile
Il sommergibile riservato PictureBox1_Paint (mittente di ByVal come oggetto, ByVal e come System.Windows.Forms.PaintEventArgs) tratta PictureBox1.Paint
Colori statici () come colore = {Color.Red, Color.Green, Color.Blue, Color.Purple}
Per ogni poligono come lista (di punto) nei poligoni
Se poligono. Conteggio > 1 allora
Per la i come numero intero = 0 al poligono. Conteggio - 2
Using la P come nuova penna (colori (i))
e.Graphics.DrawLine (P, poligono (i), poligono (i + 1))
Estremità Using
Dopo
Se poligono. Conteggio > 2 allora
Using la P come nuova penna (colori (poligono. Conteggio - 1))
e.Graphics.DrawLine (P, poligono (poligono. Conteggio - 1), poligono (0))
Estremità Using
Concluder se
Concluder se
Per ogni pinta come punto nel poligono
Rc fioco come nuovo rettangolo (pinta, nuovo formato (1, 1))
rc. Gonfiare (3, 3)
e.Graphics.FillRectangle (Brushes.Black, rc)
Dopo
Dopo
Sommergibile dell'estremità
Codice categoria dell'estremità
La geometria pubblica del codice categoria
Enum pubblico SegmentIntersection
Nessun = 0 'i segmenti sono parallelo e mai non intersecheranno
Punto = 1 'che i segmenti intersecano fisicamente in un punto
ExtrapolatedPoint = 2 'che i segmenti avrebbero intersecato fisicamente in un punto se un o entrambe il segmento fosse esteso
Coincidendo = 3 'i segmenti sono parallelo e sovrapposizione in un punto o segmento
Estremità Enum
Funzione comune pubblico SegmentIntersect (_
ByVal A come punto, ByVal B come punto, _
ByVal C come punto, ByVal D come punto, _
ByRef E come punto, ByRef F come punto) come SegmentIntersection
'Se uno o entrambi i segmenti passati dentro è appena realmente un punto allora fare un calcolo di PointToSegmentDistance ():
Se A.Equals (B) OrElse C.Equals (D) allora
Se A.Equals (B) AndAlso C.Equals (D) allora
Se A.Equals (C) allora
E = A
F = A
Geometry.SegmentIntersection.Point di ritorno
Altrimenti
Geometry.SegmentIntersection.None di ritorno
Concluder se
ElseIf A.Equals (B) allora
Se Geometry.PointToSegmentDistance (A.X, A.Y, C.X, C.Y, D.X, D.Y) = 0 allora
E = A
F = A
Geometry.SegmentIntersection.Point di ritorno
Concluder se
ElseIf C.Equals (D) allora
Se Geometry.PointToSegmentDistance (C.X, C.Y, A.X, A.Y, B.X, B.Y) = 0 allora
E = C
F = C
Geometry.SegmentIntersection.Point di ritorno
Concluder se
Concluder se
Restituire Geometry.SegmentIntersection.None
Concluder se
'Abbiamo due segmenti reali… li abbiamo lasciati fare i calcoli per Det1 e Det2:
Det1 fioco come doppio = (A.Y - C.Y) * (D.X - C.X) - (A.X - C.X) * (D.Y - C.Y)
Det2 fioco come doppio = (B.X - A.X) * (D.Y - C.Y) - (B.Y - A.Y) * (D.X - C.X)
Se Det2 <> 0 allora 'segmenti non paralleli (intersecano o intersecherebbero se esteso)
Det3 fioco come doppio = (A.Y - C.Y) * (B.X - A.X) - (A.X - C.X) * (B.Y - A.Y)
Det4 fioco come doppio = (B.X - A.X) * (D.Y - C.Y) - (B.Y - A.Y) * (D.X - C.X)
R fioca come il doppio = Det1/Det2
S fioca come il doppio = Det3/Det4
'Computare il punto di intersezione:
E.X = A.X + r * (B.X - A.X)
E.Y = A.Y + r * (B.Y - A.Y)
F = E
Se (>= 0 AndAlso della r r <>= 0 AndAlso s <> 0 allora 'non sovrapponibili
Geometry.SegmentIntersection.None di ritorno
Altrimenti 'coincidendo (un punto o un segmento)
'I segmenti paralleli sono gli stessi
Se (A.Equals (C) AndAlso B.Equals (D)) OrElse (A.Equals (D) AndAlso B.Equals (C)) allora
E = A
F = B
Geometry.SegmentIntersection.Overlapping di ritorno
Concluder se
'I segmenti paralleli coincidono in esattamente un punto
Se B.Equals (C) OrElse B.Equals (D) allora
E = B
F = B
Geometry.SegmentIntersection.Overlapping di ritorno
Concluder se
Se A.Equals (C) OrElse A.Equals (D) allora
E = A
F = A
Geometry.SegmentIntersection.Overlapping di ritorno
Concluder se
'I segmenti paralleli stanno coincidendo in un segmento
Se Geometry.SegmentContainsPoint (A, B, C) AndAlso Geometry.SegmentContainsPoint (C, D, B) allora
E = C
F = B
Geometry.SegmentIntersection.Overlapping di ritorno
ElseIf Geometry.SegmentContainsPoint (A, B, D) AndAlso Geometry.SegmentContainsPoint (D, C, B) allora
E = D
F = B
Geometry.SegmentIntersection.Overlapping di ritorno
ElseIf Geometry.SegmentContainsPoint (B, A, C) AndAlso Geometry.SegmentContainsPoint (C, D, A) allora
E = C
F = A
Geometry.SegmentIntersection.Overlapping di ritorno
ElseIf Geometry.SegmentContainsPoint (B, A, D) AndAlso Geometry.SegmentContainsPoint (D, C, A) allora
E = D
F = A
Geometry.SegmentIntersection.Overlapping di ritorno
ElseIf Geometry.SegmentContainsPoint (C, D, A) AndAlso Geometry.SegmentContainsPoint (A, B, D) allora
E = A
F = D
Geometry.SegmentIntersection.Overlapping di ritorno
ElseIf Geometry.SegmentContainsPoint (C, D, B) AndAlso Geometry.SegmentContainsPoint (B, A, D) allora
E = B
F = D
Geometry.SegmentIntersection.Overlapping di ritorno
ElseIf Geometry.SegmentContainsPoint (D, C, A) AndAlso Geometry.SegmentContainsPoint (A, B, C) allora
E = A
F = C
Geometry.SegmentIntersection.Overlapping di ritorno
ElseIf Geometry.SegmentContainsPoint (D, C, B) AndAlso Geometry.SegmentContainsPoint (B, A, C) allora
E = B
F = C
Geometry.SegmentIntersection.Overlapping di ritorno
Concluder se
'Un segmento completamente contiene l'altro
Se Geometry.SegmentContainsPoint (A, B, C) AndAlso Geometry.SegmentContainsPoint (A, B, D) allora
E = C
F = D
Geometry.SegmentIntersection.Overlapping di ritorno
Concluder se
Se Geometry.SegmentContainsPoint (C, D, A) AndAlso Geometry.SegmentContainsPoint (C, D, B) allora
E = A
F = B
Geometry.SegmentIntersection.Overlapping di ritorno
Concluder se
'I segmenti sono paralleli ma non toccanti
Geometry.SegmentIntersection.None di ritorno
Concluder se
Concluder se
Concludere la funzione
Funzione comune pubblico PointToPointDistance (ascia di ByVal come singola, _
ByVal Ay come singolo, ByVal Bx come singolo, ByVal vicino come singolo) _
Come singolo
'PointToPointDist = SquareRoot ((Bx - ascia) ^2 + (da - Ay) ^2)
Math.Sqrt di ritorno ((Bx - ascia) * (Bx - ascia) + (da - Ay) * (da - Ay))
Funzione di conclusione
Funzione comune pubblico PointToSegmentDistance (_
ByVal Px come singolo, ByVal PY come singolo, _
Ascia di ByVal come singola, ByVal Ay come singolo, _
ByVal Bx come singolo, ByVal vicino come singolo) come singolo
Q fioca come singola
Se (ascia = Bx) e (Ay = vicino) allora
'A e la B sono passato dentro definiscono un punto, non una linea.
'Distanza punto a punto
PointToPointDistance di ritorno (Px, PY, ascia, Ay)
Altrimenti
'La distanza è la lunghezza della linea stata necessaria per collegare il punto a
'(segmento) il tali che le due linee sarebbero perpendicolari.
'la q è il valore parametrizzato stato necessario per ottenere all'intersezione
q = ((Px - ascia) * (Bx - ascia) + (il PY - Ay) * (da - Ay)) /_
((Bx - ascia) * (Bx - ascia) + (da - Ay) * (da - Ay))
'Limitare la q a 0 <> 1 allora q = 1
'Distanza
PointToPointDistance di ritorno (_
Px, PY, (1 - q) * ascia + q * Bx, (1 - q) * Ay + q * vicino)
Concluder se
Concludere la funzione
Funzione comune pubblico SegmentContainsPoint (_
ByVal A come punto, ByVal B come punto, ByVal C come punto) come booleano
'Due segmenti ab ed il CD già sono stati determinati per avere
'lo stesso pendio e quello che coincidono.
'l'ab è il segmento e la C è il punto in questione.
'Se l'ab contiene la C quindi allineare di ritorno, altrimenti ritorno falso
Se C.Equals (A) o C.Equals (B) allora
Di ritorno allineare
ElseIf A.X = B.X allora 'proietta al Y-Axis per le linee verticali
minY fioco come il numero intero = Math.Min (A.Y, B.Y)
maxY fioco come il numero intero = Math.Max (A.Y, B.Y)
Se minY <>
|