Fråga : Beställa pekar i rektangel

Jag har en samling att innehålla godtyckliga fyra pekar. Jag behöver att beställa dessa i ”den det normala” rektangeln ordnar. den bästa lämnade bästa rätten, nedersta rätt, nedersta left.

What är en goda långt som gör detta?
" klar "

Svar : Beställa pekar i rektangel

Jag hoppas mig har precis allvarligt overthunk denna, och det finns faktiskt ett lättare långt.  Vad jag har gjort, beräknas genomskärningen pekar mellan fodrar skapat, genom att förbinda, pekar av polygonen och testat för att se, om den genomskärning INTE är en av hjässorna.  Om så är fallet därefter jag byter anslå två pekar för att göra polygonen riktig ”enkel”:
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:
Allmänhet klassificerar Form1

    Privata polygoner som nya listar (av lista (av peka)),
    Privata KSpoints som listar (av peka), = ingenting

    Den privata suben PictureBox1_MouseUp (den ByVal avsändaren som anmärker, ByVal e som System.Windows.Forms.MouseEventArgs) behandlar PictureBox1.MouseUp
        Om IsNothing (KSpoints) därefter
            KSpoints = nytt listar (av peka),
            Polygons.Add (KSpoints)
        Avsluta om
        KSpoints.Add (e.Location)
        Om KSpoints.Count = 4 därefter
            Dunkel ptE, ptF som pekar
            Dunkla enkla som Boolean = True
            Om Geometry.SegmentIntersect (KSpoints (0), KSpoints (3), KSpoints (1), KSpoints (2), ptE, ptF) = Geometry.SegmentIntersection.Point därefter
                'kontrollen för genomskärning between fodrar bildat av 0 till 3 och 1 till 2.
                För varje liter som pekar i KSpoints
                    Om inte liter. Jämliken (ptE) därefter
                        Enkelt = falskt
                        Gå ut för
                    Avsluta om
                Därefter
                Om inte enkelt därefter
                    'byt de sist tvåna pekar
                    Dunkel liter som pekar = KSpoints (3)
                    KSpoints.RemoveAt (3)
                    KSpoints.Insert (2, liter)
                Avsluta om
                KSpoints = ingenting
                PictureBox1.Refresh ()
                Gå ut suben
            Avsluta om

            Om Geometry.SegmentIntersect (KSpoints (0), KSpoints (1), KSpoints (2), KSpoints (3), ptE, ptF) = Geometry.SegmentIntersection.Point därefter
                'kontrollen för genomskärning between fodrar bildat av 0 till 1 och 2 till 3.
                För varje liter som pekar i KSpoints
                    Om inte liter. Jämliken (ptE) därefter
                        Enkelt = falskt
                        Gå ut för
                    Avsluta om
                Därefter
                Om inte enkelt därefter
                    'byt tvåna som en mitt pekar
                    Dunkel liter som pekar = KSpoints (2)
                    KSpoints.RemoveAt (2)
                    KSpoints.Insert (1, liter)
                    KSpoints = ingenting
                    PictureBox1.Refresh ()
                    Gå ut suben
                Avsluta om
            Avsluta om

            KSpoints = ingenting
            PictureBox1.Refresh ()
        Annars
            PictureBox1.Refresh ()
        Avsluta om
    Avsluta suben

    Den privata suben PictureBox1_Paint (den ByVal avsändaren som anmärker, ByVal e som System.Windows.Forms.PaintEventArgs) behandlar PictureBox1.Paint
        Statisk elektricitet färgar () som färgar = {Color.Red, Color.Green, Color.Blue, Color.Purple}
        För varje polygon som listar (av peka), i polygoner
            Om polygon. Räkning > 1 därefter
                För I som heltal = 0 till polygonen. Räkning - 2
                    Using P som nytt skriva (färgar (I))
                        e.Graphics.DrawLine (P, polygon (I), polygon (I + 1))
                    Avsluta Using
                Därefter
                Om polygon. Räkning > 2 därefter
                    Using P som nytt skriva (färgar (polygonen. Räkning - 1))
                        e.Graphics.DrawLine (P, polygon (polygonen. Räkning - 1), polygon (0))
                    Avsluta Using
                Avsluta om
            Avsluta om
            För varje liter som pekar i polygon
                Dunkel rc som ny rektangel (liter som är ny storleksanpassar (1, 1))
                rc. Inflate (3, 3)
                e.Graphics.FillRectangle (Brushes.Black, rc)
            Därefter
        Därefter
    Avsluta suben

Avsluta klassificerar

Allmänhet klassificerar geometri

    Offentliga Enum SegmentIntersection
        Inget = 0 'segmenterar är parallellen och ska skär aldrig
        Peka = 1 'segmenterar skär fysiskt i en pekar
        ExtrapolatedPoint = 2 'segmenterar skulle fysiskt skär i en pekar, om man eller båda segmenterar var fördjupade
        Överlappa = 3 'segmenterar är parallellen och överlappningen i en peka eller segmenterar
    Avsluta Enum

    Delad allmänhet fungerar SegmentIntersect (_,
        ByVal A som pekar, ByVal B som pekar, _,
        ByVal C som pekar, ByVal D som pekar, _,
        ByRef E som pekar, ByRef F som pekar) som SegmentIntersection

        'Om en eller båda av segmenterar passerat in är faktiskt en peka därefter gör precis en PointToSegmentDistance () beräkning:
        Om A.Equals (B) OrElse C.Equals (D) därefter
            Om A.Equals (B) AndAlso C.Equals (D) därefter
                Om A.Equals (C) därefter
                    E = A
                    F = A
                    Återgång Geometry.SegmentIntersection.Point
                Annars
                    Återgång Geometry.SegmentIntersection.None
                Avsluta om
            ElseIf A.Equals (B) därefter
                Om Geometry.PointToSegmentDistance (A.X, A.Y, C.X, C.Y, D.X, D.Y) = 0 därefter
                    E = A
                    F = A
                    Återgång Geometry.SegmentIntersection.Point
                Avsluta om
            ElseIf C.Equals (D) därefter
                Om Geometry.PointToSegmentDistance (C.X, C.Y, A.X, A.Y, B.X, B.Y) = 0 därefter
                    E = C
                    F = C
                    Återgång Geometry.SegmentIntersection.Point
                Avsluta om
            Avsluta om
            Gå Geometry.SegmentIntersection.None tillbaka
        Avsluta om

        'Vi har faktiska två segmenterar… l5At oss göra beräkningarna för Det1 och Det2:
        Dunkel Det1 som dubbelt = (A.Y - C.Y) * (D.X - C.X) - (A.X - C.X) * (D.Y - C.Y)
        Dunkel Det2 som dubbelt = (B.X - A.X) * (D.Y - C.Y) - (B.Y - A.Y) * (D.X - C.X)

        Om ickeparallell <> Det2 0 'segmenterar därefter (de skär eller skulle skär, om fördjupat)
            Dunkel Det3 som dubbelt = (A.Y - C.Y) * (B.X - A.X) - (A.X - C.X) * (B.Y - A.Y)
            Dunkel Det4 som dubbelt = (B.X - A.X) * (D.Y - C.Y) - (B.Y - A.Y) * (D.X - C.X)

            Dunkelt r som dubbelt = Det1/Det2
            Dunkelt s som dubbelt = Det3/Det4

            'Beräkna genomskärningen pekar:
            E.X = A.X + r * (B.X - A.X)
            E.Y = A.Y + r * (B.Y - A.Y)
            F = E

            Om (r->= 0 AndAlso r <>= 0 Non-Overlapping AndAlso <> s 0 därefter '
                Återgång Geometry.SegmentIntersection.None
            Annars 'överlappa (man pekar eller en segmentera),
                'Parallellen segmenterar är samma
                Om (A.Equals (C) AndAlso B.Equals (D)) OrElse (A.Equals (D) AndAlso B.Equals (C)) Därefter
                    E = A
                    F = B
                    Återgång Geometry.SegmentIntersection.Overlapping
                Avsluta om

                'Parallellen segmenterar överlappning i exakt en pekar
                Om B.Equals (C) OrElse B.Equals (D) därefter
                    E = B
                    F = B
                    Återgång Geometry.SegmentIntersection.Overlapping
                Avsluta om
                Om A.Equals (C) OrElse A.Equals (D) därefter
                    E = A
                    F = A
                    Återgång Geometry.SegmentIntersection.Overlapping
                Avsluta om

                'Parallellen segmenterar överlappar i en segmentera
                Om Geometry.SegmentContainsPoint (A, B, C) AndAlso Geometry.SegmentContainsPoint (C, D, B) därefter
                    E = C
                    F = B
                    Återgång Geometry.SegmentIntersection.Overlapping
                ElseIf Geometry.SegmentContainsPoint (A, B, D) AndAlso Geometry.SegmentContainsPoint (D, C, B) därefter
                    E = D
                    F = B
                    Återgång Geometry.SegmentIntersection.Overlapping
                ElseIf Geometry.SegmentContainsPoint (B, A, C) AndAlso Geometry.SegmentContainsPoint (C, D, A) därefter
                    E = C
                    F = A
                    Återgång Geometry.SegmentIntersection.Overlapping
                ElseIf Geometry.SegmentContainsPoint (B, A, D) AndAlso Geometry.SegmentContainsPoint (D, C, A) därefter
                    E = D
                    F = A
                    Återgång Geometry.SegmentIntersection.Overlapping
                ElseIf Geometry.SegmentContainsPoint (C, D, A) AndAlso Geometry.SegmentContainsPoint (A, B, D) därefter
                    E = A
                    F = D
                    Återgång Geometry.SegmentIntersection.Overlapping
                ElseIf Geometry.SegmentContainsPoint (C, D, B) AndAlso Geometry.SegmentContainsPoint (B, A, D) därefter
                    E = B
                    F = D
                    Återgång Geometry.SegmentIntersection.Overlapping
                ElseIf Geometry.SegmentContainsPoint (D, C, A) AndAlso Geometry.SegmentContainsPoint (A, B, C) därefter
                    E = A
                    F = C
                    Återgång Geometry.SegmentIntersection.Overlapping
                ElseIf Geometry.SegmentContainsPoint (D, C, B) AndAlso Geometry.SegmentContainsPoint (B, A, C) därefter
                    E = B
                    F = C
                    Återgång Geometry.SegmentIntersection.Overlapping
                Avsluta om

                'Man segmenterar innehåller fullständigt annan
                Om Geometry.SegmentContainsPoint (A, B, C) AndAlso Geometry.SegmentContainsPoint (A, B, D) därefter
                    E = C
                    F = D
                    Återgång Geometry.SegmentIntersection.Overlapping
                Avsluta om
                Om Geometry.SegmentContainsPoint (C, D, A) AndAlso Geometry.SegmentContainsPoint (C, D, B) därefter
                    E = A
                    F = B
                    Återgång Geometry.SegmentIntersection.Overlapping
                Avsluta om

                'Segmenterar är parallellt men inte röra
                Återgång Geometry.SegmentIntersection.None
            Avsluta om
        Avsluta om
    Avsluta fungerar

    Delad allmänhet fungerar PointToPointDistance (den ByVal axen som singeln, _,
        ByVal Ay som singel, ByVal Bx som singel, ByVal By som _ för singel),
        Som singel
        'PointToPointDist = SquareRoot ((Bx - Ax) ^2 + (vid - Ay) ^2)
        Återgång Math.Sqrt ((Bx - Ax) * (Bx - Ax) + (vid - Ay) * (vid - Ay))
    Avsluta fungerar

    Delad allmänhet fungerar PointToSegmentDistance (_,
            ByVal Px som singeln, ByVal Py som singeln, _,
            ByVal Ax som singeln, ByVal Ay som singeln, _,
            ByVal Bx som singel, ByVal By som singel) som singel
        Dunkelt q som singel

        Om (Ax = Bx) och (Ay = By) därefter
            'A och B passerade definierar in en peka, inte en fodra.
            'Peka för att peka distanserar
            Gå PointToPointDistance (Px, Py, axen, Ay) tillbaka
        Annars
            'Distansera är längden av fodra som behövs för att förbinda peka till
            '(segmentera), det sådan, att tvåna fodrar, skulle är vinkelrätt.

            'q är parameterized värderar nödvändigt för att få till genomskärningen
            q = ((Px - Ax) * (Bx - Ax) + (Py - Ay) * (vid - Ay)) /_,
                ((Bx - Ax) * (Bx - Ax) + (vid - Ay) * (vid - Ay))

            'Begränsa q till 0 <> 1 därefter q = 1

            'Distansera
            Gå PointToPointDistance (_ tillbaka,
                Px Py, (1 - q) * Ax + q * Bx, (1 - q) * Ay + q * By)
        Avsluta om
    Avsluta fungerar

    Delad allmänhet fungerar SegmentContainsPoint (_,
        ByVal A som pekar, ByVal B som pekar, ByVal C som pekar) som Boolean
        'Två segmenterar AB, och CD har redan varit beslutsam att ha 
        'samma sluttar, och det som de överlappar.
        'AB är segmentera, och C är peka ifrågasätter in.
        'Om AB innehåller C då återgångt riktigt, annorlunda falsk retur
        Om C.Equals (A) eller C.Equals (B) därefter
            Återgångt True
        ElseIf A.X = B.X 'projekterar därefter till yen-Axis för lodlinje fodrar
            Dunkel minY som heltalet = Math.Min (A.Y, B.Y)
            Dunkel maxY som heltalet = Math.Max (A.Y, B.Y)
            Om minY  <>
           
Andra lösningar  
 
programming4us programming4us