排序四边形

时间:2016-11-07 04:33:23

标签: objective-c c polygon

我正在尝试对四边形的坐标进行排序。

多边形大致是一个矩形,但它不是一个完美的矩形。

以下是一个例子:

enter image description here

我从这个多边形得到的是一组4个坐标,我希望每次收到时它都顺时针排序。第一点必须始终是左上角。

知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

再次回答我自己的问题。假设我们有一个四元组的点数组。并且原点(0,0)最多位于左上角。订单是任意的。在这里我简单介绍一下。

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

首先,我们按x坐标从小到大排序点。

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

然后我们得到前2个点(这两个基本上是左上角和左下角)。因此,我们检查这两个的Y值以确定哪个位于顶部,哪个位于底部,我们可以立即分配。

    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;
    }

确定右侧点也是如此。

    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;
    }

最后我们按顺序获得点数,顺时针:

// Pt1   Pt2
//
// Pt4   Pt3

然后你可以随意安排这些点(逆时针,曲折或其他)