Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何独立于主渲染循环单步执行算法(出现提示时)?_C++_Algorithm_Real Time_Computational Geometry_Irrlicht - Fatal编程技术网

C++ 如何独立于主渲染循环单步执行算法(出现提示时)?

C++ 如何独立于主渲染循环单步执行算法(出现提示时)?,c++,algorithm,real-time,computational-geometry,irrlicht,C++,Algorithm,Real Time,Computational Geometry,Irrlicht,我目前正在使用Irrlicht引擎在3D中实现QuickHull算法。用户将能够通过一个按键逐步通过算法,移动通过每个单独的步骤 我希望独立于主渲染循环进行此操作,以便在等待用户输入时不会使整个模拟停止;用户应该能够左右摇动相机,看看发生了什么 我目前有一个QuickHull容器类,其中包含所有的点和线段以及算法的方法。如何使此方法按需暂停并等待用户输入,而不停止渲染循环或在渲染循环继续时意外中断递归?以下不是最佳解决方案,但在内存方面可能会起作用: 当用户运行QuickHull时,实际运行整个

我目前正在使用
Irrlicht引擎
在3D中实现
QuickHull
算法。用户将能够通过一个按键逐步通过算法,移动通过每个单独的步骤

我希望独立于主渲染循环进行此操作,以便在等待用户输入时不会使整个模拟停止;用户应该能够左右摇动相机,看看发生了什么


我目前有一个
QuickHull
容器类,其中包含所有的点和线段以及算法的方法。如何使此方法按需暂停并等待用户输入,而不停止渲染循环或在渲染循环继续时意外中断递归?

以下不是最佳解决方案,但在内存方面可能会起作用:

当用户运行QuickHull时,实际运行整个解决方案。但是,在运行时保存中间状态。在最坏的情况下,如果所有点都位于凸壳(即凸多边形)上,并且在O(n2)时间内运行,则QHull需要O(n)内存,因此如果生成中间状态,则需要存储大小为1、2、3、…、n的向量来表示每个阶段的壳,这可能会导致O(n3)的总额外内存

当您以增量方式生成外壳时,为每个迭代创建一组新的点,这些点表示外壳在当时的外观。若要表示生成的凸面外壳,请在运行时为外壳上的每个点添加球体场景节点

可以使用
irr::scenemanager::addSphereSceneNode(radius)
函数将球体添加到场景中,该函数返回一个
IMeshSceneNode*
,您可以将其推入表示该状态下凸面外壳的向量中

要显示这些点之间的边,需要在球体之间绘制线。因此,对于当前外壳中的每个点,在它们之间绘制一条线(也是最后一个和第一个之间的线)

您可以使用
irr::video::IVideoDriver
中的
draw3DLine
命令绘制一条直线,如下所示:

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::scenenode::setVisible(bool isVisible)

现在,在运行QHull算法之后,您可以在状态向量中创建索引(其中每个状态在一个时间步长上表示外壳,而外壳本身就是一个向量)

增加索引时,可以将当前状态(增加之前)中的所有球体设置为不可见,然后使下一状态中的所有球体可见

主渲染循环还应调用某些函数,以在当前ConvexHull状态下渲染边

这个模型的好处在于,用户现在可以向前和向后查看算法的进展情况。如果仅向前移动,则可以将其从场景中完全移除,而不是使表示外壳的先前节点不可见


使用该模型,我们不需要尝试使用一些奇怪的线程模型在执行过程中暂停QHARE算法,并且不需要对算法本身进行很大的修改,从而可以暂停和恢复。您只需在每一帧渲染当前外壳状态,允许您随意移动相机并查看它,然后使用自己的
EventReceiver
类按一下按钮即可更新外壳。

以下不是内存方面的最佳解决方案,但可以工作:

当用户运行QuickHull时,实际运行整个解决方案。但是,在运行时保存中间状态。在最坏的情况下,如果所有点都位于凸壳(即凸多边形)上,并且在O(n2)时间内运行,则QHull需要O(n)内存,因此如果生成中间状态,则需要存储大小为1、2、3、…、n的向量来表示每个阶段的壳,这可能会导致O(n3)的总额外内存

当您以增量方式生成外壳时,为每个迭代创建一组新的点,这些点表示外壳在当时的外观。若要表示生成的凸面外壳,请在运行时为外壳上的每个点添加球体场景节点

可以使用
irr::scenemanager::addSphereSceneNode(radius)
函数将球体添加到场景中,该函数返回一个
IMeshSceneNode*
,您可以将其推入表示该状态下凸面外壳的向量中

要显示这些点之间的边,需要在球体之间绘制线。因此,对于当前外壳中的每个点,在它们之间绘制一条线(也是最后一个和第一个之间的线)

您可以使用
irr::video::IVideoDriver
中的
draw3DLine
命令绘制一条直线,如下所示:

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::scenenode::setVisible(bool isVisible)

现在,在运行QHull算法之后,您可以在状态向量中创建索引(其中每个状态在一个时间步长上表示外壳,而外壳本身就是一个向量)

增加索引时,可以将当前状态(增加之前)中的所有球体设置为不可见,然后使下一状态中的所有球体可见

主渲染循环还应调用某些函数,以在当前ConvexHull状态下渲染边

这个模型的好处在于,用户现在可以向前和向后查看算法的进展情况。如果仅向前移动,则可以将其从场景中完全移除,而不是使表示外壳的先前节点不可见

肌萎缩侧索硬化