Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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
Algorithm 二维矢量图形的最佳数据存储算法_Algorithm_Opengl_Graphics_Vector_2d - Fatal编程技术网

Algorithm 二维矢量图形的最佳数据存储算法

Algorithm 二维矢量图形的最佳数据存储算法,algorithm,opengl,graphics,vector,2d,Algorithm,Opengl,Graphics,Vector,2d,我正在开发一个非常简单易用但功能强大的2D跨平台CAD软件包。我知道已经有了一些,但我这么做更多的是为了学习经验,而不是其他任何东西 我正在使用OpenGL进行渲染,我希望能够在鼠标移动到每个实体上时高亮显示它。我有在实体上找到最近点的算法,等等,但我不想扫描每个移动的实体的整个数据存储 我已经看过四叉树、kd树等,但我不知道如何使用它们来缩小整个实体的焦点。我看到的大多数例子似乎都是以“点”为导向的。我假设我希望基于边界矩形建立索引,然后对该矩形内的实体进行最近点搜索 有人能为我指出正确的方向

我正在开发一个非常简单易用但功能强大的2D跨平台CAD软件包。我知道已经有了一些,但我这么做更多的是为了学习经验,而不是其他任何东西

我正在使用OpenGL进行渲染,我希望能够在鼠标移动到每个实体上时高亮显示它。我有在实体上找到最近点的算法,等等,但我不想扫描每个移动的实体的整个数据存储

我已经看过四叉树、kd树等,但我不知道如何使用它们来缩小整个实体的焦点。我看到的大多数例子似乎都是以“点”为导向的。我假设我希望基于边界矩形建立索引,然后对该矩形内的实体进行最近点搜索

有人能为我指出正确的方向吗?

认为“Kd树”是正确的方向。现在,您必须更进一步,将点扩展为具有位置和其他参数的多维基本体。Kd毕竟意味着“K维”

因此,对于圆或圆弧,将在树的前二维中存储中心位置,然后在第三维中存储半径(对于一组二维基本体)。对于所有其他非圆形的基本体,只需假设一个圆形边界区域


对于线性基本体,您可能希望查看BSP树。当然,您可以将Kd的概念与BSP结合起来,比如对弯曲的基本体使用类似Kd的节点,对由线性凸段限定的基本体使用BSP。

空间划分背后的思想是减少测试的数量(及其计算需求)为了获得可以使用更精细的方法测试的原语子集,您需要执行

关于必须使用整个实体的边界框并首先确定移动时鼠标下的实体,您是对的

您还有其他一些选择:

  • 空间散列,如链接中所示。这允许您使用低成本的距离函数执行线性(或分层)搜索(这适用于二维,但很容易扩展到三维)
  • OpenGL拾取-如果在渲染代码中实现了足够好的剔除方法,则可以使用来快速确定鼠标下的当前对象。如果你的剔除代码很快,这也会很快

  • 还有很多其他我肯定会错过的东西——我会在想到更多的时候再加上它们。:)希望这有帮助

    听起来你在寻找类似的东西,它们是基于面向轴的边界框的树,其中(与K-d树不同)允许兄弟子树的框重叠。如果我没记错的话,有很多基于不同更新启发的变化

    关于空间数据结构的明确参考,其中包括许多关于R-树及其亲属的信息:

    • 《多维和度量数据结构的基础》,Hanan Samet著

    我刚刚查看了这里的一些信息,我非常喜欢这个选项。特别是,看起来R*树非常适合。对于C++来说,似乎有一些不错的选择。谢谢你的提示。我还需要对空间哈希做更多的研究。看起来他们用的是希尔伯特曲线,我不太熟悉。我确实看过opengl拾取,但问题是,这个选项仍然意味着我必须将实体渲染到后平面,因此我仍然需要缩小渲染实体的数量。在这一点上,我倾向于上面Comingstorm关于r树的想法。