Vraag : De punten van de orde in rechthoek

Ik heb een serie die vier willekeurige punten bevatten. Ik moet tot deze in de „normale“ rechthoekopeenvolging opdracht geven. het hoogste linker, hoogste recht, bodemrecht, bodem left.

What is een goede manier om dit te doen?

Antwoord : De punten van de orde in rechthoek

Ik hoop ik enkel overthunk ernstig dit één heb en er eigenlijk een gemakkelijkere manier is.  Wat wordt ik heb gedaan de kruisingspunten tussen de lijnen gegevens verwerkt door de punten van de veelhoek worden te verbinden en worden getest gecreërd die om te zien of is die kruising Geen één van de toppen die.  Als dit het geval toen I ruilmiddel de aangewezen twee punten is om de veelhoek juist „eenvoudig“ één te maken:
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:
Openbare Klasse Form1

    Privé Veelhoeken als Nieuwe Lijst (van Lijst (van Punt))
    Privé KSpoints als Lijst (van Punt) = niets

    Privé Sub (ByVal afzender als Voorwerp, ByVal e als System.Windows.Forms.MouseEventArgs) Handvatten PictureBox1_MouseUp PictureBox1.MouseUp
        Als IsNothing (KSpoints) toen
            KSpoints = Nieuwe Lijst (van Punt)
            Polygons.Add (KSpoints)
        Eind als
        KSpoints.Add (e.Location)
        Als KSpoints.Count = 4 toen
            Schemerige ptE, ptF als Punt
            Schemerige Eenvoudig zoals Van Boole = Waar
            Als Geometry.SegmentIntersect (KSpoints (0), KSpoints (3), KSpoints (1), KSpoints (2), ptE, ptF) = Geometry.SegmentIntersection.Point toen
                'controleer kruising tussen lijnen door 0 tot 3 en 1 tot 2 worden gevormd die.
                Voor Elk PT als Punt in KSpoints
                    Als niet PT. Evenaart (ptE) Dan
                        Eenvoudig = Vals
                        Uitgang voor
                    Eind als
                Daarna
                Als niet Eenvoudig toen
                    'ruil de laatste twee punten
                    Verduister PT als Punt = KSpoints (3)
                    KSpoints.RemoveAt (3)
                    KSpoints.Insert (2, PT)
                Eind als
                KSpoints = niets
                PictureBox1.Refresh ()
                Sub van de uitgang
            Eind als

            Als Geometry.SegmentIntersect (KSpoints (0), KSpoints (1), KSpoints (2), KSpoints (3), ptE, ptF) = Geometry.SegmentIntersection.Point toen
                'controleer kruising tussen lijnen door 0 tot 1 en 2 tot 3 worden gevormd die.
                Voor Elk PT als Punt in KSpoints
                    Als niet PT. Evenaart (ptE) Dan
                        Eenvoudig = Vals
                        Uitgang voor
                    Eind als
                Daarna
                Als niet Eenvoudig toen
                    'ruil de twee middenpunten
                    Verduister PT als Punt = KSpoints (2)
                    KSpoints.RemoveAt (2)
                    KSpoints.Insert (1, PT)
                    KSpoints = niets
                    PictureBox1.Refresh ()
                    Sub van de uitgang
                Eind als
            Eind als

            KSpoints = niets
            PictureBox1.Refresh ()
        Anders
            PictureBox1.Refresh ()
        Eind als
    Sub van het eind

    Privé SubPictureBox1_Paint (ByVal afzender als Voorwerp, ByVal e als System.Windows.Forms.PaintEventArgs) behandelt PictureBox1.Paint
        Statische kleuren () als Kleur = {Color.Red, Color.Green, Color.Blue, Color.Purple}
        Voor Elke veelhoek als Lijst (van Punt) in Veelhoeken
            Als veelhoek. Telling > 1 toen
                Voor I als Geheel = 0 aan veelhoek. Telling - 2
                    Gebruikend P als Nieuwe Pen (kleuren (I))
                        e.Graphics.DrawLine (P, veelhoek (I), veelhoek (I + 1))
                    Het Gebruiken van het eind
                Daarna
                Als veelhoek. Telling > 2 toen
                    Het gebruiken van P als Nieuwe Pen (kleuren (veelhoek. Telling - 1))
                        e.Graphics.DrawLine (P, veelhoek (veelhoek. Telling - 1), veelhoek (0))
                    Het Gebruiken van het eind
                Eind als
            Eind als
            Voor Elk PT als Punt in veelhoek
                Schemerige rc als Nieuwe Rechthoek (PT, Nieuwe Grootte (1, 1))
                rc. Blaas op (3, 3)
                e.Graphics.FillRectangle (Brushes.Black, rc)
            Daarna
        Daarna
    Sub van het eind

De Klasse van het eind

De openbare Meetkunde van de Klasse

    Openbare Enum SegmentIntersection
        Niets = 0 de 'Segmenten is parallel en zal nooit snijden
        Het punt = 1 de 'Segmenten snijdt fysisch in één punt
        ExtrapolatedPoint zou = 2 de 'Segmenten fysisch in één punt snijden als één of beide segmenten werden uitgebreid
        Overlappen = 3 de 'Segmenten is parallel en overlapt in een punt of een segment
    Eind Enum

    Gedeelde Overheidsfunctie SegmentIntersect (_
        ByVal A als Punt, ByVal B als Punt, _
        ByVal C als Punt, ByVal D als Punt, _
        ByRef E als Punt, ByRef F als Punt) als SegmentIntersection

        'Als één of allebei binnen overgegaane segmenten werkelijk toen enkel een punt is doe een () berekening PointToSegmentDistance:
        Als A.Equals (B) OrElse C.Equals (D) toen
            Als A.Equals (B) AndAlso C.Equals (D) toen
                Als A.Equals (C) toen
                    E = A
                    F = A
                    Terugkeer Geometry.SegmentIntersection.Point
                Anders
                    Terugkeer Geometry.SegmentIntersection.None
                Eind als
            ElseIf A.Equals (B) toen
                Als Geometry.PointToSegmentDistance (A.X, A.Y, C.X, C.Y, D.X, D.Y) = 0 toen
                    E = A
                    F = A
                    Terugkeer Geometry.SegmentIntersection.Point
                Eind als
            ElseIf C.Equals (D) toen
                Als Geometry.PointToSegmentDistance (C.X, C.Y, A.X, A.Y, B.X, B.Y) = 0 toen
                    E = C
                    F = C
                    Terugkeer Geometry.SegmentIntersection.Point
                Eind als
            Eind als
            Terugkeer Geometry.SegmentIntersection.None
        Eind als

        'Wij hebben twee daadwerkelijke segmenten… ons laten de berekeningen voor Det1 en Det2 doen:
        Schemerige Det1 als Dubbel = (A.Y - C.Y) * (D.X - C.X) - (A.X - C.X) * (D.Y - C.Y)
        Schemerige Det2 als Dubbel = (B.X - A.X) * (D.Y - C.Y) - (B.Y - A.Y) * (D.X - C.X)

        Als Det2 <> 0 toen 'Niet-parallelle Segmenten (zij snijden of zouden indien uitgebreid snijden)
            Schemerige Det3 als Dubbel = (A.Y - C.Y) * (B.X - A.X) - (A.X - C.X) * (B.Y - A.Y)
            Schemerige Det4 als Dubbel = (B.X - A.X) * (D.Y - C.Y) - (B.Y - A.Y) * (D.X - C.X)

            Schemerig r als Dubbel = Det1/Det2
            Schemerig s als Dubbel = Det3/Det4

            'Verwerk het kruisingspunt gegevens:
            E.X = A.X + R * (B.X - A.X)
            E.Y = A.Y + R * (B.Y - A.Y)
            F = E

            Als (r >= 0 AndAlso r <>= dan niet-Overlapt 0 <> AndAlso s 0 '
                Terugkeer Geometry.SegmentIntersection.None
            'Anders Overlappend (één punt of een segment)
                De 'parallelle segmenten zijn het zelfde
                Als (A.Equals (C) AndAlso B.Equals (D)) OrElse (A.Equals (D) AndAlso B.Equals (C)) Dan
                    E = A
                    F = B
                    Terugkeer Geometry.SegmentIntersection.Overlapping
                Eind als

                De 'parallelle segmentenoverlapping in precies één punt
                Als B.Equals (C) OrElse B.Equals (D) toen
                    E = B
                    F = B
                    Terugkeer Geometry.SegmentIntersection.Overlapping
                Eind als
                Als A.Equals (C) OrElse A.Equals (D) toen
                    E = A
                    F = A
                    Terugkeer Geometry.SegmentIntersection.Overlapping
                Eind als

                De 'parallelle segmenten overlappen in een segment
                Als Geometry.SegmentContainsPoint (A, B, C) AndAlso Geometry.SegmentContainsPoint (C, D, B) toen
                    E = C
                    F = B
                    Terugkeer Geometry.SegmentIntersection.Overlapping
                ElseIf Geometry.SegmentContainsPoint (A, B, D) AndAlso Geometry.SegmentContainsPoint (D, C, B) toen
                    E = D
                    F = B
                    Terugkeer Geometry.SegmentIntersection.Overlapping
                ElseIf Geometry.SegmentContainsPoint (B, A, C) AndAlso Geometry.SegmentContainsPoint (C, D, A) toen
                    E = C
                    F = A
                    Terugkeer Geometry.SegmentIntersection.Overlapping
                ElseIf Geometry.SegmentContainsPoint (B, A, D) AndAlso Geometry.SegmentContainsPoint (D, C, A) toen
                    E = D
                    F = A
                    Terugkeer Geometry.SegmentIntersection.Overlapping
                ElseIf Geometry.SegmentContainsPoint (C, D, A) AndAlso Geometry.SegmentContainsPoint (A, B, D) toen
                    E = A
                    F = D
                    Terugkeer Geometry.SegmentIntersection.Overlapping
                ElseIf Geometry.SegmentContainsPoint (C, D, B) AndAlso Geometry.SegmentContainsPoint (B, A, D) toen
                    E = B
                    F = D
                    Terugkeer Geometry.SegmentIntersection.Overlapping
                ElseIf Geometry.SegmentContainsPoint (D, C, A) AndAlso Geometry.SegmentContainsPoint (A, B, C) toen
                    E = A
                    F = C
                    Terugkeer Geometry.SegmentIntersection.Overlapping
                ElseIf Geometry.SegmentContainsPoint (D, C, B) AndAlso Geometry.SegmentContainsPoint (B, A, C) toen
                    E = B
                    F = C
                    Terugkeer Geometry.SegmentIntersection.Overlapping
                Eind als

                'Één segment bevat volledig andere
                Als Geometry.SegmentContainsPoint (A, B, C) AndAlso Geometry.SegmentContainsPoint (A, B, D) toen
                    E = C
                    F = D
                    Terugkeer Geometry.SegmentIntersection.Overlapping
                Eind als
                Als Geometry.SegmentContainsPoint (C, D, A) AndAlso Geometry.SegmentContainsPoint (C, D, B) toen
                    E = A
                    F = B
                    Terugkeer Geometry.SegmentIntersection.Overlapping
                Eind als

                De 'segmenten zijn parallel maar niet wat betreft
                Terugkeer Geometry.SegmentIntersection.None
            Eind als
        Eind als
    De Functie van het eind

    Gedeelde Overheidsfunctie PointToPointDistance (Bijl ByVal zoals Enig, _
        ByVal Ay zoals Enig, ByVal Bx zoals Enig, ByVal langs zoals Enig) _
        Zoals Enig
        'PointToPointDist = SquareRoot ((Bx - Bijl) ^2 + (door - Ay) ^2)
        Terugkeer Math.Sqrt ((Bx - Bijl) * (Bx - Bijl) + (door - Ay) * (door - Ay))
    De Functie van het eind

    Gedeelde Overheidsfunctie PointToSegmentDistance (_
            ByVal Px zoals Enig, ByVal Py zoals Enig, _
            De Bijl van ByVal zoals Enig, ByVal Ay zoals Enig, _
            ByVal Bx zoals Enig, ByVal langs zoals Enig) zoals Enig
        Schemerig q zoals Enig

        Als (Bijl = Bx) en (Ay = langs) toen
            'Binnen overgegaane A en B bepalen een punt, niet een lijn.
            'Punt om Afstand te richten
            Terugkeer PointToPointDistance (Px, Py, Bijl, Ay)
        Anders
            De 'afstand is de lengte van de lijn nodig om te verbinden het punt met
            '(segment) dusdanig dat de twee lijnen loodrecht zouden zijn.

            'q is de de parameters bepaalde van waarde nodig om aan de kruising te krijgen
            q = ((Px - Bijl) * (Bx - Bijl) + (Py - Ay) * (door - Ay)) /_
                ((Bx - Bijl) * (Bx - Bijl) + (door - Ay) * (door - Ay))

            'Grens q aan 0 <> 1 toen q = 1

            'Afstand
            Terugkeer PointToPointDistance (_
                Px, Py, (1 - q) * Bijl + q * Bx, (1 - q) * Ay + q * langs)
        Eind als
    De Functie van het eind

    Gedeelde Overheidsfunctie SegmentContainsPoint (_
        ByVal A als Punt, ByVal B als Punt, ByVal C als Punt) zoals Van Boole
        'Twee Segmenten van ab zijn en CD reeds bepaald om te hebben 
        'zelfde helling en dat zij overlappen.
        'Ab is het segment, en C is het punt in kwestie.
        'Als ab waar C dan terugkeer bevat, keer anders vals terug
        Als C.Equals (A) of C.Equals (B) toen
            Ware terugkeer
        ElseIf A.X = B.X toen 'Project aan de y-As voor verticale lijnen
            Schemerige minY als Geheel = Math.Min (A.Y, B.Y)
            Schemerige maxY als Geheel = Math.Max (A.Y, B.Y)
            Als minY  <>
           
Andere oplossingen  
 
programming4us programming4us