什么样的算法从轮廓线生成高度图?

时间:2013-11-20 20:42:30

标签: c++ algorithm interpolation linear-interpolation

我正在寻找内插一些轮廓线来生成3D视图。轮廓不存储在图片中,轮廓中每个点的坐标只是存储在std :: vector中。

用于凸轮廓:

enter image description here enter image description here

,似乎(我没有亲自检查)通过使用两个最接近轮廓的两个最近点之间的距离,可以很容易地计算高度(线性插值)。

我的轮廓不一定是凸的:

enter image description here enter image description here

,所以它更棘手......实际上我不知道我可以使用哪种算法。

更新时间:2013年11月26日

我写完了一个离散拉普拉斯的例子:

enter image description here

您可以获取代码here

2 个答案:

答案 0 :(得分:3)

你所拥有的基本上是经典 Dirichlet problem

  

给定空间区域边界上的函数值,为区域内部的函数赋值,使其满足特定的等式(如Laplace's equation,这基本上需要函数在内陆的任何地方都没有任意“颠簸”。

有许多方法可以计算Dirichlet问题的近似解。一个非常适合您的问题的简单方法是从离散化系统开始;也就是说,你采用一个有限的高度值网格,为那些位于轮廓线上的点分配固定值,然后求解其余点的拉普拉斯方程的离散化版本。

现在,拉普拉斯方程实际上用简单的术语指出,每个点的值都应该等于其邻域的平均值。在等式的数学公式中,我们要求由于邻域的半径趋于零,所以在极限中保持为真,但由于我们实际上是在有限格上工作,我们只需要选择一个合适的固定邻域。一些合理的社区选择包括:

  • 围绕中心点的四个正交相邻点(例如von Neumann neighborhood),
  • 八个正交和对角相邻的网格点(例如Moore neigborhood)或
  • 八个正交和对角相邻的网格点,加权使得正交相邻的点计数两次(基本上是上述两个选项的总和或平均值)。

(在上面的选择中,最后一个通常产生最好的结果,因为它最接近Gaussian kernel,但前两个通常几乎一样好,并且可能更快计算。)< / p>

一旦你选择了一个邻域并定义了固定边界点,就可以计算出解决方案了。为此,您基本上有两个选择:

  1. 定义system of linear equations,每个(无约束)网格点一个,指出每个点的值是其邻居的平均值,solve it。这通常是最有效的方法,如果您可以访问一个好的sparse linear system solver,但从头开始编写可能很有挑战性。

  2. 使用迭代方法,首先为每个无约束网格点分配任意初始猜测(例如,使用线性插值,如您所建议的),然后在网格上循环,将每个点的值替换为平均值它的邻居然后不断重复这个,直到值停止变化(很多)。

答案 1 :(得分:2)

您可以生成描述轮廓的顶点和线段的Constrained Delaunay Triangulation,然后使用在每个顶点定义的高度作为Z坐标。

然后可以像任何其他三角形汤一样呈现所产生的三角测量。

尽管有名称,但您可以使用TetGen生成三角测量,但设置需要一些工作。