Pergunta : Pontos de ordem no retângulo

Eu tenho uma disposição conter quatro pontos arbitrários. Eu preciso de requisitar estes na seqüência “normal” do retângulo. a direita esquerda, superior superior, direita inferior, left.

What é uma boa maneira de fazer isto?
class= do

Resposta : Pontos de ordem no retângulo

Eu espero que eu tenho apenas seriamente o overthunk este e há realmente uma maneira mais fácil.  O que eu fiz é computado os pontos de interseção entre as linhas criadas conetando os pontos do polígono e testadas para ver se essa interseção não é um dos vértices.  Se este é o caso então mim trocar os dois pontos apropriados para fazer ao polígono “simples” apropriado:
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 pública Form1

    Polígono confidenciais como a lista nova (de lista (de ponto))
    KSpoints confidencial como a lista (de ponto) = nada

    O submarino confidencial PictureBox1_MouseUp (remetente de ByVal como o objeto, ByVal e como System.Windows.Forms.MouseEventArgs) segura PictureBox1.MouseUp
        Se IsNothing (KSpoints) então
            KSpoints = lista nova (de ponto)
            Polygons.Add (KSpoints)
        Terminar se
        KSpoints.Add (e.Location)
        Se KSpoints.Count = 4 então
            PTE não ofuscante, ptF como o ponto
            Simples não ofuscantes como bôoleanos = retificam
            Se Geometry.SegmentIntersect (KSpoints (0), KSpoints (3), KSpoints (1), KSpoints (2), PTE, ptF) = Geometry.SegmentIntersection.Point então
                'verific para ver se há a interseção entre as linhas dadas forma por 0 a 3 e 1 a 2.
                Para cada pinta como o ponto em KSpoints
                    Se não pinta. Iguais (PTE) então
                        Simples = falso
                        Retirar para
                    Terminar se
                Em seguida
                Se não simples então
                    'trocar os últimos dois pontos
                    Escurecer a pinta como o ponto = o KSpoints (3)
                    KSpoints.RemoveAt (3)
                    KSpoints.Insert (2, pinta)
                Terminar se
                KSpoints = nada
                PictureBox1.Refresh ()
                Retirar o submarino
            Terminar se

            Se Geometry.SegmentIntersect (KSpoints (0), KSpoints (1), KSpoints (2), KSpoints (3), PTE, ptF) = Geometry.SegmentIntersection.Point então
                'verific para ver se há a interseção entre as linhas dadas forma por 0 a 1 e 2 a 3.
                Para cada pinta como o ponto em KSpoints
                    Se não pinta. Iguais (PTE) então
                        Simples = falso
                        Retirar para
                    Terminar se
                Em seguida
                Se não simples então
                    'trocar os dois pontos médios
                    Escurecer a pinta como o ponto = o KSpoints (2)
                    KSpoints.RemoveAt (2)
                    KSpoints.Insert (1, pinta)
                    KSpoints = nada
                    PictureBox1.Refresh ()
                    Retirar o submarino
                Terminar se
            Terminar se

            KSpoints = nada
            PictureBox1.Refresh ()
        Mais
            PictureBox1.Refresh ()
        Terminar se
    Terminar o submarino

    O submarino confidencial PictureBox1_Paint (remetente de ByVal como o objeto, ByVal e como System.Windows.Forms.PaintEventArgs) segura PictureBox1.Paint
        Cores de estática () como a cor = {Color.Red, Color.Green, Color.Blue, Color.Purple}
        Para cada polígono como a lista (de ponto) nos polígono
            Se polígono. Contagem > 1 então
                Para i como o inteiro = 0 ao polígono. Contagem - 2
                    Using P como a pena nova (cores (i))
                        e.Graphics.DrawLine (P, polígono (i), polígono (i + 1))
                    Extremidade Using
                Em seguida
                Se polígono. Contagem > 2 então
                    Using P como a pena nova (cores (polígono. Contagem - 1))
                        e.Graphics.DrawLine (P, polígono (polígono. Contagem - 1), polígono (0))
                    Extremidade Using
                Terminar se
            Terminar se
            Para cada pinta como o ponto no polígono
                Rc não ofuscante como o retângulo novo (pinta, tamanho novo (1, 1))
                rc. Inflar (3, 3)
                e.Graphics.FillRectangle (Brushes.Black, rc)
            Em seguida
        Em seguida
    Submarino da extremidade

Classe da extremidade

Geometria pública da classe

    Enum público SegmentIntersection
        Nenhumas = 0 'os segmentos são paralela e nunca cruzar-se-ão
        Ponto = 1 'que os segmentos se cruzam fisicamente em um ponto
        ExtrapolatedPoint = 2 'que os segmentos se cruzariam fisicamente em um ponto se um ou ambo o segmento era prolongado
        Sobrepor = 3 'os segmentos são paralela e sobreposição em um ponto ou segmento
    Extremidade Enum

    Função compartilhada público SegmentIntersect (_
        ByVal A como o ponto, ByVal B como o ponto, _
        ByVal C como o ponto, ByVal D como o ponto, _
        ByRef E como o ponto, ByRef F como o ponto) como SegmentIntersection

        'Se um ou ambos os segmentos passados dentro é realmente um ponto então apenas fazer um cálculo de PointToSegmentDistance ():
        Se A.Equals (B) OrElse C.Equals (D) então
            Se A.Equals (B) AndAlso C.Equals (D) então
                Se A.Equals (C) então
                    E = A
                    F = A
                    Geometry.SegmentIntersection.Point do retorno
                Mais
                    Geometry.SegmentIntersection.None do retorno
                Terminar se
            ElseIf A.Equals (B) então
                Se Geometry.PointToSegmentDistance (A.X, A.Y, C.X, C.Y, D.X, D.Y) = 0 então
                    E = A
                    F = A
                    Geometry.SegmentIntersection.Point do retorno
                Terminar se
            ElseIf C.Equals (D) então
                Se Geometry.PointToSegmentDistance (C.X, C.Y, A.X, A.Y, B.X, B.Y) = 0 então
                    E = C
                    F = C
                    Geometry.SegmentIntersection.Point do retorno
                Terminar se
            Terminar se
            Retornar Geometry.SegmentIntersection.None
        Terminar se

        'Nós temos dois segmentos reais… deixamos-nos fazer os cálculos para Det1 e Det2:
        Det1 não ofuscante como o dobro = (A.Y - C.Y) * (D.X - C.X) - (A.X - C.X) * (D.Y - C.Y)
        Det2 não ofuscante como o dobro = (B.X - A.X) * (D.Y - C.Y) - (B.Y - A.Y) * (D.X - C.X)

        Se 0 <> então 'segmentos Det2 Non-Parallel (se cruzam ou se cruzariam se prolongado)
            Det3 não ofuscante como o dobro = (A.Y - C.Y) * (B.X - A.X) - (A.X - C.X) * (B.Y - A.Y)
            Det4 não ofuscante como o dobro = (B.X - A.X) * (D.Y - C.Y) - (B.Y - A.Y) * (D.X - C.X)

            R não ofuscante como o dobro = o Det1/Det2
            S não ofuscante como o dobro = o Det3/Det4

            'Computar o ponto de interseção:
            E.X = A.X + r * (B.X - A.X)
            E.Y = A.Y + r * (B.Y - A.Y)
            F = E

            Se (>= 0 AndAlso de r r <>= 0 AndAlso s <> 0 então 'Non-Overlapping
                Geometry.SegmentIntersection.None do retorno
            Mais 'sobrepor (um ponto ou um segmento)
                'Os segmentos paralelos são os mesmos
                Se (A.Equals (C) AndAlso B.Equals (D)) OrElse (A.Equals (D) AndAlso B.Equals (C)) então
                    E = A
                    F = B
                    Geometry.SegmentIntersection.Overlapping do retorno
                Terminar se

                'Os segmentos paralelos sobrepor em exatamente um ponto
                Se B.Equals (C) OrElse B.Equals (D) então
                    E = B
                    F = B
                    Geometry.SegmentIntersection.Overlapping do retorno
                Terminar se
                Se A.Equals (C) OrElse A.Equals (D) então
                    E = A
                    F = A
                    Geometry.SegmentIntersection.Overlapping do retorno
                Terminar se

                'Os segmentos paralelos estão sobrepor em um segmento
                Se Geometry.SegmentContainsPoint (A, B, C) AndAlso Geometry.SegmentContainsPoint (C, D, B) então
                    E = C
                    F = B
                    Geometry.SegmentIntersection.Overlapping do retorno
                ElseIf Geometry.SegmentContainsPoint (A, B, D) AndAlso Geometry.SegmentContainsPoint (D, C, B) então
                    E = D
                    F = B
                    Geometry.SegmentIntersection.Overlapping do retorno
                ElseIf Geometry.SegmentContainsPoint (B, A, C) AndAlso Geometry.SegmentContainsPoint (C, D, A) então
                    E = C
                    F = A
                    Geometry.SegmentIntersection.Overlapping do retorno
                ElseIf Geometry.SegmentContainsPoint (B, A, D) AndAlso Geometry.SegmentContainsPoint (D, C, A) então
                    E = D
                    F = A
                    Geometry.SegmentIntersection.Overlapping do retorno
                ElseIf Geometry.SegmentContainsPoint (C, D, A) AndAlso Geometry.SegmentContainsPoint (A, B, D) então
                    E = A
                    F = D
                    Geometry.SegmentIntersection.Overlapping do retorno
                ElseIf Geometry.SegmentContainsPoint (C, D, B) AndAlso Geometry.SegmentContainsPoint (B, A, D) então
                    E = B
                    F = D
                    Geometry.SegmentIntersection.Overlapping do retorno
                ElseIf Geometry.SegmentContainsPoint (D, C, A) AndAlso Geometry.SegmentContainsPoint (A, B, C) então
                    E = A
                    F = C
                    Geometry.SegmentIntersection.Overlapping do retorno
                ElseIf Geometry.SegmentContainsPoint (D, C, B) AndAlso Geometry.SegmentContainsPoint (B, A, C) então
                    E = B
                    F = C
                    Geometry.SegmentIntersection.Overlapping do retorno
                Terminar se

                'Um segmento contem completamente o outro
                Se Geometry.SegmentContainsPoint (A, B, C) AndAlso Geometry.SegmentContainsPoint (A, B, D) então
                    E = C
                    F = D
                    Geometry.SegmentIntersection.Overlapping do retorno
                Terminar se
                Se Geometry.SegmentContainsPoint (C, D, A) AndAlso Geometry.SegmentContainsPoint (C, D, B) então
                    E = A
                    F = B
                    Geometry.SegmentIntersection.Overlapping do retorno
                Terminar se

                'Os segmentos são paralelos mas não tocando
                Geometry.SegmentIntersection.None do retorno
            Terminar se
        Terminar se
    Terminar a função

    Função compartilhada público PointToPointDistance (machado de ByVal como único, _
        ByVal Ay como único, ByVal Bx como único, ByVal perto como o único) _
        Como único
        'PointToPointDist = SquareRoot ((Bx - machado) ^2 + (por - Ay) ^2)
        Math.Sqrt do retorno ((Bx - machado) * (Bx - machado) + (por - Ay) * (por - Ay))
    Função do fim

    Função compartilhada público PointToSegmentDistance (_
            ByVal Px como único, ByVal PY como único, _
            Machado de ByVal como único, ByVal Ay como único, _
            ByVal Bx como único, ByVal perto como único) como único
        Q não ofuscante como único

        Se (machado = Bx) e (Ay = perto) então
            'A e B passaram definem dentro um ponto, não uma linha.
            'Ponto para apontar a distância
            PointToPointDistance do retorno (Px, PY, machado, Ay)
        Mais
            'A distância está a um comprimento da linha necessário para conetar o ponto a
            '(segmento) o tais que as duas linhas seriam perpendiculares.

            'q é o valor parameterized necessário para começ à interseção
            q = ((Px - machado) * (Bx - machado) + (PY - Ay) * (por - Ay)) /_
                ((Bx - machado) * (Bx - machado) + (por - Ay) * (por - Ay))

            'Limitar q a 0 <> 1 então q = 1

            'Distância
            PointToPointDistance do retorno (_
                Px, PY, (1 - q) * machado + q * Bx, (1 - q) * Ay + q * perto)
        Terminar se
    Terminar a função

    Função compartilhada público SegmentContainsPoint (_
        ByVal A como o ponto, ByVal B como o ponto, ByVal C como o ponto) como bôoleano
        'Dois segmentos AB e o CD têm sido determinados já ter 
        'a mesma inclinação e a aquela que sobrepor.
        'o AB é o segmento, e C é o ponto na pergunta.
        'Se o AB contem C a seguir verdadeiro do retorno, se não retorno falso
        Se C.Equals (A) ou C.Equals (B) então
            Do retorno retificar
        ElseIf A.X = B.X então 'projeta-se ao Y-Axis para linhas verticais
            minY não ofuscante como o inteiro = o Math.Min (A.Y, B.Y)
            maxY não ofuscante como o inteiro = o Math.Max (A.Y, B.Y)
            Se minY  <>
           
Outras soluções  
 
programming4us programming4us