algorithm - 在现有轮廓线之间插入缺失的轮廓线

标签 algorithm language-agnostic geometry computational-geometry geography

等高线(又名等值线)是在二维标量场上追踪常数值的曲线。例如,在地理 map 中,您可能有等高线来通过显示高程恒定的位置来说明地形的高程。在这种情况下,让我们将等高线存储为 map 上的点列表。

假设您的 map 在已知高程处有几条等高线,否则您对 map 的高程一无所知。假设地形是连续的并且没有任何意外,您会使用什么算法来填充额外的等高线以近似 map 的未知高度?

很容易找到有关使用等高线对单个点的高程进行插值的建议。还有像 Marching Squares 这样的算法可以将点高程转换为等高线,但没有一个能准确捕捉到这个用例。我们不需要任何特定点的高程;我们只想要轮廓线。当然,我们可以通过用估计的高程填充数组然后使用移动方 block 根据数组估计等高线来解决这个问题,但是该过程的两个步骤似乎不必要地昂贵并且可能引入伪影。当然有更好的方法。

最佳答案

IMO,几乎所有方法都相当于通过插值以某种方式重建 3D 表面,即使是隐含的。

您可以尝试通过展平曲线(将它们变成多段线)并对它们将定义的结果多边形进行三角测量。 (将有一个关闭在域边界上结束的曲线的步骤。)

通过将三角形与新水平相交(沿边进行线性插值),您将获得对应于新等值线的新折线。请注意,与旧级别的交点重新创建了旧的多段线,这是合理的。

您可以对曲线应用后期平滑处理,但您不能保证恢复到原始的旧曲线,也不能防止接近的曲线相互交叉。

请注意,沿着曲线增加点的密度会给您一种错误的准确性感觉,因为由于等值线的间距而导致的误差将仍然存在(实际上,重建的表面将是圆锥状的,其中一个曲率为空;最底部和最顶部的线内的表面将是平坦的)。


除了使用平面三角形,人们可能会想到一种方案,在该方案中计算每个顶点的梯度向量(f.i. 从顶点及其邻居上的平面的最小二乘拟合),并使用此信息生成双变量三角形中的多项式曲面。您必须以这样一种方式执行此操作,即沿边的值将与共享它的两个三角形重合。 (不幸的是,我没有公式可以给你。)

然后通过将三角形进一步分割为更小的三角形来获得等值线,具有平坦的近似值。

实际上,这与获取样本点、(Delaunay) 对它们进行三角剖分并将分段连续 block 拟合到三角形并没有太大区别。


无论您将使用什么方法,无论是 2D 还是 3D,如果您以连续的方式扫描 z 值的范围,推断会发生什么是很有用的。这个思想实验确实重建了一个 3D 表面,该表面将具有连续性和平滑性。


对粗略的“平面三角剖分”模型的可能改进可能是将每个三角形边延伸到等值线,边通向下一条等值线。这样,可以实现更高阶的插值(三次),从而提供更平滑的重建。

无论如何,您可以确定这会引入不连续性或其他类型的伪像。

关于algorithm - 在现有轮廓线之间插入缺失的轮廓线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44994214/

相关文章:

计算电子商务网站上产品排名的算法/公式(基于以下标准)

performance - 为什么递归优于迭代?

c# - 提高编程能力

r - 根据焦点画一个椭圆

algorithm - 二维网格形状的周长

arrays - 给定一个未排序的整数数组,找到不可搜索的数字

java - 恢复除法算法的实现

arrays - 检测序列的排列

algorithm - 我如何将这些相关索引组织成可以在 Rust 中有效查找的内容?

c++ - 应用于空范围的标准算法 any_of()、all_of() 和 none_of()