1

私は現在、アルゴリズムを3DでIrrlicht Engine実装するために使用しています。QuickHullユーザーは、キーを押すだけでアルゴリズムをステップ実行し、個々のステップを移動できます。

ユーザー入力を待っている間にシミュレーション全体が停止しないように、メインのレンダリング ループとは独立してこれを行いたいと思います。ユーザーはカメラをパンして、何が起こっているかを確認できる必要があります。

現在QuickHull、すべての点と線分を含むコンテナー クラスと、アルゴリズムのメソッドがあります。レンダー ループを停止したり、レンダー ループの進行中に誤って再帰を中断したりせずに、このメソッドをオンデマンドで一時停止してユーザー入力を待機させるにはどうすればよいですか?

4

1 に答える 1

1

以下は、メモリに関して最善の解決策ではありませんが、機能する可能性があります。

ユーザーが 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フレームごとに現在のハルの状態をレンダリングするだけで、カメラを動かして自由に見ることができます。次に、独自のクラスを使用してボタンを押してハルを更新するだけです。

于 2013-10-18T15:46:06.593 に答える