Questione : Punti di ordine nel rettangolo

Ho un allineamento contenere quattro punti arbitrari. Devo ordinare questi nella sequenza “normale„ di rettangolo. la destra di sinistra e superiore superiore, destra inferiore, left.

What è un buon senso fare questo?
class= del

Risposta : Punti di ordine nel rettangolo

Spero che abbia seriamente appena overthunk questo e ci è realmente un senso più facile.  Che cosa ho fatto è computato i punti di intersezione fra le linee generate collegando i punti del poligono e provate per vedere se quell'intersezione non è uno dei vertici.  Se questo è il caso allora io scambiare i due punti adatti per rendere al poligono adeguato “semplice„:
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  <>
           
Altre soluzioni  
 
programming4us programming4us