2016-09-03 1 views
0

私のコードでは、ポイントのxyz座標を取得します。これは輪郭を形成するはずです。問題は、この点が正しい方法でソートされていないことです。座標を取得すると、x値とy値の上昇によってソートされます。したがって、最初にx値がソートされ、2つのポイントが同じx値を持つ場合、それらのy値によってソートされます。 z値は常に同じなので、無視することができます。 輪郭を形成するために点をソートするには、最近隣のアルゴリズムのバリエーションを使用します。 だからここにソートするために私のコードです:C++有向最近接ソート

double squareDistancePoints(const std::array<double, 3>& a, const std::array<double, 3>& b) 
{ 
    assert(a.size() == b.size()); 
    double sum = 0; 
    for(size_t i = 0; i < a.size(); ++i) 
     sum += pow(b[i]-a[i], 2); 
    return sum; 
} 


for(auto it = matrix.begin(); it != matrix.end(); ++it) 
{ 
    auto bestIt = matrix.end(); 

    double bestSquareDistance = DBL_MAX; 

    for(auto nextIt = it + 1; nextIt != matrix.end(); ++nextIt) 
    { 
     const auto squareDistance = squareDistancePoints(*it, *nextIt); 
     if(squareDistance < bestSquareDistance) 
     { 
      bestSquareDistance = squareDistance; 
      bestIt = nextIt; 
     } 
    } 
    if(bestIt != matrix.end()) 
    { 
     std::swap(*(it + 1), *bestIt); 
    } 

} 

だから、これは立方体や円のように、標準の輪郭のために完璧に動作します。しかし、私はまた、これは動作しません輪郭を持っています。 enter image description here

は、私はすでに私のコードの考え方に問題が見つかりました: だからここで私は私が提供ソートコードを使用すると、私はこの結果を受け、ソートされていない輪郭 enter image description here

の絵です。輪郭は幅よりも実質的に長いので、ソートアルゴリズムも常に間違った場所の最も近い点になります。 だから、正しい絵は次のようになります。ここ

enter image description here

私のアプローチは、一点で始まる最も近い点を検索し、ポイントがくれた方向に従うことでした。私はこれをすべて手動で行いました。 今私の問題は、コードを最適化する方法がわからないため、ソート時の方向に従います。 誰かが私を助けてくれることを願っています。また、ソートされソートされた点を持つ.csvファイルを送信することもできます。

答えて

0

ここでは最後の反復時に間違ったデータ領域にアクセスしています:(it + 1)==matrix.end()その場合=>未定義の動作です。

for(auto it = matrix.begin(); it != matrix.end(); ++it) 
{ 
    ... 
    if(bestIt != matrix.end()) 
    { 
     std::swap(*(it + 1), *bestIt); 
    } 
+0

この定義されていない動作が間違った結果につながる可能性がありますか?それともこれは別の間違いですか?なぜなら、正方形や円のような規則的な輪郭の場合、これは完全にうまく動作するからです。 – user3794592

+0

UBは '(bestIt!= matrix.end())'の場合にのみ発生します。多分それは正方形や円で起こることはありません。あなたは私に教えてください(プリントを追加するか、デバッガを使用してください) –

+0

私は何をしているかを見るためにサンプルコードを作成しました。 [リンク](http://www.tutorialspoint.com/compile_cpp11_online.php?PID=0Bw_CjBb95KQMT2RNOEx0ODU2NFU) – user3794592