2016-11-07 7 views
0

四角ポリゴンの座標をソートしようとしています。四角ポリゴンの座標をソート

多角形はおおよそ長方形ですが、完全な長方形ではありません。

例は以下の通りです:

enter image description here

私はこのポリゴンから得るすべては、4つの座標のセットである、と私は私がそれを受け取る時計回りの毎回のように、それをソートしたいです。そして、最初のポイントは常に左上でなければなりません。

この問題にどのようにアプローチすればよいですか?

+0

が問題それをしない座標た(ジグザグまたは何、反時計回りに)これらの点を手配することができます

// Pt1 Pt2 // // Pt4 Pt3 

最初に来る?または時計回りであれば、最初のポイントは任意のもの(上、右下など) – Addison

+0

最初は常に右上でなければなりません。 – GeneCode

+0

右上に等しく2点ある場合はどうなりますか?正方形の '(0、1)'と '((1,0) 'のように、45度回転していますか?上または右はより重要ですか? – Addison

答えて

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点(基本的に左上と左下の2点)を取得します。そこで、これらの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; 
    } 

は最後に、私たちはそのため、時計回りにポイントを取得する:あなたが好きなようにあなたは、その後

+0

左下にどのように座標が定義されていますか(x = 0とy = 0)?その場合、私はあなたの数式に従うときに、私は非時計回りの注文を得る。 –

+0

実際に私のシステムでは、原点(0,0)は左上にあります。 – GeneCode

+0

回答の起点を基準に仮定を追加できますか? –

関連する問題