Pytanie : Rozkaz punkt w prostokąt

I mieć szyk cztery arbitralny punkt. I potrzebować sekwencja w the "normalny" prostokąt sekwencja. odgórny lewy, odgórny dobro, dolny dobro, dolny left.

What być dobry sposób to?

Odpowiedź : Rozkaz punkt w prostokąt

I mieć nadzieję I mieć właśnie poważnie overthunk ten jeden i tam  być właściwie łatwy sposób.  Werteks I robić obliczać the skrzyżowanie punkt między the linia tworzyć the punkt the wielobok i badać jeżeli ten skrzyżowanie być Jeden the werteks.  Jeżeli wielobok być the skrzynka wtedy I zamieniać the odpowiedni dwa punkt the wielobok właściwy "prosty" jeden:
(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:
Społeczeństwo Klasowy Form1

    Intymny Wielobok Nowy Lista (Lista (Punkt))
    Intymny KSpoints Lista (Punkt) = Nic

    Intymny Okręt podwodny PictureBox1_MouseUp (ByVal nadawca Jako Przedmiot, ByVal e Jako System.Windows.Forms.MouseEventArgs) Obchodzić się PictureBox1.MouseUp
        Jeżeli IsNothing (KSpoints) Wtedy
            KSpoints = Nowy Lista (Punkt)
            Polygons.Add (KSpoints)
        Kończyć Jeżeli
        KSpoints.Add (e.Location)
        Jeżeli KSpoints.Count = 4 Wtedy
            Ciemnawy ptE, ptF Punkt
            Ciemnawy Prosty Boolowski = Prawdziwy
            Jeżeli Geometry.SegmentIntersect (KSpoints ((0)), KSpoints (3), KSpoints (1), KSpoints (2), ptE, ptF) = Geometry.SegmentIntersection.Point Wtedy
                'sprawdzać dla skrzyżowanie między linia tworzyć (0) 3 i (1) 2.
                Dla KSpoints pt Punkt W KSpoints
                    Jeśli nie pt. Równy (ptE) Wtedy
                        Prosty = Fałszywy
                        Wyjście Dla
                    Kończyć Jeżeli
                Następnie
                Jeśli nie Prosty Wtedy
                    'zamieniać the ostatni dwa punkt
                    Ćmić pt Jako Punkt = KSpoints (3)
                    KSpoints.RemoveAt (3)
                    KSpoints.Insert (2, pt)
                Kończyć Jeżeli
                KSpoints = Nic
                PictureBox1.Refresh ()
                Wyjście Okręt podwodny
            Kończyć Jeżeli

            Jeżeli Geometry.SegmentIntersect (KSpoints ((0)), KSpoints (1), KSpoints (2), KSpoints (3), ptE, ptF) = Geometry.SegmentIntersection.Point Wtedy
                'sprawdzać dla skrzyżowanie między linia tworzyć (0) (1) i 2 3.
                Dla KSpoints pt Punkt W KSpoints
                    Jeśli nie pt. Równy (ptE) Wtedy
                        Prosty = Fałszywy
                        Wyjście Dla
                    Kończyć Jeżeli
                Następnie
                Jeśli nie Prosty Wtedy
                    'zamieniać the dwa środkowy punkt
                    Ćmić pt Jako Punkt = KSpoints (2)
                    KSpoints.RemoveAt (2)
                    KSpoints.Insert ((1), pt)
                    KSpoints = Nic
                    PictureBox1.Refresh ()
                    Wyjście Okręt podwodny
                Kończyć Jeżeli
            Kończyć Jeżeli

            KSpoints = Nic
            PictureBox1.Refresh ()
        Inny
            PictureBox1.Refresh ()
        Kończyć Jeżeli
    Kończyć Okręt podwodny

    Intymny Okręt podwodny PictureBox1_Paint (ByVal nadawca Jako Przedmiot, ByVal e Jako System.Windows.Forms.PaintEventArgs) Obchodzić się PictureBox1.Paint
        Statyczny kolor () Jako Kolor = {Color.Red, Color.Green, Color.Blue, Color.Purple}
        Dla Wielobok wielobok Lista (Punkt) W Wielobok
            Jeżeli wielobok. Obliczenie > (1) Wtedy
                Dla i Jako Integer = (0) Wielobok. Obliczenie - 2
                    Using P Jako Nowy Pióro (kolor (i))
                        e.Graphics.DrawLine (P, wielobok (i), wielobok (i + 1))
                    Końcówka Using
                Następnie
                Jeżeli wielobok. Obliczenie > 2 Wtedy
                    Using P Jako Nowy Pióro (kolor (wielobok. Obliczenie - 1))
                        e.Graphics.DrawLine (P, wielobok (wielobok. Obliczenie - 1), wielobok ((0)))
                    Końcówka Using
                Kończyć Jeżeli
            Kończyć Jeżeli
            Dla Wielobok pt Punkt W wielobok
                Ciemnawy rc Jako Nowy Prostokąt (pt, Nowy Rozmiar ((1), 1))
                rc. Nadymać (3, 3)
                e.Graphics.FillRectangle (Brushes.Black, rc)
            Następnie
        Następnie
    Końcówka Okręt podwodny

Końcówka Klasa

Społeczeństwo Klasowy Geometria

    Jawny Enum SegmentIntersection
        Nikt = (0) 'The segment być paralela i nigdy przecinać
        Punkt = (1) 'The segment fizycznie przecinać w jeden punkt
        ExtrapolatedPoint = 2 'The segment fizycznie przecinać w jeden punkt jeżeli jeden lub oba segment być rozszerzony
        Pokrywać się = 3 'The segment być paralela i nasunięcie w punkt lub segment
    Końcówka Enum

    Społeczeństwo Podzielony Funkcja SegmentIntersect (_
        ByVal A Punkt, ByVal B Jako Punkt, _
        ByVal C Punkt, ByVal D Jako Punkt, _
        ByRef E Jako Punkt, ByRef F Jako Punkt) Jako SegmentIntersection

        'Jeżeli jeden lub jeden the segment przechodzić wewnątrz być właściwie punkt wtedy właśnie robić PointToSegmentDistance () obliczenie:
        Jeżeli A.Equals (B) OrElse C.Equals (D) Wtedy
            Jeżeli A.Equals (B) AndAlso C.Equals (D) Wtedy
                Jeżeli A.Equals (C) Wtedy
                    E = A
                    F = A
                    Powrotny Geometry.SegmentIntersection.Point
                Inny
                    Powrotny Geometry.SegmentIntersection.None
                Kończyć Jeżeli
            ElseIf A.Equals (B) Wtedy
                Jeżeli Geometry.PointToSegmentDistance (A.X, A.Y, C.X, C.Y, D.X, D.Y) = (0) Wtedy
                    E = A
                    F = A
                    Powrotny Geometry.SegmentIntersection.Point
                Kończyć Jeżeli
            ElseIf C.Equals (D) Wtedy
                Jeżeli Geometry.PointToSegmentDistance (C.X, C.Y, A.X, A.Y, B.X, B.Y) = (0) Wtedy
                    E = C
                    F = C
                    Powrotny Geometry.SegmentIntersection.Point
                Kończyć Jeżeli
            Kończyć Jeżeli
            Wracać Geometry.SegmentIntersection.None
        Kończyć Jeżeli

        'My mieć dwa faktyczny segment… pozwalać the obliczenie dla Det1 i Det2:
        Ciemnawy Det1 Jako Kopia = (A.Y - C.Y) * (D.X - C.X) - (A.X - C.X) * (D.Y - C.Y)
        Ciemnawy Det2 Jako Kopia = (B.X - A.X) * (D.Y - C.Y) - (B.Y - A.Y) * (D.X - C.X)

        Jeżeli Det2 <> (0) Wtedy 'Wtedy Segment (przecinać lub przecinać jeżeli rozszerzony)
            Ciemnawy Det3 Jako Kopia = (A.Y - C.Y) * (B.X - A.X) - (A.X - C.X) * (B.Y - A.Y)
            Ciemnawy Det4 Jako Kopia = (B.X - A.X) * (D.Y - C.Y) - (B.Y - A.Y) * (D.X - C.X)

            Ciemnawy r Jako Kopia = Det1/Det2
            Ciemnawy s Jako Kopia = Det3/Det4

            'Obliczać the skrzyżowanie punkt:
            E.X = A.X + r * (B.X - A.X)
            E.Y = A.Y + r * (B.Y - A.Y)
            F = E

            Jeżeli (r >= (0) AndAlso r <>= (0) AndAlso s <> (0) Wtedy 'Wtedy
                Powrotny Geometry.SegmentIntersection.None
            Inny '(Jeden punkt lub segment)
                'The równoległy segment być the segment
                Jeżeli (A.Equals (C) AndAlso B.Equals (D)) OrElse (A.Equals (D) AndAlso B.Equals (C)) Wtedy
                    E = A
                    F = B
                    Powrotny Geometry.SegmentIntersection.Overlapping
                Kończyć Jeżeli

                'The paralela segment pokrywać się w dokładnie jeden punkt
                Jeżeli B.Equals (C) OrElse B.Equals (D) Wtedy
                    E = B
                    F = B
                    Powrotny Geometry.SegmentIntersection.Overlapping
                Kończyć Jeżeli
                Jeżeli A.Equals (C) OrElse A.Equals (D) Wtedy
                    E = A
                    F = A
                    Powrotny Geometry.SegmentIntersection.Overlapping
                Kończyć Jeżeli

                'The paralela segment pokrywać się w segment
                Jeżeli Geometry.SegmentContainsPoint (A, B, C) AndAlso Geometry.SegmentContainsPoint (C, D, B) Wtedy
                    E = C
                    F = B
                    Powrotny Geometry.SegmentIntersection.Overlapping
                ElseIf Geometry.SegmentContainsPoint (A, B, D) AndAlso Geometry.SegmentContainsPoint (D, C, B) Wtedy
                    E = D
                    F = B
                    Powrotny Geometry.SegmentIntersection.Overlapping
                ElseIf Geometry.SegmentContainsPoint (B, A, C) AndAlso Geometry.SegmentContainsPoint (C, D, A) Wtedy
                    E = C
                    F = A
                    Powrotny Geometry.SegmentIntersection.Overlapping
                ElseIf Geometry.SegmentContainsPoint (B, A, D) AndAlso Geometry.SegmentContainsPoint (D, C, A) Wtedy
                    E = D
                    F = A
                    Powrotny Geometry.SegmentIntersection.Overlapping
                ElseIf Geometry.SegmentContainsPoint (C, D, A) AndAlso Geometry.SegmentContainsPoint (A, B, D) Wtedy
                    E = A
                    F = D
                    Powrotny Geometry.SegmentIntersection.Overlapping
                ElseIf Geometry.SegmentContainsPoint (C, D, B) AndAlso Geometry.SegmentContainsPoint (B, A, D) Wtedy
                    E = B
                    F = D
                    Powrotny Geometry.SegmentIntersection.Overlapping
                ElseIf Geometry.SegmentContainsPoint (D, C, A) AndAlso Geometry.SegmentContainsPoint (A, B, C) Wtedy
                    E = A
                    F = C
                    Powrotny Geometry.SegmentIntersection.Overlapping
                ElseIf Geometry.SegmentContainsPoint (D, C, B) AndAlso Geometry.SegmentContainsPoint (B, A, C) Wtedy
                    E = B
                    F = C
                    Powrotny Geometry.SegmentIntersection.Overlapping
                Kończyć Jeżeli

                'Jeden segment całkowicie zawierać the segment
                Jeżeli Geometry.SegmentContainsPoint (A, B, C) AndAlso Geometry.SegmentContainsPoint (A, B, D) Wtedy
                    E = C
                    F = D
                    Powrotny Geometry.SegmentIntersection.Overlapping
                Kończyć Jeżeli
                Jeżeli Geometry.SegmentContainsPoint (C, D, A) AndAlso Geometry.SegmentContainsPoint (C, D, B) Wtedy
                    E = A
                    F = B
                    Powrotny Geometry.SegmentIntersection.Overlapping
                Kończyć Jeżeli

                'Segment być równoległy ale dotykać
                Powrotny Geometry.SegmentIntersection.None
            Kończyć Jeżeli
        Kończyć Jeżeli
    Kończyć Funkcja

    Społeczeństwo Podzielony Funkcja PointToPointDistance (ByVal Ax Pojedynczy, _
        ByVal Ay Pojedynczy, ByVal Bx Pojedynczy, ByVal Obok Pojedynczy) _
        Pojedynczy
        'PointToPointDist = SquareRoot ((Bx - Ax) ^2 + (- Ay) ^2)
        Powrotny Math.Sqrt ((Bx - Ax) * (Bx - Ax) + (- Ay) * (- Ay))
    Końcówka Funkcja

    Społeczeństwo Podzielony Funkcja PointToSegmentDistance (_
            ByVal Px Pojedynczy, ByVal Py Pojedynczy, _
            ByVal Ax Pojedynczy, ByVal Ay Pojedynczy, _
            ByVal Bx Pojedynczy, ByVal Obok Pojedynczy) Pojedynczy
        Ciemnawy q Pojedynczy

        Jeżeli (Ax = Bx) I (Ay = Obok) Wtedy
            'A i B przechodzić wewnątrz definiować punkt, nie linia.
            'Punkt Punkt Odległość
            Powrotny PointToPointDistance (Px, Py, Ax, Ay)
        Inny
            'Odległość być the długość the linia potrzebować the punkt
            'the (segment) linia że the dwa linia być pionowy.

            'q być the skrzyżowanie wartość potrzebować the skrzyżowanie
            q = ((Px - Ax) * (Bx - Ax) + (Py - Ay) * (- Ay)) /_
                ((Bx - Ax) * (Bx - Ax) + (- Ay) * (- Ay))

            'Ograniczać q (0) <> (1) Wtedy q = (1)

            'Odległość
            Powrotny PointToPointDistance (_
                Px, Py, ((1) - q) * Ax + q * Bx, ((1) - q) * Ay + q * Obok)
        Kończyć Jeżeli
    Kończyć Funkcja

    Społeczeństwo Podzielony Funkcja SegmentContainsPoint (_
        ByVal A Punkt, ByVal B Jako Punkt, ByVal C Punkt) Boolowski
        'Dwa Segment AB i CD już ustalać the 
        'pokrywać się slope i pokrywać się pokrywać się.
        'AB być the segment, i C być the punkt omawiany.
        'Jeżeli AB zawierać C then powrót prawdziwy, inaczej powrotny fałszywy
        Jeżeli C.Equals (A) Lub C.Equals (B) Wtedy
            Powrotny Prawdziwy
        ElseIf A.X = B.X Wtedy 'Projektować the Y-Axis dla pionowo linia
            Ciemnawy minY Jako Integer = Math.Min (A.Y, B.Y)
            Ciemnawy maxY Jako Integer = Math.Max (A.Y, B.Y)
            Jeżeli minY  <>
           
Inne rozwiązania  
 
programming4us programming4us