7

アプリケーションでは、パターンの多くの2D座標(x、y)を測定します。このパターンは、xおよびy方向に固定ピッチのグリッド上のポイントのセットで構成されています。これらの座標にはすべて品質のスコアがあり、このスコアに基づいて並べ替えられます。私がやりたいのは、最初にこれらの座標をxで並べ替え、一緒に属するx座標のグループ(領域)を定義することです。このステップの後、y領域のさまざまなx領域を並べ替えたいと思います。

この後、対応するパターン(グリッド)ラベルに座標にラベルを付けることができます。

例:測定された座標(x、y)=(2,2)、(2,3)、(1,2)、(1,3)、(2,1)、(1,1)、(3,2 )、(3,3)、(3、1)

ステップ1の後:(x、y)=(1,2)、(1,3)、(1,1)(2,2)、(2,3)、(2,1)(3,2)、 (3,3)、(3,1)

ステップ2の後:(x、y)=(1,1)、(1,2)、(1,3)、(2,1)、(2,2)、(2,3)、(3,1 )、(3,2)、(3、3)

このタスクをすでに実行しているソートルーチンはありますか?パターンの一部の座標が測定されない場合にも、ルーチンは機能するはずです。

誰かが私にいくつかの手がかりを与えることができますか、私は経験豊富なc ++プログラマーではありませんが、おそらくいくつかのヒントがあれば私は仕事をすることができます!

4

4 に答える 4

11

安定した並べ替えアルゴリズムが必要です (魔女は等しい要素の順序を変更しません)。最初にy座標でソートし、次にソートしxて目的の結果を取得します。

std::stable_sort(points.begin(), points.end(), yComparator());
std::stable_sort(points.begin(), points.end(), xComparator());

例:
前: (x,y)= (2,2),(2,3),(1,2),(1,3),(2,1),(1,1),(3, 2),(3,3),(3,1)
y でソート: (x,y)= (2,1),(1,1),(3,1),(2,2),(1 ,2),(3,2),(2,3),(1,3),(3,3)
x で並べ替え: (x,y)= (1,1),(1,2),( 1,3)、(2,1)、(2,2)、(2,3)、(3,1)、(3,2)、(3,3)

于 2011-08-27T16:32:56.817 に答える
6

std::sortとカスタムを使用してこれを行うことができますoperator<

#include <algorithm>
#include <vector>

struct coord {
  double x,y,quality;
};

bool operator<(const coord& a, const coord& b) {
  return a.quality < b.quality;
}

int main() {
  std::vector<coord> coords;
  std::sort(coords.begin(), coords.end());
}

「品質」を構造体に保存したくない場合は、いつでも関数を呼び出してoperator<直接計算することができます。

double quality(const coord& c);

bool operator<(const coord& a, const coord& b) {
  return quality(a) < quality(b);
}
于 2011-08-27T16:33:22.260 に答える
4

数値の範囲がわかっている場合は、X に大きな数値を掛けてから、その数値に y を足すことができます。これで、その単一の数値を単純に並べ替えることができます。または、stl ライブラリを使用して、他の人が説明したようにそれを行うことができます。

于 2011-08-27T16:38:21.397 に答える
0
bool compare_coord(pair<int, int> &coord1, pair<int, int> &coord2){
    if(coord2.second > coord1.second)
        return true;
    if(coord2.second == coord1.second && coord2.first > coord1.first)
        return true;
    return false;
}
于 2021-12-10T11:11:21.263 に答える