【问题标题】:How to represent line segments in kd-tree如何在 kd-tree 中表示线段
【发布时间】:2012-12-31 20:24:31
【问题描述】:

我有大量的二维线段。我想代表他们 kd-tree 结构,然后找到附近的线段 特定的线段。关于如何用 kd-tree 做到这一点的任何想法?

【问题讨论】:

  • 你到底是什么意思? (你要实现的查询操作)find near by line segments for a particular line segment...
  • @leemes:我会尽快添加图片
  • 你确定你画的“等距标记”(粗线周围应该表示相同距离的东西)是那个形状的吗?线的两端不应该是一个半圆吗?
  • @leemes:是的,是半圆。
  • 对这个任务使用不同的空间索引可能会更好,具体来说,R-tree 是为非点数据设计的......

标签: c++ algorithm optimization computational-geometry kdtree


【解决方案1】:

段应该在它相交的每个 kd-tree 叶子中。也就是说,假设一条线段由一对点(p1, p2) 表示,您应该在 kd 树节点中存储对该线段的引用。这条线段应该在它所经过的每个kd-tree节点中,这部分不同于处理点时,每个点只存储在1个kd树节点内。

在拆分 kd 树节点时,您在水平或垂直线上拆分。如果至少一个端点在左子树中,则线段在“左”子树中。右子树也是如此。

您应该通过使用线段的端点执行类似于点查询的操作来查找附近。也就是说,查看查询端点附近的所有 kd-tree 叶子。

然后对于这些 bin 中的潜在线段,您可以通过查看从查询端点到候选线段的垂直线的长度来进行精确的长度比较,反之亦然(将候选线端点与查询线进行比较)。

如何执行此操作的详细信息在此处回答:Shortest distance between a point and a line segment。你应该做 4 次测试,一条线的端点到另一条线,反之亦然,并取最小值。注意忽略点投影到线段之外的情况的距离。

这行得通,因为线不会弯曲,所以两条线之间的最近点必须位于端点之一。

【讨论】:

  • 抱歉,我无法完全理解您的意思。我在kd-tree上很穷。如何在 kd-tree 中表示线段。我应该将它们转换为点以在 kdtree 中表示还是?我的意思是输入是什么。 (老实说,如果我遵循为点数据设计的标准库函数,那么我如何在这种情况下使用该库函数?我可以使用它吗?抱歉术语不好
  • 再次抱歉。我怀疑如何在 kd-tree 中表示线段,我不知道该怎么做。我应该只取中点吗?找到附近的线或我如何表示线段,即两个端点一个数字......可能是我错了......任何想法请
  • 我详细阐述了一些细节。不过,“附近”的指标可能不是您想要的。
  • 感谢您的建议。如果可以,请添加一些示例以说明这一点。
【解决方案2】:

您不能使用分段实现 kd-tree。 kd-tree 是专门为 k 向量空间设计的,段不属于向量空间。想法是 kd-tree 使用超平面来划分 kd-space,如果您不在 kd-vector 空间中,那并不理想。

但是,您需要的可能是 Bounding Volume Hierarchy,https://en.wikipedia.org/wiki/Bounding_volume_hierarchy,这是一种用于碰撞检测的技术。

【讨论】:

    猜你喜欢
    • 2011-03-22
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    • 2011-07-05
    • 2021-10-10
    • 2020-04-02
    • 1970-01-01
    • 2015-11-20
    相关资源
    最近更新 更多