我正在寻找插入一些轮廓线来生成 3D 视图。轮廓不存储在图片中,轮廓的每个点的坐标仅存储在 std::vector 中。
对于凸轮廓:
,似乎(我自己没有检查)通过使用两个最接近轮廓的两个最近点之间的距离可以轻松计算高度(线性插值)。
我的轮廓不一定是凸的:
,所以它更棘手......实际上我不知道我可以使用什么样的算法。
更新:2013 年 11 月 26 日
我写完了一个离散拉普拉斯示例:
你可以得到代码here https://bitbucket.org/nicooplusplus/discretelaplaceexample/overview
你所拥有的基本上都是经典的狄利克雷问题 http://en.wikipedia.org/wiki/Dirichlet_problem:
给定空间区域边界上的函数值,为该区域内部的函数赋值,使其满足特定方程(例如拉普拉斯方程 http://en.wikipedia.org/wiki/Laplace%27s_equation,这本质上要求函数在内部的任何地方都没有任意的“凹凸”)。
有多种方法可以计算狄利克雷问题的近似解。一种应该非常适合您的问题的简单方法是从离散系统开始;也就是说,您采用高度值的有限网格,为轮廓线上的那些点分配固定值,然后对其余点求解拉普拉斯方程的离散版本。
现在,拉普拉斯方程实际上用简单的术语来说就是:每个点的值都应该等于其邻居的平均值。在方程的数学公式中,我们要求在邻域半径趋于零时在极限范围内成立,但由于我们实际上是在有限格子上工作,因此我们只需要选择一个合适的固定邻域。一些合理的社区选择包括:
- 围绕中心点的四个正交相邻点(也称为冯诺依曼邻域 http://en.wikipedia.org/wiki/Von_Neumann_neighborhood),
- 八个正交和对角相邻的网格点(又称摩尔社区 http://en.wikipedia.org/wiki/Moore_neighborhood), or
- 八个正交和对角相邻的网格点,进行加权,以便正交相邻的点被计数两次(本质上是上述两个选择的总和或平均值)。
(在上面的选择中,最后一个通常会产生最好的结果,因为它最接近高斯核 http://en.wikipedia.org/wiki/Gaussian_function,但前两个通常几乎一样好,并且计算速度可能更快。)
一旦您选择了邻域并定义了固定边界点,就可以计算解决方案了。为此,您基本上有两种选择:
定义一个线性方程组 http://en.wikipedia.org/wiki/System_of_linear_equations,每个(无约束)网格点一个,表示每个点的值是其邻居的平均值,并且solve it http://en.wikipedia.org/wiki/System_of_linear_equations#Other_methods。如果您能够获得良好的资源,这通常是最有效的方法稀疏线性系统求解器 https://scicomp.stackexchange.com/questions/81/what-guidelines-should-i-follow-when-choosing-a-sparse-linear-system-solver,但从头开始编写一个可能具有挑战性。
使用迭代方法,首先为每个不受约束的网格点分配任意初始猜测(例如,按照您的建议使用线性插值),然后循环网格,用其邻居的平均值替换每个点的值。然后继续重复此操作,直到值停止(大幅)变化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)