2016-07-12 12 views
-2

私は3Dポイントのリストを持っており、1ユニット以内のポイントをグループ化したいと思います。ここで私が話していることの例です(例として2D点を使用します)。どのように一緒にグループ化するのですか?互いに距離のある3Dポイント

ポイント1:(0,0)とポイント2:(0,1)は1お互いからの距離。プログラムは両方をベクトルに格納します。ここに第3のポイント(0,2)があります。このポイントはポイント2から1つの距離ですが、ポイント1ではなく1つの距離ですが、ベクトルの1つ以上のポイントから1つの距離にあるため、プログラムはそれを保存します。

は、だから、私は非常に多くの異なる機能にこれらの過去を試してみた「ブロブ」

に追加されます。この「ブロブ」から1つの単位以下である「小塊」とすべてのものに3Dポイントを収集したいです数日、再帰を試みましたが、常にクラッシュし、forloopsのネストされたトンが、私はこの仕事をすることはできません。

ここに私のコードは、(私はそれが簡単に理解できるようにすること、コードに次のコメントで追加)

void combinePoints(vector<Point>& allPoints, vector< vector<Cavity> >& allPointBlobs, vector<Point>& tempBlob) 
{ 
    float check; 
    if(allPoints.size() != 0) //if statement to stop recursion once all the points from "allPoints" vector is checked and removed 
    { 
     for(int i = 0; i < allPoints.size(); i++) //3d distance formula checking first point with all other points 
     { 
      check = sqrt((allPoints[0].getX() - allPoints[i].getX()) * (allPoints[0].getX() - allPoints[i].getX()) + 
      (allPoints[0].getY() - allPoints[i].getY()) * (allPoints[0].getY() - allPoints[i].getY()) + 
      (allPoints[0].getZ() - allPoints[i].getZ()) * (allPoints[0].getZ() - allPoints[i].getZ())); 
      if ((check <= 1.000) && (check != 0)) //once a point is found that is 1 distance or less, it is added to tempBlob vector and removed from allPoints 
        { 
           tempBlob.push_back(allPoints[0]); 
           tempBlob.push_back(allPoints[i]); 
           allPoints.erase(allPoints.begin() + i); 
           allPoints.erase(connollyPoints.begin()); 
           break; 
        } 
     } 
     if(check > 1.000) //However, if no points are nearby, then tempBlob is finished finding all nearby points and is added to a vector and cleared so it can start finding another blob. 
     { 
        allPointBlobs.push_back(tempBlob); 
        tempBlob.clear(); 
        cout << "Blob Done" << endl; 
        combinePoints(allPoints, allPointBlobs, tempBlob); 
     } 
     else 
     { 
     combinePoints2(allPoints, allPointBlobs, tempBlob); 
     } 
    } 
} 
void combinePoints2(vector<Point>& allPoints, vector< vector<Point> >& allPointBlobs, vector<Point>& tempBlob) //combinePoints2 is almost the same as the first one, except I changed the first part where it doesnt have to initiate a vector with first two points. This function will then check all points in the temporary blob against all other points and find ones that are 1 distance or less 
{ 
    cout << tempBlob.size() << endl; //I use this just to check if function is working 
    float check = 0; 
    if(allPoints.size() != 0) 
    { 
     for(int j = 0; j < tempBlob.size(); j++) 
     { 
      for(int k = 0; k < allPoints.size(); k++) 
      { 
       check = sqrt((tempBlob[j].getX() - allPoints[k].getX()) * (tempBlob[j].getX() - allPoints[k].getX()) + 
       (tempBlob[j].getY() - allPoints[k].getY()) * (tempBlob[j].getY() - allPoints[k].getY()) + 
       (tempBlob[j].getZ() - allPoints[k].getZ()) * (tempBlob[j].getZ() - allPoints[k].getZ())); 
       if ((check <= 1.000) && (check != 0)) 
        { 
           tempBlob.push_back(allPoints[k]); 
           allPoints.erase(allPoints.begin() + k); 
           break;  
        } 
      } 
      if ((check <= 1.000) && (check != 0)) 
      { 
       break; 
      } 
     } 
     if(check > 1.000) 
     { 
        allPointBlobs.push_back(tempBlob); 
        tempBlob.clear(); 
        cout << "Blob Done" << endl; 
        combinePoints(allPoints, allPointBlobs, tempBlob); 
     } 
     else 
     { 
     combinePoints2(allPoints, allPointBlobs, tempBlob); 
     } 
    } 
} 

ポイントがallPointsから削除された場合、それは以降forloopsを台無しので、私はすべてのブレークを使用します私は使用しています。サイズ()は、実行時間の量です。これは、1ポイントを見つけたときに関数を再初期化しなければならないので、プログラムは本当に遅くなります。私は誰かが私にこれを行うためのより簡単な方法を見つけるのを助けることを望んでいます。

私は他の多くの機能を作りましたが、クラッシュしました。これはこれまでに働いていた唯一のものです(または、少なくとも私は働きたいと思っています。

+0

達成しようとしているコード例を追加してみてください。 – oronbz

+0

私のコードを追加 –

答えて

0
  1. それらが一定の距離内にあるか、または、引数として渡された点が、この点の距離X以内であるかどうかを確認する方法とクラス「ポイント」を使用する場合、引数として2点を取得し、決定する関数を書きます。

  2. "blob"を表す単純なベクトルに1の距離内のすべての点を格納します。

シンプルな素朴なクラスは次のようになります。

class Point{ 

public: 

bool withinDistance(const Point& other) const; 
void addProxyPoint(const Point& other); 

private: 

double x_cord, y_cord, ...; 
std::vector<Point> proximities; 
}; 

あなたはポイントオブジェクト自体にブロブを保存したくない場合は特に、いくつかの他の方法でこれを行うことができますが。 または、ポイントが距離内にあるかどうかをチェックし、それをあなたのブロブベクトルに追加するメソッドを記述することもできます。 あなたのコースを選択してください。

+0

2点がお互いに1つの距離内にあるかどうかをチェックする関数を持っています(3次元の距離の式を使用しています)、1点の近くの点を(1距離以内に)追加する方法を知っていますベクタに追加しても問題はありません。 forloopsを追加すると、私のプログラムが壊れてクラッシュする。私は何千もの3Dポイント(現在は9000)で作業していますので、私のプログラムも高速化する必要があります。コードを読みやすくするためにコメントをつけて投稿します。 –

+0

元の投稿を更新し、自分のコードを追加しました。 –

関連する問題