【问题标题】:Triangulating a huge set of points对大量点进行三角剖分
【发布时间】:2013-09-24 08:14:18
【问题描述】:

当对一组点进行三角剖分并且点的数量很大(1000 万)时,您需要在使用四叉树或八叉树细分问题后一次对一个块进行三角剖分。

到目前为止一切顺利,我们现在正在寻找一种聪明的方法来填补每个网格之间的小直线间隙。你知道一个好的吗?

谢谢。

【问题讨论】:

  • 你的意思是用三角形镶嵌? (因为你所说的网格......)

标签: math graphics 3d polygon


【解决方案1】:

与其将网格的各个部分焊接在一起,不如先将点集分解为重叠的块?这样,您的问题就变成了删除不需要的边缘而不是找到丢失的边缘之一,代价是沿边界重复计算网格。尽管我怀疑它的计算复杂度没有什么不同,但这可能会更容易。

我相信大多数标准的三角剖分方法不能期望在两个重叠块的边界上产生相同的网格。但是,我也相信(没有证据),随着重叠深度的增加,跨(相邻的内部)块之间边界的网格计算越来越有可能在边界上产生相同的三角剖分。

考虑一组点的现有三角剖分,并在现有点的外壳之外添加一个新点。在大多数情况下,对扩展的点集进行三角剖分只需要对现有网格进行局部(在某种模糊的意义上)调整。同样,删除现有网格边缘的点也很少会影响网格中心的三角剖分。

如果这种 ad-hoc 方法对您没有吸引力,请使用您最喜欢的搜索引擎并寻找 parallel delaunay triangulation

【讨论】:

    【解决方案2】:

    如果网格是使用线性元素(直边)连接的,则唯一可以产生间隙的方法是相邻边上的端点不重合。

    您可以在某个公差范围内检查是否应将两个点设为一个,但公差必须小于网格中的最短边,否则您会折叠元素。

    我能想到的最聪明的事情就是并行化工作。每个线程/进程将网格分成一个块,并对每个块进行容差检查。

    这可能是一个很好的 map-reduce 工作。或者 GPU 和 CUDA 可能是一个不错的选择。

    当你计算两点之间的距离时,你可以放弃昂贵的平方根,只看距离的平方与公差的比较。

    【讨论】:

    • 我们有间隙,因为如果一个点在体素内,它不在相邻的点内,也没有人在中间添加三角形。
    • 你怎么知道它在“内部”,不应该进一步细分?我假设您的八叉树/四叉树网格生成器尝试在其第一次通过时连接所有点。为什么会有人被抛在后面?
    • 我们只是简单地细分,直到达到预定义的点数,例如 10k。你看到网格了吗,你可以轻松区分所有细分,因为缺少一行/列三角形...
    • 那么,我不知道有什么神奇的解决方案。我能提供的唯一建议是并行化它。将问题分解成可以单独处理的块,然后在公共边界上将这些块焊接在一起。
    • "weld the chunks":这是我问题的重点。你知道一个好的方法吗?
    猜你喜欢
    • 2015-06-12
    • 2016-04-21
    • 2017-12-26
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 2016-09-28
    • 2015-01-19
    相关资源
    最近更新 更多