Cuestión : Puntos de orden en rectángulo

Tengo un arsenal el contener de cuatro puntos arbitrarios. Necesito pedir éstos en la secuencia “normal” del rectángulo. ¿la derecha izquierda, superior superior, la derecha inferior, left.

What es una buena manera de hacer esto?
class= del

Respuesta : Puntos de orden en rectángulo

Espero que tenga apenas seriamente overthunk éste y hay realmente una manera más fácil.  Qué he hecho se computa los puntos de intersección entre las líneas creadas conectando los puntos del polígono y probadas para ver si esa intersección no es una de las cimas.  Si éste es el caso entonces yo intercambiar los dos puntos apropiados para hacer el polígono “simple” apropiado:
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:
Clase pública Form1

    Polígonos privados como nueva lista (de lista (de punto))
    KSpoints privado como lista (de punto) = nada

    El submarino privado PictureBox1_MouseUp (remitente de ByVal como objeto, ByVal e como System.Windows.Forms.MouseEventArgs) dirige PictureBox1.MouseUp
        Si IsNothing (KSpoints) entonces
            KSpoints = nueva lista (de punto)
            Polygons.Add (KSpoints)
        Terminar si
        KSpoints.Add (e.Location)
        Si KSpoints.Count = 4 entonces
            ptE dévil, ptF como punto
            Simples déviles como boleanos = verdad
            Si Geometry.SegmentIntersect (KSpoints (0), KSpoints (3), KSpoints (1), KSpoints (2), ptE, ptF) = Geometry.SegmentIntersection.Point entonces
                'comprobar para saber si hay intersección entre las líneas formadas por 0 a 3 y 1 a 2.
                Para cada pinta como punto en KSpoints
                    Si no pinta. Iguales (ptE) entonces
                        Simple = falso
                        Salir para
                    Terminar si
                Después
                Si no simple entonces
                    'intercambiar los dos puntos pasados
                    Amortiguar la pinta como el punto = KSpoints (3)
                    KSpoints.RemoveAt (3)
                    KSpoints.Insert (2, pinta)
                Terminar si
                KSpoints = nada
                PictureBox1.Refresh ()
                Salir el submarino
            Terminar si

            Si Geometry.SegmentIntersect (KSpoints (0), KSpoints (1), KSpoints (2), KSpoints (3), ptE, ptF) = Geometry.SegmentIntersection.Point entonces
                'comprobar para saber si hay intersección entre las líneas formadas por 0 a 1 y 2 a 3.
                Para cada pinta como punto en KSpoints
                    Si no pinta. Iguales (ptE) entonces
                        Simple = falso
                        Salir para
                    Terminar si
                Después
                Si no simple entonces
                    'intercambiar los dos puntos medios
                    Amortiguar la pinta como el punto = KSpoints (2)
                    KSpoints.RemoveAt (2)
                    KSpoints.Insert (1, pinta)
                    KSpoints = nada
                    PictureBox1.Refresh ()
                    Salir el submarino
                Terminar si
            Terminar si

            KSpoints = nada
            PictureBox1.Refresh ()
        
            PictureBox1.Refresh ()
        Terminar si
    Terminar el submarino

    El submarino privado PictureBox1_Paint (remitente de ByVal como objeto, ByVal e como System.Windows.Forms.PaintEventArgs) dirige PictureBox1.Paint
        Colores estáticos () como color = {Color.Red, Color.Green, Color.Blue, Color.Purple}
        Para cada polígono como lista (de punto) en polígonos
            Si polígono. Cuenta > 1 entonces
                Para i como número entero = 0 al polígono. Cuenta - 2
                    Usar P como nueva pluma (colores (i))
                        e.Graphics.DrawLine (P, polígono (i), polígono (i + 1))
                    Extremo usar
                Después
                Si polígono. Cuenta > 2 entonces
                    Usar P como nueva pluma (colores (polígono. Cuenta - 1))
                        e.Graphics.DrawLine (P, polígono (polígono. Cuenta - 1), polígono (0))
                    Extremo usar
                Terminar si
            Terminar si
            Para cada pinta como punto en polígono
                Rc dévil como nuevo rectángulo (pinta, nuevo tamaño (1, 1))
                rc. Inflar (3, 3)
                e.Graphics.FillRectangle (Brushes.Black, rc)
            Después
        Después
    Submarino del extremo

Clase del extremo

Geometría pública de la clase

    Enum público SegmentIntersection
        Ninguno = 0 'los segmentos es paralelo y nunca se intersecará
        Punto = 1 'que los segmentos se intersecan físicamente en un punto
        ExtrapolatedPoint = 2 'que los segmentos se intersecarían físicamente en un punto si un o ambo segmentos eran extendidos
        Traslapando = 3 'los segmentos son paralelo y traslapo en un punto o segmento
    Extremo Enum

    Función compartida público SegmentIntersect (_
        ByVal A como punto, ByVal B como punto, _
        ByVal C como punto, ByVal D como punto, _
        ByRef E como punto, ByRef F como punto) como SegmentIntersection

        'Si uno o ambos segmentos pasajeros adentro es realmente un punto entonces apenas hacer un cálculo de PointToSegmentDistance ():
        Si A.Equals (B) OrElse C.Equals (D) entonces
            Si A.Equals (B) AndAlso C.Equals (D) entonces
                Si A.Equals (C) entonces
                    E = A
                    F = A
                    Geometry.SegmentIntersection.Point de vuelta
                
                    Geometry.SegmentIntersection.None de vuelta
                Terminar si
            ElseIf A.Equals (B) entonces
                Si Geometry.PointToSegmentDistance (A.X, A.Y, C.X, C.Y, D.X, D.Y) = 0 entonces
                    E = A
                    F = A
                    Geometry.SegmentIntersection.Point de vuelta
                Terminar si
            ElseIf C.Equals (D) entonces
                Si Geometry.PointToSegmentDistance (C.X, C.Y, A.X, A.Y, B.X, B.Y) = 0 entonces
                    E = C
                    F = C
                    Geometry.SegmentIntersection.Point de vuelta
                Terminar si
            Terminar si
            Volver Geometry.SegmentIntersection.None
        Terminar si

        'Tenemos dos segmentos reales… nos dejamos hacer los cálculos para Det1 y Det2:
        Det1 dévil como doble = (A.Y - C.Y) * (D.X - C.X) - (A.X - C.X) * (D.Y - C.Y)
        Det2 dévil como doble = (B.X - A.X) * (D.Y - C.Y) - (B.Y - A.Y) * (D.X - C.X)

        Si 0 <> entonces 'segmentos no paralelos Det2 (se intersecan o se intersecarían si es extendido)
            Det3 dévil como doble = (A.Y - C.Y) * (B.X - A.X) - (A.X - C.X) * (B.Y - A.Y)
            Det4 dévil como doble = (B.X - A.X) * (D.Y - C.Y) - (B.Y - A.Y) * (D.X - C.X)

            R dévil como doble = Det1/Det2
            S dévil como doble = Det3/Det4

            'Computar el punto de intersección:
            E.X = A.X + r * (B.X - A.X)
            E.Y = A.Y + r * (B.Y - A.Y)
            F = E

            Si (>= 0 AndAlso de r r <>= 0 AndAlso s <> 0 entonces 'sin traslapo
                Geometry.SegmentIntersection.None de vuelta
            'Traslapándose (un punto o un segmento)
                'Los segmentos paralelos son iguales
                Si (A.Equals (C) AndAlso B.Equals (D)) OrElse (A.Equals (D) AndAlso B.Equals (C)) entonces
                    E = A
                    F = B
                    Geometry.SegmentIntersection.Overlapping de vuelta
                Terminar si

                'Los segmentos paralelos se traslapan en exactamente un punto
                Si B.Equals (C) OrElse B.Equals (D) entonces
                    E = B
                    F = B
                    Geometry.SegmentIntersection.Overlapping de vuelta
                Terminar si
                Si A.Equals (C) OrElse A.Equals (D) entonces
                    E = A
                    F = A
                    Geometry.SegmentIntersection.Overlapping de vuelta
                Terminar si

                'Los segmentos paralelos se están traslapando en un segmento
                Si Geometry.SegmentContainsPoint (A, B, C) AndAlso Geometry.SegmentContainsPoint (C, D, B) entonces
                    E = C
                    F = B
                    Geometry.SegmentIntersection.Overlapping de vuelta
                ElseIf Geometry.SegmentContainsPoint (A, B, D) AndAlso Geometry.SegmentContainsPoint (D, C, B) entonces
                    E = D
                    F = B
                    Geometry.SegmentIntersection.Overlapping de vuelta
                ElseIf Geometry.SegmentContainsPoint (B, A, C) AndAlso Geometry.SegmentContainsPoint (C, D, A) entonces
                    E = C
                    F = A
                    Geometry.SegmentIntersection.Overlapping de vuelta
                ElseIf Geometry.SegmentContainsPoint (B, A, D) AndAlso Geometry.SegmentContainsPoint (D, C, A) entonces
                    E = D
                    F = A
                    Geometry.SegmentIntersection.Overlapping de vuelta
                ElseIf Geometry.SegmentContainsPoint (C, D, A) AndAlso Geometry.SegmentContainsPoint (A, B, D) entonces
                    E = A
                    F = D
                    Geometry.SegmentIntersection.Overlapping de vuelta
                ElseIf Geometry.SegmentContainsPoint (C, D, B) AndAlso Geometry.SegmentContainsPoint (B, A, D) entonces
                    E = B
                    F = D
                    Geometry.SegmentIntersection.Overlapping de vuelta
                ElseIf Geometry.SegmentContainsPoint (D, C, A) AndAlso Geometry.SegmentContainsPoint (A, B, C) entonces
                    E = A
                    F = C
                    Geometry.SegmentIntersection.Overlapping de vuelta
                ElseIf Geometry.SegmentContainsPoint (D, C, B) AndAlso Geometry.SegmentContainsPoint (B, A, C) entonces
                    E = B
                    F = C
                    Geometry.SegmentIntersection.Overlapping de vuelta
                Terminar si

                'Un segmento contiene totalmente el otro
                Si Geometry.SegmentContainsPoint (A, B, C) AndAlso Geometry.SegmentContainsPoint (A, B, D) entonces
                    E = C
                    F = D
                    Geometry.SegmentIntersection.Overlapping de vuelta
                Terminar si
                Si Geometry.SegmentContainsPoint (C, D, A) AndAlso Geometry.SegmentContainsPoint (C, D, B) entonces
                    E = A
                    F = B
                    Geometry.SegmentIntersection.Overlapping de vuelta
                Terminar si

                Los 'segmentos son paralelos pero de tactos
                Geometry.SegmentIntersection.None de vuelta
            Terminar si
        Terminar si
    Terminar la función

    Función compartida público PointToPointDistance (hacha de ByVal como sola, _
        ByVal Ay como solo, ByVal Bx como solo, ByVal cerca como solo) _
        Como solo
        'PointToPointDist = SquareRoot ((Bx - hacha) ^2 + (por - Ay) ^2)
        Math.Sqrt de vuelta ((Bx - hacha) * (Bx - hacha) + (por - Ay) * (por - Ay))
    Función del final

    Función compartida público PointToSegmentDistance (_
            ByVal Px como solo, ByVal PY como solo, _
            Hacha de ByVal como sola, ByVal Ay como solo, _
            ByVal Bx como solo, ByVal cerca como solo) como solo
        Q dévil como solo

        Si (hacha = Bx) y (Ay = cerca) entonces
            'A y B pasaron adentro definen un punto, no una línea.
            'Distancia de punto a punto
            PointToPointDistance de vuelta (Px, PY, hacha, Ay)
        
            La 'distancia es la longitud de la línea necesaria para conectar el punto con
            '(segmento) el tales que las dos líneas serían perpendiculares.

            'q es el valor dado parámetros necesario para llegar a la intersección
            q = ((Px - hacha) * (Bx - hacha) + (PY - Ay) * (por - Ay)) /_
                ((Bx - hacha) * (Bx - hacha) + (por - Ay) * (por - Ay))

            'Limitar q a 0 <> 1 entonces q = 1

            'Distancia
            PointToPointDistance de vuelta (_
                Px, PY, (1 - q) * hacha + q * Bx, (1 - q) * Ay + q * cerca)
        Terminar si
    Terminar la función

    Función compartida público SegmentContainsPoint (_
        ByVal A como punto, ByVal B como punto, ByVal C como punto) como boleano
        'Dos segmentos AB y el CD se han determinado ya para tener 
        la 'misma cuesta y ésa que se traslapan.
        El 'AB es el segmento, y C es el punto en la pregunta.
        'Si el AB contiene C después verdad de vuelta, si no vuelta falsa
        Si C.Equals (A) o C.Equals (B) entonces
            De vuelta verdad
        ElseIf A.X = B.X entonces 'proyecta al Y-Axis para las líneas verticales
            minY dévil como el número entero = Math.Min (A.Y, B.Y)
            maxY dévil como el número entero = Math.Max (A.Y, B.Y)
            Si minY  <>
           
Otras soluciones  
 
programming4us programming4us