2d矢量图形的最佳数据存储算法

时间:2012-07-23 16:28:17

标签: algorithm opengl graphics vector 2d

我正在研究我希望使用的非常简单但功能强大的2D跨平台CAD软件包。我知道其中有一些已经存在,但我这样做是为了学习经验而不是其他任何事情。

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

我已经看过四叉树,kd树等等,但我迷失的地方是如何利用它们来缩小整个实体的焦点。我见过的大多数例子似乎都是“点”导向的。我假设我想基于边界矩形进行索引,然后对该矩形内的那些实体进行最近点搜索。

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

3 个答案:

答案 0 :(得分:1)

思考“Kd树”走向正确的方向。现在,您需要更进一步,将您的点扩展为具有位置和附加参数的多维基元。 Kd meand“K尺寸”毕竟。

因此,在圆形或圆弧的情况下,您将中心位置存储在树的前两个维度中,然后存储第三个维度中的半径(对于一组2d基元)。对于非圆形的所有其他基元,只需假设一个圆形边界区域。

对于线性基元,您可能需要查看BSP树。当然,你可以将Kd的概念与BSP结合起来,比如使用Kd类节点作为曲线基元,使用BSP作为由线性凸段限定的基元。

答案 1 :(得分:1)

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

关于空间数据结构的权威性参考,其中包括很多关于R树及其亲属的信息:

  • 多维和度量数据结构的基础,作者:Hanan Samet

答案 2 :(得分:0)

空间分区背后的想法是减少您需要执行的测试(及其计算需求)的数量,以便获得可以使用更精细方法测试的基元子集。

你必须使用整个实体的边界框,并在移动时首先确定鼠标下的实体。

您还有其他一些选择:

  1. this链接中显示的空间哈希。这允许您使用低成本距离函数执行线性(或分层)搜索(这适用于2D,但很容易扩展到3D)。
  2. OpenGL选择 - 如果您在渲染代码中实现了足够好的剔除方法,则可以使用OpenGL picking快速确定鼠标下的当前对象。如果您的剔除代码很快,这也会很快。
  3. 还有很多人我肯定我不知道 - 我会在我想到的时候添加它们。 :)希望这有帮助!