Вопрос : Пункты заказов в прямоугольнике

Я имею блок содержать 4 произвольных пункта. Мне нужно приказать эти в «нормальной» последовательности прямоугольника. верхним левым, верхним правом, нижним правом, нижнее left.

What будет хорошая дорога сделать это?
class=

Ответ : Пункты заказов в прямоугольнике

Я надеюсь я имеет как раз серьезно overthunk это одно и будет фактическ более легкая дорога.  Я делал вычисляет пункты пересечения между линиями созданными путем соединять пункты полигона и испытанными для того чтобы увидеть если то пересечение не одной из вершин.  Если это будет случаем после этого я, то обмените соотвествующие 2 пункта для того чтобы сделать полигоном правильный «просто» один:
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  <>
           
Другие решения  
  •  Как я добавляю кнопки на форме PDF для того чтобы добавить/извлекаю рядки данных?
  •  Шнур ошибки в блоке задвижки?
  •  сколько вариант сервера SQL на одной машине
  •  Внешний вид 2007 не может архивный файл открытой сети сохраненный
  •  Активно директория DNS записывает вопрос
  •  Отчет о доступа 2010 экспорта к CSV с коллекторами?
  •  Прокладчик OCE 9400 не начинает
  •  как добавить десятичное место в формуле в отчете о кристалла seagate
  •  Windows XP и Мичрософт Оутлоок и проблемы установителя Windows
  •  VB6 к VS2010 - консультации тренировки?
  •  
    programming4us programming4us