【发布时间】:2013-09-24 08:14:18
【问题描述】:
当对一组点进行三角剖分并且点的数量很大(1000 万)时,您需要在使用四叉树或八叉树细分问题后一次对一个块进行三角剖分。
到目前为止一切顺利,我们现在正在寻找一种聪明的方法来填补每个网格之间的小直线间隙。你知道一个好的吗?
谢谢。
【问题讨论】:
-
你的意思是用三角形镶嵌? (因为你所说的网格......)
当对一组点进行三角剖分并且点的数量很大(1000 万)时,您需要在使用四叉树或八叉树细分问题后一次对一个块进行三角剖分。
到目前为止一切顺利,我们现在正在寻找一种聪明的方法来填补每个网格之间的小直线间隙。你知道一个好的吗?
谢谢。
【问题讨论】:
与其将网格的各个部分焊接在一起,不如先将点集分解为重叠的块?这样,您的问题就变成了删除不需要的边缘而不是找到丢失的边缘之一,代价是沿边界重复计算网格。尽管我怀疑它的计算复杂度没有什么不同,但这可能会更容易。
我相信大多数标准的三角剖分方法不能期望在两个重叠块的边界上产生相同的网格。但是,我也相信(没有证据),随着重叠深度的增加,跨(相邻的内部)块之间边界的网格计算越来越有可能在边界上产生相同的三角剖分。
考虑一组点的现有三角剖分,并在现有点的外壳之外添加一个新点。在大多数情况下,对扩展的点集进行三角剖分只需要对现有网格进行局部(在某种模糊的意义上)调整。同样,删除现有网格边缘的点也很少会影响网格中心的三角剖分。
如果这种 ad-hoc 方法对您没有吸引力,请使用您最喜欢的搜索引擎并寻找 parallel delaunay triangulation
【讨论】:
如果网格是使用线性元素(直边)连接的,则唯一可以产生间隙的方法是相邻边上的端点不重合。
您可以在某个公差范围内检查是否应将两个点设为一个,但公差必须小于网格中的最短边,否则您会折叠元素。
我能想到的最聪明的事情就是并行化工作。每个线程/进程将网格分成一个块,并对每个块进行容差检查。
这可能是一个很好的 map-reduce 工作。或者 GPU 和 CUDA 可能是一个不错的选择。
当你计算两点之间的距离时,你可以放弃昂贵的平方根,只看距离的平方与公差的比较。
【讨论】: