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:
|
Allmänhet klassificerar Form1
Privata polygoner som nya listar (av lista (av peka)),
Privata KSpoints som listar (av peka), = ingenting
Den privata suben PictureBox1_MouseUp (den ByVal avsändaren som anmärker, ByVal e som System.Windows.Forms.MouseEventArgs) behandlar PictureBox1.MouseUp
Om IsNothing (KSpoints) därefter
KSpoints = nytt listar (av peka),
Polygons.Add (KSpoints)
Avsluta om
KSpoints.Add (e.Location)
Om KSpoints.Count = 4 därefter
Dunkel ptE, ptF som pekar
Dunkla enkla som Boolean = True
Om Geometry.SegmentIntersect (KSpoints (0), KSpoints (3), KSpoints (1), KSpoints (2), ptE, ptF) = Geometry.SegmentIntersection.Point därefter
'kontrollen för genomskärning between fodrar bildat av 0 till 3 och 1 till 2.
För varje liter som pekar i KSpoints
Om inte liter. Jämliken (ptE) därefter
Enkelt = falskt
Gå ut för
Avsluta om
Därefter
Om inte enkelt därefter
'byt de sist tvåna pekar
Dunkel liter som pekar = KSpoints (3)
KSpoints.RemoveAt (3)
KSpoints.Insert (2, liter)
Avsluta om
KSpoints = ingenting
PictureBox1.Refresh ()
Gå ut suben
Avsluta om
Om Geometry.SegmentIntersect (KSpoints (0), KSpoints (1), KSpoints (2), KSpoints (3), ptE, ptF) = Geometry.SegmentIntersection.Point därefter
'kontrollen för genomskärning between fodrar bildat av 0 till 1 och 2 till 3.
För varje liter som pekar i KSpoints
Om inte liter. Jämliken (ptE) därefter
Enkelt = falskt
Gå ut för
Avsluta om
Därefter
Om inte enkelt därefter
'byt tvåna som en mitt pekar
Dunkel liter som pekar = KSpoints (2)
KSpoints.RemoveAt (2)
KSpoints.Insert (1, liter)
KSpoints = ingenting
PictureBox1.Refresh ()
Gå ut suben
Avsluta om
Avsluta om
KSpoints = ingenting
PictureBox1.Refresh ()
Annars
PictureBox1.Refresh ()
Avsluta om
Avsluta suben
Den privata suben PictureBox1_Paint (den ByVal avsändaren som anmärker, ByVal e som System.Windows.Forms.PaintEventArgs) behandlar PictureBox1.Paint
Statisk elektricitet färgar () som färgar = {Color.Red, Color.Green, Color.Blue, Color.Purple}
För varje polygon som listar (av peka), i polygoner
Om polygon. Räkning > 1 därefter
För I som heltal = 0 till polygonen. Räkning - 2
Using P som nytt skriva (färgar (I))
e.Graphics.DrawLine (P, polygon (I), polygon (I + 1))
Avsluta Using
Därefter
Om polygon. Räkning > 2 därefter
Using P som nytt skriva (färgar (polygonen. Räkning - 1))
e.Graphics.DrawLine (P, polygon (polygonen. Räkning - 1), polygon (0))
Avsluta Using
Avsluta om
Avsluta om
För varje liter som pekar i polygon
Dunkel rc som ny rektangel (liter som är ny storleksanpassar (1, 1))
rc. Inflate (3, 3)
e.Graphics.FillRectangle (Brushes.Black, rc)
Därefter
Därefter
Avsluta suben
Avsluta klassificerar
Allmänhet klassificerar geometri
Offentliga Enum SegmentIntersection
Inget = 0 'segmenterar är parallellen och ska skär aldrig
Peka = 1 'segmenterar skär fysiskt i en pekar
ExtrapolatedPoint = 2 'segmenterar skulle fysiskt skär i en pekar, om man eller båda segmenterar var fördjupade
Överlappa = 3 'segmenterar är parallellen och överlappningen i en peka eller segmenterar
Avsluta Enum
Delad allmänhet fungerar SegmentIntersect (_,
ByVal A som pekar, ByVal B som pekar, _,
ByVal C som pekar, ByVal D som pekar, _,
ByRef E som pekar, ByRef F som pekar) som SegmentIntersection
'Om en eller båda av segmenterar passerat in är faktiskt en peka därefter gör precis en PointToSegmentDistance () beräkning:
Om A.Equals (B) OrElse C.Equals (D) därefter
Om A.Equals (B) AndAlso C.Equals (D) därefter
Om A.Equals (C) därefter
E = A
F = A
Återgång Geometry.SegmentIntersection.Point
Annars
Återgång Geometry.SegmentIntersection.None
Avsluta om
ElseIf A.Equals (B) därefter
Om Geometry.PointToSegmentDistance (A.X, A.Y, C.X, C.Y, D.X, D.Y) = 0 därefter
E = A
F = A
Återgång Geometry.SegmentIntersection.Point
Avsluta om
ElseIf C.Equals (D) därefter
Om Geometry.PointToSegmentDistance (C.X, C.Y, A.X, A.Y, B.X, B.Y) = 0 därefter
E = C
F = C
Återgång Geometry.SegmentIntersection.Point
Avsluta om
Avsluta om
Gå Geometry.SegmentIntersection.None tillbaka
Avsluta om
'Vi har faktiska två segmenterar… l5At oss göra beräkningarna för Det1 och Det2:
Dunkel Det1 som dubbelt = (A.Y - C.Y) * (D.X - C.X) - (A.X - C.X) * (D.Y - C.Y)
Dunkel Det2 som dubbelt = (B.X - A.X) * (D.Y - C.Y) - (B.Y - A.Y) * (D.X - C.X)
Om ickeparallell <> Det2 0 'segmenterar därefter (de skär eller skulle skär, om fördjupat)
Dunkel Det3 som dubbelt = (A.Y - C.Y) * (B.X - A.X) - (A.X - C.X) * (B.Y - A.Y)
Dunkel Det4 som dubbelt = (B.X - A.X) * (D.Y - C.Y) - (B.Y - A.Y) * (D.X - C.X)
Dunkelt r som dubbelt = Det1/Det2
Dunkelt s som dubbelt = Det3/Det4
'Beräkna genomskärningen pekar:
E.X = A.X + r * (B.X - A.X)
E.Y = A.Y + r * (B.Y - A.Y)
F = E
Om (r->= 0 AndAlso r <>= 0 Non-Overlapping AndAlso <> s 0 därefter '
Återgång Geometry.SegmentIntersection.None
Annars 'överlappa (man pekar eller en segmentera),
'Parallellen segmenterar är samma
Om (A.Equals (C) AndAlso B.Equals (D)) OrElse (A.Equals (D) AndAlso B.Equals (C)) Därefter
E = A
F = B
Återgång Geometry.SegmentIntersection.Overlapping
Avsluta om
'Parallellen segmenterar överlappning i exakt en pekar
Om B.Equals (C) OrElse B.Equals (D) därefter
E = B
F = B
Återgång Geometry.SegmentIntersection.Overlapping
Avsluta om
Om A.Equals (C) OrElse A.Equals (D) därefter
E = A
F = A
Återgång Geometry.SegmentIntersection.Overlapping
Avsluta om
'Parallellen segmenterar överlappar i en segmentera
Om Geometry.SegmentContainsPoint (A, B, C) AndAlso Geometry.SegmentContainsPoint (C, D, B) därefter
E = C
F = B
Återgång Geometry.SegmentIntersection.Overlapping
ElseIf Geometry.SegmentContainsPoint (A, B, D) AndAlso Geometry.SegmentContainsPoint (D, C, B) därefter
E = D
F = B
Återgång Geometry.SegmentIntersection.Overlapping
ElseIf Geometry.SegmentContainsPoint (B, A, C) AndAlso Geometry.SegmentContainsPoint (C, D, A) därefter
E = C
F = A
Återgång Geometry.SegmentIntersection.Overlapping
ElseIf Geometry.SegmentContainsPoint (B, A, D) AndAlso Geometry.SegmentContainsPoint (D, C, A) därefter
E = D
F = A
Återgång Geometry.SegmentIntersection.Overlapping
ElseIf Geometry.SegmentContainsPoint (C, D, A) AndAlso Geometry.SegmentContainsPoint (A, B, D) därefter
E = A
F = D
Återgång Geometry.SegmentIntersection.Overlapping
ElseIf Geometry.SegmentContainsPoint (C, D, B) AndAlso Geometry.SegmentContainsPoint (B, A, D) därefter
E = B
F = D
Återgång Geometry.SegmentIntersection.Overlapping
ElseIf Geometry.SegmentContainsPoint (D, C, A) AndAlso Geometry.SegmentContainsPoint (A, B, C) därefter
E = A
F = C
Återgång Geometry.SegmentIntersection.Overlapping
ElseIf Geometry.SegmentContainsPoint (D, C, B) AndAlso Geometry.SegmentContainsPoint (B, A, C) därefter
E = B
F = C
Återgång Geometry.SegmentIntersection.Overlapping
Avsluta om
'Man segmenterar innehåller fullständigt annan
Om Geometry.SegmentContainsPoint (A, B, C) AndAlso Geometry.SegmentContainsPoint (A, B, D) därefter
E = C
F = D
Återgång Geometry.SegmentIntersection.Overlapping
Avsluta om
Om Geometry.SegmentContainsPoint (C, D, A) AndAlso Geometry.SegmentContainsPoint (C, D, B) därefter
E = A
F = B
Återgång Geometry.SegmentIntersection.Overlapping
Avsluta om
'Segmenterar är parallellt men inte röra
Återgång Geometry.SegmentIntersection.None
Avsluta om
Avsluta om
Avsluta fungerar
Delad allmänhet fungerar PointToPointDistance (den ByVal axen som singeln, _,
ByVal Ay som singel, ByVal Bx som singel, ByVal By som _ för singel),
Som singel
'PointToPointDist = SquareRoot ((Bx - Ax) ^2 + (vid - Ay) ^2)
Återgång Math.Sqrt ((Bx - Ax) * (Bx - Ax) + (vid - Ay) * (vid - Ay))
Avsluta fungerar
Delad allmänhet fungerar PointToSegmentDistance (_,
ByVal Px som singeln, ByVal Py som singeln, _,
ByVal Ax som singeln, ByVal Ay som singeln, _,
ByVal Bx som singel, ByVal By som singel) som singel
Dunkelt q som singel
Om (Ax = Bx) och (Ay = By) därefter
'A och B passerade definierar in en peka, inte en fodra.
'Peka för att peka distanserar
Gå PointToPointDistance (Px, Py, axen, Ay) tillbaka
Annars
'Distansera är längden av fodra som behövs för att förbinda peka till
'(segmentera), det sådan, att tvåna fodrar, skulle är vinkelrätt.
'q är parameterized värderar nödvändigt för att få till genomskärningen
q = ((Px - Ax) * (Bx - Ax) + (Py - Ay) * (vid - Ay)) /_,
((Bx - Ax) * (Bx - Ax) + (vid - Ay) * (vid - Ay))
'Begränsa q till 0 <> 1 därefter q = 1
'Distansera
Gå PointToPointDistance (_ tillbaka,
Px Py, (1 - q) * Ax + q * Bx, (1 - q) * Ay + q * By)
Avsluta om
Avsluta fungerar
Delad allmänhet fungerar SegmentContainsPoint (_,
ByVal A som pekar, ByVal B som pekar, ByVal C som pekar) som Boolean
'Två segmenterar AB, och CD har redan varit beslutsam att ha
'samma sluttar, och det som de överlappar.
'AB är segmentera, och C är peka ifrågasätter in.
'Om AB innehåller C då återgångt riktigt, annorlunda falsk retur
Om C.Equals (A) eller C.Equals (B) därefter
Återgångt True
ElseIf A.X = B.X 'projekterar därefter till yen-Axis för lodlinje fodrar
Dunkel minY som heltalet = Math.Min (A.Y, B.Y)
Dunkel maxY som heltalet = Math.Max (A.Y, B.Y)
Om minY <>
|