私は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ポイントを見つけたときに関数を再初期化しなければならないので、プログラムは本当に遅くなります。私は誰かが私にこれを行うためのより簡単な方法を見つけるのを助けることを望んでいます。
私は他の多くの機能を作りましたが、クラッシュしました。これはこれまでに働いていた唯一のものです(または、少なくとも私は働きたいと思っています。
達成しようとしているコード例を追加してみてください。 – oronbz
私のコードを追加 –