以下は、メモリに関して最善の解決策ではありませんが、機能する可能性があります。
ユーザーが QuickHull を実行するときは、実際にソリューション全体を実行します。ただし、途中の状態を保存してください。最悪の場合、すべての点が凸包 (凸多角形) 上にあり、O(n 2 ) 時間で実行される場合、QHull は O(n) メモリを必要とするため、中間状態を生成する場合は、サイズ 1、2、3、...、n のベクトルを格納して、各段階でハルを表すため、合計 O(n 3 ) の余分なメモリが発生する可能性があります。
船体を段階的に生成するときは、反復ごとに、その時点で船体がどのように見えるかを表す新しいポイント セットを作成します。生成される凸包を表すには、船体の各ポイントに球シーン ノードを追加します。
関数を使用してシーンに球体を追加できます。この関数は、その状態で凸包を表すベクトルにプッシュできるirr::scene::ISceneManager::addSphereSceneNode(radius)
を返します。IMeshSceneNode*
これらのポイント間のエッジを表示するには、球の間に線を引く必要があります。したがって、現在の船体の各ポイントに対して、それらの間に線を引きます (最後と最初の間にも線を引きます)。
次のようなdraw3DLine
コマンドで線を引くことができます。irr::video::IVideoDriver
irr::video::SMaterial lineMaterial;
lineMaterial.Lighting = false;
lineMaterial.Thickness = 2.0f;
lineMaterial.FrontfaceCulling = false;
lineMaterial.BackfaceCulling = false;
lineMaterial.MaterialType = irr::video::EMT_SOLID;
_driver->setMaterial(lineMaterial);
_driver->setTransform(irr::video::ETS_WORLD,
irr::core::IdentityMatrix);
//draw a line
irr::core::vector3df lineStart,lineEnd; //set these equal to 2 adjacent vertices on your hull
_driver->draw3DLine(lineStart,lineEnd,irr::video::SColor(0.0,0.0,0.0,205)); //blue line
最初はIMeshSceneNode*
、シーンに追加したすべての が非表示になっている必要があります。void irr::scene::ISceneNode::setVisible(bool isVisible)
ベクトルを作成するときに、ベクトル内の各球に対してコマンドを使用します。
ここで、QHull アルゴリズムを実行した後、状態のベクトルへのインデックスを作成できます (各状態はタイムステップでハルを表し、それ自体がベクトルです)。
インデックスをインクリメントすると、(インクリメントする前の) 現在の状態のすべての球を非表示に設定し、次の状態のすべての球を表示することができます。
メインのレンダリング ループは、現在の ConvexHull 状態でエッジをレンダリングする関数も呼び出す必要があります。
このモデルの優れた点は、ユーザーが前後に移動して、アルゴリズムがどのように進行したかを確認できることです。前に進むだけの場合は、船体を表す以前のノードを非表示にする代わりに、それらをシーンから完全に削除できます。
また、このモデルでは、奇妙なスレッド モデルを使用して実行中に QHull アルゴリズムを一時停止する必要はありません。また、アルゴリズム自体を大幅に変更して、一時停止および再開できるようにする必要もありません。EventReceiver
フレームごとに現在のハルの状態をレンダリングするだけで、カメラを動かして自由に見ることができます。次に、独自のクラスを使用してボタンを押してハルを更新するだけです。