ですから、これは最適化の質問であり、答えを見つけることができませんでした。
与えられたランダムな点のセットの凸包を計算するためのコードをいくつか書きました。比較のために、古いOpenGLのものを使用して視覚化する、独自の低速O(n³)アルゴリズムを作成しました。遅い凸包アルゴリズムの性質上、ポイントはまったくソートされません。したがって、ソートはCHの計算の直後に行われます。
私の問題は、1000ポイントまで、1秒未満で視覚的な結果が得られることです。しかし、10000ポイントの場合、15〜20分以上かかります(それ以上待つことはありません)。ただし、並べ替えコードをスキップして、openglに凸包の頂点を並べ替えずに表示させると、1分もかかりません。つまり、ClockWiseの並べ替えが常に消費されます。コードを確認してください(他の場所で定義されているため、意味をなさない名前もあります):
// This code actually compares every pair iteratively with respect to the center point
// Consider a given vector "convex", which contains all the convex hull points unsorted
.
..
...
....
int avgx,avgy,sumx=0,sumy=0;
for (int i=0;i<convex.size();i++){
sumx+=convex.at(i).at(0);
sumy+=convex.at(i).at(1);
}
avgx=sumx/(convex.size()/2.0); //something like an internal point
avgy=sumy/(convex.size()/2.0);
sort(convex.begin(),convex.end()); //x-sort
int det,tempx,tempy;
for (int i=0;i<convex.size()-1;i++){
x1=convex.at(i).at(0);
y1=convex.at(i).at(1);
x2=convex.at(i+1).at(0);
y2=convex.at(i+1).at(1);
det=(x1-avgx)*(y2-avgy)-(x2-avgx)*(y1-avgy);
if (det<0){ //on which side of O-X1 lies X2?
tempx=convex.at(i).at(0); //swapping points
tempy=convex.at(i).at(1);
convex.at(i).at(0)=convex.at(i+1).at(0);
convex.at(i).at(1)=convex.at(i+1).at(1);
convex.at(i+1).at(0)=tempx;
convex.at(i+1).at(1)=tempy;
i=-1; //check again the new vector from the beginning
}
}
return convex;
表示部分:
glColor3f(0.8, 0.2, 0.2);
glPointSize(3);
glBegin(GL_LINE_LOOP);
for (int i=0;i<count;i++){
glVertex2f(convexHull.at(i).at(0),convexHull.at(i).at(1));
}
glEnd();
私が見たところ、このアプローチ(外積を比較することによる)が最も効率的です。ただし、この前に、8分以内に視覚的な結果が得られたため、実際にはより高速な不潔なコードを作成しました。汚れがひどくて長いので、それを維持したくありません。これはきれいですが、非常に遅いです(実際に機能する場合は...)。それで、私はCWのような10000の凸点を待つ必要がありますか、それとも私が見逃しているものがありますか?
何か考えていただければ幸いです。他に何か含める必要がある場合はお知らせください。