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:
|
Общественный тип Form1
Приватные полигоны как новый список (списка (пункта))
Приватное KSpoints как список (пункта) = ничего
Приватная подводная лодка PictureBox1_MouseUp (прислужник ByVal как предмет, ByVal e как System.Windows.Forms.MouseEventArgs) регулирует PictureBox1.MouseUp
Если IsNothing (KSpoints) после этого
KSpoints = новый список (пункта)
Polygons.Add (KSpoints)
Закончитесь если
KSpoints.Add (e.Location)
Если KSpoints.Count = 4 после этого
Тусклый ptE, ptF как пункт
Тусклые просто как булевско = True
Если Geometry.SegmentIntersect, то (KSpoints (0), KSpoints (3), KSpoints (1), KSpoints (2), ptE, ptF) = Geometry.SegmentIntersection.Point после этого
'проверите для пересечения между линиями сформированными 0 к 3 и от 1 до 2.
Для каждого pt как пункт в KSpoints
Если не pt. Равные (ptE) после этого
Просто = ложно
Выходите для
Закончитесь если
Затем
Если просто после этого
'обмените последние 2 пункта
Затемните pt как пункт = KSpoints (3)
KSpoints.RemoveAt (3)
KSpoints.Insert (2, pt)
Закончитесь если
KSpoints = ничего
PictureBox1.Refresh ()
Выходите подводная лодка
Закончитесь если
Если Geometry.SegmentIntersect, то (KSpoints (0), KSpoints (1), KSpoints (2), KSpoints (3), ptE, ptF) = Geometry.SegmentIntersection.Point после этого
'проверите для пересечения между линиями сформированными 0 к 1 и от 2 до 3.
Для каждого pt как пункт в KSpoints
Если не pt. Равные (ptE) после этого
Просто = ложно
Выходите для
Закончитесь если
Затем
Если просто после этого
'обмените 2 средних пункта
Затемните pt как пункт = KSpoints (2)
KSpoints.RemoveAt (2)
KSpoints.Insert (1, pt)
KSpoints = ничего
PictureBox1.Refresh ()
Выходите подводная лодка
Закончитесь если
Закончитесь если
KSpoints = ничего
PictureBox1.Refresh ()
Еще
PictureBox1.Refresh ()
Закончитесь если
Закончите подводную лодку
Приватная подводная лодка PictureBox1_Paint (прислужник ByVal как предмет, ByVal e как System.Windows.Forms.PaintEventArgs) регулирует PictureBox1.Paint
Статические цветы () как цвет = {Color.Red, Color.Green, Color.Blue, Color.Purple}
Для каждого полигона как список (пункта) в полигонах
Если полигон. Отсчет > 1 после этого
Для I как интежер = 0 к полигону. Отсчет - 2
Using p как новая ручка (цветы (I))
e.Graphics.DrawLine (p, полигон (I), полигон (I + 1))
Конец Using
Затем
Если полигон. Отсчет > 2 после этого
Using p как новая ручка (цветы (полигон. Отсчет - 1))
e.Graphics.DrawLine (p, полигон (полигон. Отсчет - 1), полигон (0))
Конец Using
Закончитесь если
Закончитесь если
Для каждого pt как пункт в полигоне
Тусклое rc как новый прямоугольник (pt, новый размер (1, 1))
rc. Надуйте (3, 3)
e.Graphics.FillRectangle (Brushes.Black, rc)
Затем
Затем
Подводная лодка конца
Тип конца
Общественная геометрия типа
Общественное Enum SegmentIntersection
Никакие = 0 'этапы будут параллель и никогда не будут пересекать
Пункт = 1 ', котор этапы физическ пересекают в одном пункте
ExtrapolatedPoint = 2 ', котор этапы физическ пересекли бы в одном пункте если один или оба этапа были продленны
Перекрывающ = 3 'этапами будут параллелью и перекрытием в пункте или этапом
Конец Enum
Функция делят публикой, котор SegmentIntersect (_
ByVal a как пункт, ByVal b как пункт, _
ByVal c как пункт, ByVal d как пункт, _
ByRef e как пункт, ByRef f как пункт) как SegmentIntersection
'Если один или оба из этапов ых внутри будут фактическ пунктом после этого как раз, то сделайте вычисление PointToSegmentDistance ():
Если A.Equals (b) OrElse C.Equals (d) после этого
Если A.Equals (b) AndAlso C.Equals (d) после этого
Если A.Equals (c) после этого
E = A
F = A
Возвращенное Geometry.SegmentIntersection.Point
Еще
Возвращенное Geometry.SegmentIntersection.None
Закончитесь если
ElseIf A.Equals (b) после этого
Если Geometry.PointToSegmentDistance (A.X, A.Y, C.X, C.Y, D.X, D.Y) = 0 после этого
E = A
F = A
Возвращенное Geometry.SegmentIntersection.Point
Закончитесь если
ElseIf C.Equals (d) после этого
Если Geometry.PointToSegmentDistance (C.X, C.Y, A.X, A.Y, B.X, B.Y) = 0 после этого
E = C
F = C
Возвращенное Geometry.SegmentIntersection.Point
Закончитесь если
Закончитесь если
Возвратите Geometry.SegmentIntersection.None
Закончитесь если
'Мы имеем 2 фактических этапа… препятствовали нам сделать вычисления для Det1 и Det2:
Тусклое Det1 как двойник = (A.Y - C.Y) * (D.X - C.X) - (A.X - C.X) * (D.Y - C.Y)
Тусклое Det2 как двойник = (B.X - A.X) * (D.Y - C.Y) - (B.Y - A.Y) * (D.X - C.X)
Если 0 <> после этого 'Non-Parallel этапы, то Det2 (они пересекает или пересекло бы если продленно), то
Тусклое Det3 как двойник = (A.Y - C.Y) * (B.X - A.X) - (A.X - C.X) * (B.Y - A.Y)
Тусклое Det4 как двойник = (B.X - A.X) * (D.Y - C.Y) - (B.Y - A.Y) * (D.X - C.X)
Тусклый r как двойник = Det1/Det2
Тусклый s как двойник = Det3/Det4
'Вычислите пункт пересечения:
E.X = A.X + r * (B.X - A.X)
E.Y = A.Y + r * (B.Y - A.Y)
F = E
Если (>= 0 AndAlso r r <>= 0 AndAlso s <> 0 после этого 'Non-Overlapping
Возвращенное Geometry.SegmentIntersection.None
Еще 'перекрывающ (один пункт или этап)
'Параллельные этапы этими же
Если (A.Equals (c) AndAlso B.Equals, то (d)) OrElse (A.Equals (d) AndAlso B.Equals (c)) После этого
E = A
F = B
Возвращенное Geometry.SegmentIntersection.Overlapping
Закончитесь если
'Параллельные этапы перекрывают в точно одном пункте
Если B.Equals (c) OrElse B.Equals (d) после этого
E = B
F = B
Возвращенное Geometry.SegmentIntersection.Overlapping
Закончитесь если
Если A.Equals (c) OrElse A.Equals (d) после этого
E = A
F = A
Возвращенное Geometry.SegmentIntersection.Overlapping
Закончитесь если
'Параллельные этапы перекрывают в этапе
Если Geometry.SegmentContainsPoint (a, b, c) AndAlso Geometry.SegmentContainsPoint (c, d, b) после этого
E = C
F = B
Возвращенное Geometry.SegmentIntersection.Overlapping
ElseIf Geometry.SegmentContainsPoint (a, b, d) AndAlso Geometry.SegmentContainsPoint (d, c, b) после этого
E = D
F = B
Возвращенное Geometry.SegmentIntersection.Overlapping
ElseIf Geometry.SegmentContainsPoint (b, a, c) AndAlso Geometry.SegmentContainsPoint (c, d, a) после этого
E = C
F = A
Возвращенное Geometry.SegmentIntersection.Overlapping
ElseIf Geometry.SegmentContainsPoint (b, a, d) AndAlso Geometry.SegmentContainsPoint (d, c, a) после этого
E = D
F = A
Возвращенное Geometry.SegmentIntersection.Overlapping
ElseIf Geometry.SegmentContainsPoint (c, d, a) AndAlso Geometry.SegmentContainsPoint (a, b, d) после этого
E = A
F = D
Возвращенное Geometry.SegmentIntersection.Overlapping
ElseIf Geometry.SegmentContainsPoint (c, d, b) AndAlso Geometry.SegmentContainsPoint (b, a, d) после этого
E = B
F = D
Возвращенное Geometry.SegmentIntersection.Overlapping
ElseIf Geometry.SegmentContainsPoint (d, c, a) AndAlso Geometry.SegmentContainsPoint (a, b, c) после этого
E = A
F = C
Возвращенное Geometry.SegmentIntersection.Overlapping
ElseIf Geometry.SegmentContainsPoint (d, c, b) AndAlso Geometry.SegmentContainsPoint (b, a, c) после этого
E = B
F = C
Возвращенное Geometry.SegmentIntersection.Overlapping
Закончитесь если
'Один этап вполне содержит другое
Если Geometry.SegmentContainsPoint (a, b, c) AndAlso Geometry.SegmentContainsPoint (a, b, d) после этого
E = C
F = D
Возвращенное Geometry.SegmentIntersection.Overlapping
Закончитесь если
Если Geometry.SegmentContainsPoint (c, d, a) AndAlso Geometry.SegmentContainsPoint (c, d, b) после этого
E = A
F = B
Возвращенное Geometry.SegmentIntersection.Overlapping
Закончитесь если
'Этапы параллельны но касатьющся
Возвращенное Geometry.SegmentIntersection.None
Закончитесь если
Закончитесь если
Закончите функцию
Функция делят публикой, котор PointToPointDistance (ось ByVal как одиночно, _
ByVal Ay как одиночно, ByVal Bx как одиночно, ByVal мимо как одиночное) _
Как одиночно
'PointToPointDist = SquareRoot ((Bx - ось) ^2 + (- Ay) ^2)
Возвращенное Math.Sqrt ((Bx - ось) * (Bx - ось) + (- Ay) * (- Ay))
Функция конца
Функция делят публикой, котор PointToSegmentDistance (_
ByVal Px как одиночно, ByVal Py как одиночно, _
Ось ByVal как одиночно, ByVal Ay как одиночно, _
ByVal Bx как одиночно, ByVal мимо как одиночно) как одиночно
Тусклый q как одиночно
Если (ось = Bx) и (Ay = мимо) после этого
'A и b прошли внутри определяют пункт, не линию.
'Пункт для того чтобы указать расстояние
Возвращенное PointToPointDistance (Px, Py, ось, Ay)
Еще
'Расстоянием будет длина линии необходимо для того чтобы соединить пункт к
'(этап) такие что 2 линии были перпендикулярны.
'q будет parameterized значение необходим для того чтобы получить к пересечению
q = ((Px - ось) * (Bx - ось) + (Py - Ay) * (- Ay)) /_
((Bx - ось) * (Bx - ось) + (- Ay) * (- Ay))
'Ограничивайте q до 0 <> 1 после этого q = 1
'Расстояние
Возвращенное PointToPointDistance (_
Px, Py, (1 - q) * ось + q * Bx, (1 - q) * Ay + q * мимо)
Закончитесь если
Закончите функцию
Функция делят публикой, котор SegmentContainsPoint (_
ByVal a как пункт, ByVal b как пункт, ByVal c как пункт) как булевско
'2 этапа AB и КОМПАКТНЫЙ ДИСК уже определенный для того чтобы иметь
'такой же наклон и то, котор они перекрывают.
'AB будет этап, и c будет пунктом в вопросе.
'Если AB содержит c тогда возвращенное поистине, то в противном случае возвращение ложное
Если C.Equals (a) или C.Equals (b) после этого
Возвращенно True
ElseIf A.X = B.X после этого 'проектирует к Y-osи для вертикальных линий
Тусклое minY как интежер = Math.Min (A.Y, B.Y)
Тусклое maxY как интежер = Math.Max (A.Y, B.Y)
Если minY <>
|