2016-11-07 8 views
0

Ich versuche die Koordinaten eines Quad-Polygons zu sortieren.Koordinaten des Quad-Polygons sortieren

Das Polygon ist in etwa ein Rechteck, aber es ist kein perfektes Rechteck.

Ein Beispiel ist unten:

enter image description here

Alles, was ich von diesem Polygon erhalten ein Satz mit 4 Koordinaten ist, und ich möchte es im Uhrzeigersinn jedes Mal wenn ich es erhalten sortieren. Und der erste Punkt muss immer oben links sein.

Haben Sie eine Idee, wie Sie dieses Problem angehen können?

+0

es keine Rolle spielt, die Koordinate kommt zuerst? Oder solange es im Uhrzeigersinn ist, kann der erste Punkt beliebig sein (oben, unten rechts usw.). – Addison

+0

Der erste muss immer oben rechts sein. – GeneCode

+0

Was ist, wenn es 2 Punkte gibt, die gleich oben rechts liegen? Wie die '(0, 1)' und '(1, 0)' eines um 45 Grad gedrehten Quadrats? Ist die Spitze oder die rechte wichtiger? – Addison

Antwort

1

Meine eigene Frage noch einmal beantworten. Angenommen, wir haben eine Reihe von Punkten des Quads. Und der Ursprungspunkt (0,0) ist höchstens oben links. Die Reihenfolge ist beliebig. Hier gebe ich einfach die Punkte an.

NSMutableArray *pointsArray = [[NSMutableArray alloc] initWithObjects: 
           [NSValue valueWithCGPoint:rf.bottomLeft], 
           [NSValue valueWithCGPoint:rf.topRight], 
           [NSValue valueWithCGPoint:rf.topLeft], 
           [NSValue valueWithCGPoint:rf.bottomRight], 
           nil]; 

Zuerst sortieren wir die Punkte nach x-Koordinaten von klein nach groß.

NSArray *sortedByX = [pointsArray sortedArrayUsingComparator:^NSComparisonResult(NSValue *obj1, NSValue *obj2) { 
     CGPoint p1 = [obj1 CGPointValue]; 
     CGPoint p2 = [obj2 CGPointValue]; 
     return p1.x > p2.x; 
    }]; 

Dann erhalten wir die ersten 2 Punkte (diese beiden im Grunde die obere links und unten links). Also überprüfen wir die Y-Werte dieser beiden, um zu bestimmen, was oben ist und was unten ist, und wir können das sofort zuweisen.

CGPoint Pt1, Pt2, Pt3, Pt4; 

    CGPoint ptMinX1 = [[sortedByX objectAtIndex:0] CGPointValue]; 
    CGPoint ptMinX2 = [[sortedByX objectAtIndex:1] CGPointValue]; 

    if (ptMinX1.y<ptMinX2.y) { 
     Pt1 = ptMinX1; 
     Pt4 = ptMinX2; 
    } else { 
     Pt1 = ptMinX2; 
     Pt4 = ptMinX1; 
    } 

Gleiche geschieht, um die rechten Seiten Punkte zu bestimmen.

CGPoint ptMaxX1 = [[sortedByX objectAtIndex:2] CGPointValue]; 
    CGPoint ptMaxX2 = [[sortedByX objectAtIndex:3] CGPointValue]; 

    if (ptMaxX1.y<ptMaxX2.y) { 
     Pt2 = ptMaxX1; 
     Pt3 = ptMaxX2; 
    } else { 
     Pt3 = ptMaxX1; 
     Pt2 = ptMaxX2; 
    } 

Schließlich erhalten wir die Punkte in dieser Reihenfolge im Uhrzeigersinn:

// Pt1 Pt2 
// 
// Pt4 Pt3 

Anschließend können Sie diese Punkte anordnen, wie Sie (gegen den Uhrzeigersinn, zickzack oder was auch immer) wie

+0

Wie sind Ihre Koordinaten definiert (x = 0 & y = 0) in der linken unteren Ecke? In diesem Fall erhalte ich eine Reihenfolge im Uhrzeigersinn, wenn Sie Ihrer Formel folgen. –

+0

tatsächlich in meinem System ist der Ursprung (0,0) oben links. – GeneCode

+0

Könnten Sie Ihre Annahme relativ zum Ursprung in Ihrer Antwort hinzufügen? –

Verwandte Themen