Question : Points d'ordre dans le rectangle

J'ai une rangée contenir quatre points arbitraires. Je dois commander ces derniers dans l'ordre « normal » de rectangle. la droite gauche et supérieure supérieure, droite inférieure, left.

What est une bonne manière de faire ceci ?
class= de

Réponse : Points d'ordre dans le rectangle

J'espère que j'ai juste sérieusement l'overthunk celui-ci et il y a réellement une manière plus facile.  Ce que j'ai fait est calculé les points d'intersection entre les lignes créées en reliant les points du polygone et examinées pour voir si cette intersection n'est pas l'un des sommets.  Si c'est le cas puis je permuter les deux points appropriés pour faire au polygone « simple » approprié :
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 :
Classe publique Form1

    Polygones privés en tant que nouvelle liste (de liste (de point))
    KSpoints privé comme liste (de point) = rien

    Le sous-marin privé PictureBox1_MouseUp (expéditeur de ByVal comme objet, ByVal e comme System.Windows.Forms.MouseEventArgs) manipule PictureBox1.MouseUp
        S'IsNothing (KSpoints) puis
            KSpoints = nouvelle liste (de point)
            Polygons.Add (KSpoints)
        Finir si
        KSpoints.Add (e.Location)
        Si KSpoints.Count = 4 puis
            Faible PTE, PTF comme point
            Faibles simples comme booléens = rectifient
            Si Geometry.SegmentIntersect (KSpoints (0), KSpoints (3), KSpoints (1), KSpoints (2), PTE, PTF) = Geometry.SegmentIntersection.Point alors
                'vérifier l'intersection entre les lignes constituées par 0 à 3 et 1 à 2.
                Pour chaque pinte comme point dans KSpoints
                    Sinon pinte. Égales (PTE) puis
                        Simple = faux
                        Sortir pour
                    Finir si
                Après
                Sinon simple puis
                    'permuter les deux derniers points
                    Obscurcir la pinte comme point = KSpoints (3)
                    KSpoints.RemoveAt (3)
                    KSpoints.Insert (2, pinte)
                Finir si
                KSpoints = rien
                PictureBox1.Refresh ()
                Sortir le sous-marin
            Finir si

            Si Geometry.SegmentIntersect (KSpoints (0), KSpoints (1), KSpoints (2), KSpoints (3), PTE, PTF) = Geometry.SegmentIntersection.Point alors
                'vérifier l'intersection entre les lignes constituées par 0 à 1 et 2 à 3.
                Pour chaque pinte comme point dans KSpoints
                    Sinon pinte. Égales (PTE) puis
                        Simple = faux
                        Sortir pour
                    Finir si
                Après
                Sinon simple puis
                    'permuter les deux points moyens
                    Obscurcir la pinte comme point = KSpoints (2)
                    KSpoints.RemoveAt (2)
                    KSpoints.Insert (1, pinte)
                    KSpoints = rien
                    PictureBox1.Refresh ()
                    Sortir le sous-marin
                Finir si
            Finir si

            KSpoints = rien
            PictureBox1.Refresh ()
        Autrement
            PictureBox1.Refresh ()
        Finir si
    Finir le sous-marin

    Le sous-marin privé PictureBox1_Paint (expéditeur de ByVal comme objet, ByVal e comme System.Windows.Forms.PaintEventArgs) manipule PictureBox1.Paint
        Couleurs statiques () comme couleur = {Color.Red, Color.Green, Color.Blue, Color.Purple}
        Pour chaque polygone comme liste (de point) dans les polygones
            Si polygone. Compte > 1 puis
                Pour I comme nombre entier = 0 au polygone. Compte - 2
                    Using P en tant que nouveau stylo (couleurs (i))
                        e.Graphics.DrawLine (P, polygone (i), polygone (I + 1))
                    Extrémité Using
                Après
                Si polygone. Compte > 2 puis
                    Using P en tant que nouveau stylo (couleurs (polygone. Compte - 1))
                        e.Graphics.DrawLine (P, polygone (polygone. Compte - 1), polygone (0))
                    Extrémité Using
                Finir si
            Finir si
            Pour chaque pinte comme point dans le polygone
                Faible rc en tant que nouveau rectangle (pinte, nouvelle taille (1, 1))
                rc. Gonfler (3, 3)
                e.Graphics.FillRectangle (Brushes.Black, rc)
            Après
        Après
    Sous-marin d'extrémité

Classe d'extrémité

La géométrie publique de classe

    Enum public SegmentIntersection
        Aucun = 0 'les segments n'est parallèle et n'intersectera jamais
        Point = 1 'que les segments intersectent physiquement à un point
        ExtrapolatedPoint = 2 'que les segments intersecteraient physiquement à un point si un ou les deux segments étaient prolongés
        Recouvrant = 3 'les segments sont parallèle et chevauchement à un point ou segment
    Extrémité Enum

    Fonction partagée par public SegmentIntersect (_
        ByVal A comme point, ByVal B comme point, _
        ByVal C comme point, ByVal D comme point, _
        ByRef E comme point, ByRef F comme point) comme SegmentIntersection

        'Si un ou tous les deux segments passés dedans est réellement un point puis juste faire un calcul de PointToSegmentDistance () :
        Si A.Equals (B) OrElse C.Equals (D) alors
            Si A.Equals (B) AndAlso C.Equals (D) alors
                Si A.Equals (C) alors
                    E = A
                    F = A
                    Geometry.SegmentIntersection.Point de retour
                Autrement
                    Geometry.SegmentIntersection.None de retour
                Finir si
            ElseIf A.Equals (B) alors
                Si Geometry.PointToSegmentDistance (A.X, A.Y, C.X, C.Y, D.X, D.Y) = 0 puis
                    E = A
                    F = A
                    Geometry.SegmentIntersection.Point de retour
                Finir si
            ElseIf C.Equals (D) alors
                Si Geometry.PointToSegmentDistance (C.X, C.Y, A.X, A.Y, B.X, B.Y) = 0 puis
                    E = C
                    F = C
                    Geometry.SegmentIntersection.Point de retour
                Finir si
            Finir si
            Renvoyer Geometry.SegmentIntersection.None
        Finir si

        'Nous avons deux segments réels… nous avons laissés faire les calculs pour Det1 et Det2 :
        Faible Det1 comme double = (A.Y - C.Y) * (D.X - C.X) - (A.X - C.X) * (D.Y - C.Y)
        Faible Det2 comme double = (B.X - A.X) * (D.Y - C.Y) - (B.Y - A.Y) * (D.X - C.X)

        Si 0 <> puis 'segments Det2 non-parallèles (ils intersectent ou intersecteraient si prolongé)
            Faible Det3 comme double = (A.Y - C.Y) * (B.X - A.X) - (A.X - C.X) * (B.Y - A.Y)
            Faible Det4 comme double = (B.X - A.X) * (D.Y - C.Y) - (B.Y - A.Y) * (D.X - C.X)

            Faible r comme double = Det1/Det2
            Faible s comme double = Det3/Det4

            'Calculer le point d'intersection :
            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 puis 'non-recouverts
                Geometry.SegmentIntersection.None de retour
            Autrement 'recouvrant (un point ou un segment)
                'Les segments parallèles sont identiques
                Si (A.Equals (C) AndAlso B.Equals (D)) OrElse (A.Equals (D) AndAlso B.Equals (C)) puis
                    E = A
                    F = B
                    Geometry.SegmentIntersection.Overlapping de retour
                Finir si

                'Les segments parallèles recouvrent à exactement un point
                Si B.Equals (C) OrElse B.Equals (D) alors
                    E = B
                    F = B
                    Geometry.SegmentIntersection.Overlapping de retour
                Finir si
                Si A.Equals (C) OrElse A.Equals (D) alors
                    E = A
                    F = A
                    Geometry.SegmentIntersection.Overlapping de retour
                Finir si

                'Les segments parallèles recouvrent dans un segment
                Si Geometry.SegmentContainsPoint (A, B, C) AndAlso Geometry.SegmentContainsPoint (C, D, B) alors
                    E = C
                    F = B
                    Geometry.SegmentIntersection.Overlapping de retour
                ElseIf Geometry.SegmentContainsPoint (A, B, D) AndAlso Geometry.SegmentContainsPoint (D, C, B) alors
                    E = D
                    F = B
                    Geometry.SegmentIntersection.Overlapping de retour
                ElseIf Geometry.SegmentContainsPoint (B, A, C) AndAlso Geometry.SegmentContainsPoint (C, D, A) alors
                    E = C
                    F = A
                    Geometry.SegmentIntersection.Overlapping de retour
                ElseIf Geometry.SegmentContainsPoint (B, A, D) AndAlso Geometry.SegmentContainsPoint (D, C, A) alors
                    E = D
                    F = A
                    Geometry.SegmentIntersection.Overlapping de retour
                ElseIf Geometry.SegmentContainsPoint (C, D, A) AndAlso Geometry.SegmentContainsPoint (A, B, D) alors
                    E = A
                    F = D
                    Geometry.SegmentIntersection.Overlapping de retour
                ElseIf Geometry.SegmentContainsPoint (C, D, B) AndAlso Geometry.SegmentContainsPoint (B, A, D) alors
                    E = B
                    F = D
                    Geometry.SegmentIntersection.Overlapping de retour
                ElseIf Geometry.SegmentContainsPoint (D, C, A) AndAlso Geometry.SegmentContainsPoint (A, B, C) alors
                    E = A
                    F = C
                    Geometry.SegmentIntersection.Overlapping de retour
                ElseIf Geometry.SegmentContainsPoint (D, C, B) AndAlso Geometry.SegmentContainsPoint (B, A, C) alors
                    E = B
                    F = C
                    Geometry.SegmentIntersection.Overlapping de retour
                Finir si

                'Un segment contient complètement l'autre
                Si Geometry.SegmentContainsPoint (A, B, C) AndAlso Geometry.SegmentContainsPoint (A, B, D) alors
                    E = C
                    F = D
                    Geometry.SegmentIntersection.Overlapping de retour
                Finir si
                Si Geometry.SegmentContainsPoint (C, D, A) AndAlso Geometry.SegmentContainsPoint (C, D, B) alors
                    E = A
                    F = B
                    Geometry.SegmentIntersection.Overlapping de retour
                Finir si

                Les 'segments sont parallèles mais ne touchant pas
                Geometry.SegmentIntersection.None de retour
            Finir si
        Finir si
    Finir la fonction

    Fonction partagée par public PointToPointDistance (hache de ByVal comme simple, _
        ByVal Ay comme simple, ByVal Bx comme simple, ByVal près en tant que simple) _
        Comme simple
        'PointToPointDist = SquareRoot ((Bx - hache) ^2 + (par - Ay) ^2)
        Math.Sqrt de retour ((Bx - hache) * (Bx - hache) + (par - Ay) * (par - Ay))
    Fonction de fin

    Fonction partagée par public PointToSegmentDistance (_
            ByVal Px comme simple, ByVal PY comme simple, _
            Hache de ByVal comme simple, ByVal Ay comme simple, _
            ByVal Bx comme simple, ByVal près comme simple) comme simple
        Faible q comme simple

        Si (hache = Bx) et (Ay = près) puis
            'A et B ont passé définissent dedans un point, pas une ligne.
            'Distance point par point
            PointToPointDistance de retour (Px, PY, hache, Ay)
        Autrement
            La 'distance est la longueur de la ligne requise pour relier le point à
            '(segment) les tels que les deux lignes seraient perpendiculaires.

            'q est la valeur paramétrisée requise pour arriver à l'intersection
            q = ((Px - hache) * (Bx - hache) + (le PY - Ay) * (par - Ay)) /_
                ((Bx - hache) * (Bx - hache) + (par - Ay) * (par - Ay))

            'Limiter q à 0 <> 1 puis q = 1

            'Distance
            PointToPointDistance de retour (_
                Px, PY, (1 - q) * hache + q * Bx, (1 - q) * Ay + q * près)
        Finir si
    Finir la fonction

    Fonction partagée par public SegmentContainsPoint (_
        ByVal A comme point, ByVal B comme point, ByVal C comme point) comme booléen
        'Deux segments ab et CD ont été déjà déterminés pour avoir 
        la 'même pente et cela qu'ils recouvrent.
        Le 'ab est le segment, et C est le point en question.
        'Si l'ab contient C puis vrai de retour, autrement retour faux
        Si C.Equals (A) ou C.Equals (B) alors
            De retour rectifier
        ElseIf A.X = B.X alors 'projettent à l'axe des ordonnées pour les lignes verticales
            Faible minY comme nombre entier = Math.Min (A.Y, B.Y)
            Faible maxY comme nombre entier = Math.Max (A.Y, B.Y)
            Si minY  <>
           
Autres solutions  
  •  MS Excel 2007 et pdf - l'exportation vers le pdf prend de longues heures !
  •  Dans le Perl, comment j'ajoute une valeur à la liste, puis le contrôle pour voir si la valeur existent avant d'ajouter une nouvelle valeur
  •  Comment fais j'initialiser de la HP BL460c G6 de san et de la HP XP 240000
  •  Comment fais j'employer une clef de permis de volume sur un ordinateur de HP avec du CD de restauration
  •  Emplacement primaire de deux SCCM dans l'annuaire actif
  •  L'initiateur et la HP D2D de l'iSCSI R2 du serveur 2008 de Windows GERCENT l'issue
  •  Stocker le dossier dans le mysql using connector.net et le champ de goutte
  •  Carte vidéo d'USB - bit 32 sur le matériel travaillant au niveau du bit 64 ?
  •  asp.net que j'essaye de convertir une forme de HTML en forme d'aspx ou ? ce qui jamais. Aide du besoin sur la façon dont à à elle.
  •  Winzip 12 issues de secours du travail ?
  •  
    programming4us programming4us