我正在尝试对四边形的坐标进行排序。
多边形大致是一个矩形,但它不是一个完美的矩形。
以下是一个例子:
我从这个多边形得到的是一组4个坐标,我希望每次收到时它都顺时针排序。第一点必须始终是左上角。
知道如何解决这个问题吗?
答案 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
然后你可以随意安排这些点(逆时针,曲折或其他)