2013-05-28 9 views
6

私は座標のグループを持っています:Y軸に基づいて点のベクトルをソートする方法は?

10,40; 9,27; 5,68; 7,55; 8,15;

ソートされたY軸の正しいX軸を失うことなく、これらの座標をソートする方法を教えてください。

私は正しい出力がされるように、座標をソートしたい上記の例から:

8,15; 9,27; 10,40; 7,55; 5,68。

ご意見をいただければ幸いです。 ありがとうございます。

答えて

15

Documentation for std::sort

#include "opencv2/core/core.hpp" 
#include <algorithm> // std::sort 

// This defines a binary predicate that, 
// taking two values of the same type of those 
// contained in the list, returns true if the first 
// argument goes before the second argument 
struct myclass { 
    bool operator() (cv::Point pt1, cv::Point pt2) { return (pt1.y < pt2.y);} 
} myobject; 

int main() { 
    // input data 
    std::vector<cv::Point> pts(5); 
    pts[0] = Point(10,40); 
    pts[1] = Point(9,27); 
    pts[2] = Point(5,68); 
    pts[3] = Point(7,55); 
    pts[4] = Point(8,15); 

    // sort vector using myobject as comparator 
    std::sort(pts.begin(), pts.end(), myobject); 
} 
+0

ありがとう、あなたはライブセーバーです。 – anarchy99

+0

あなたは歓迎です – Alexey

+0

こんにちは@Alexは非常に便利ですが、私の場合はalgorithm.cppクラス内でエラーが発生します "タイプmyclassのオブジェクトの呼び出しのための関数が一致しません"。 – Madhubalan

1

座標のグループをどのくらい正確に保存するかを指定する必要があります。

最も簡単な方法は、それらを新しい構造体として保存し、その上に基本バブルソートアルゴリズムを適用し、Y値をソートパラメータとして使用することです。その後、構造体の位置を "交換"すると、X & Yは一緒に留まります。

struct Vector { 
    float x; 
    float y; 
}; 
+0

実際に私は 'のstd ::ベクトル'でポイントを保存、あなたの答えをいただき、ありがとうございます。あなたは 'struct'にもう一度それを格納する以外に何か提案がありますか? – anarchy99

0

あなたは座標をマップするクラスを作成することができ、そして、あなたのベクトルとしてSTLを使用している場合は、Yをもとにあなたの全体のベクトル座標をソートするsort methodを使用することができます。

Hereおよびhereは、スタックの類似の質問です。

+0

あなたの提案をいただきありがとうございます。あなたが投稿したリファレンスから問題を解決するのに役立つかもしれません。 まずそれを試してみましょう。 – anarchy99

関連する問題