我正在寻找内插一些轮廓线来生成3D视图。轮廓不存储在图片中,轮廓中每个点的坐标只是存储在std :: vector中。
用于凸轮廓:
,似乎(我没有亲自检查)通过使用两个最接近轮廓的两个最近点之间的距离,可以很容易地计算高度(线性插值)。
我的轮廓不一定是凸的:
,所以它更棘手......实际上我不知道我可以使用哪种算法。
我写完了一个离散拉普拉斯的例子:
您可以获取代码here
答案 0 :(得分:3)
你所拥有的基本上是经典 Dirichlet problem :
给定空间区域边界上的函数值,为区域内部的函数赋值,使其满足特定的等式(如Laplace's equation,这基本上需要函数在内陆的任何地方都没有任意“颠簸”。
有许多方法可以计算Dirichlet问题的近似解。一个非常适合您的问题的简单方法是从离散化系统开始;也就是说,你采用一个有限的高度值网格,为那些位于轮廓线上的点分配固定值,然后求解其余点的拉普拉斯方程的离散化版本。
现在,拉普拉斯方程实际上用简单的术语指出,每个点的值都应该等于其邻域的平均值。在等式的数学公式中,我们要求由于邻域的半径趋于零,所以在极限中保持为真,但由于我们实际上是在有限格上工作,我们只需要选择一个合适的固定邻域。一些合理的社区选择包括:
(在上面的选择中,最后一个通常产生最好的结果,因为它最接近Gaussian kernel,但前两个通常几乎一样好,并且可能更快计算。)< / p>
一旦你选择了一个邻域并定义了固定边界点,就可以计算出解决方案了。为此,您基本上有两个选择:
定义system of linear equations,每个(无约束)网格点一个,指出每个点的值是其邻居的平均值,solve it。这通常是最有效的方法,如果您可以访问一个好的sparse linear system solver,但从头开始编写可能很有挑战性。
使用迭代方法,首先为每个无约束网格点分配任意初始猜测(例如,使用线性插值,如您所建议的),然后在网格上循环,将每个点的值替换为平均值它的邻居然后不断重复这个,直到值停止变化(很多)。
答案 1 :(得分:2)
您可以生成描述轮廓的顶点和线段的Constrained Delaunay Triangulation,然后使用在每个顶点定义的高度作为Z坐标。
然后可以像任何其他三角形汤一样呈现所产生的三角测量。
尽管有名称,但您可以使用TetGen生成三角测量,但设置需要一些工作。