从等高线生成高度图的算法是什么?

2023-12-26

我正在寻找插入一些轮廓线来生成 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,但前两个通常几乎一样好,并且计算速度可能更快。)

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

  1. 定义一个线性方程组 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,但从头开始编写一个可能具有挑战性。

  2. 使用迭代方法,首先为每个不受约束的网格点分配任意初始猜测(例如,按照您的建议使用线性插值),然后循环网格,用其邻居的平均值替换每个点的值。然后继续重复此操作,直到值停止(大幅)变化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从等高线生成高度图的算法是什么? 的相关文章

  • 检查两个数是否是彼此的排列?

    给定两个数字 a b 使得 1 例如 123 是 312 的有效排列 我也不想对数字中的数字进行排序 如果您指的是数字的字符 例如 1927 和 9721 则 至少 有几种方法 如果允许排序 一种方法是简单地sprintf将它们放入两个缓冲
  • 无法使用已与其底层 RCW 分离的 COM 对象。在 oledb 中

    我收到此错误 但我不知道我做错了什么 下面的代码在backrgroundworker中 将异常详细信息复制到剪贴板 System Runtime InteropServices InvalidComObjectException 未处理 通
  • n 或 nlog(n) 比常数时间或对数时间更好吗?

    在 Coursera 上的普林斯顿教程中 讲师解释了遇到的常见增长顺序函数 他说 线性和线性算术运行时间是 我们努力的目标 他的推理是 随着输入大小的增加 运行时间也会增加 我认为这是他犯了错误的地方 因为我之前听过他提到线性增长顺序对于高
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • 如何忽略“有符号和无符号整数表达式之间的比较”?

    谁能告诉我必须使用哪个标志才能使 gcc 忽略 有符号和无符号整数表达式之间的比较 警告消息 gcc Wno sign compare 但你确实应该修复它警告你的比较
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • C# 中的递归自定义配置

    我正在尝试创建一个遵循以下递归结构的自定义配置部分
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • 二维滑动窗口最小值/最大值

    假设我们得到一个大小为 NxN 的像素整数矩阵和一个整数 k 窗口大小 我们需要使用滑动窗口找到矩阵中的所有局部最大值 或最小值 这意味着 如果某个像素与其周围窗口中的所有像素相比具有最小 最大 值 则应将其标记为最小 最大 有一种著名的滑
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 如何让Gtk+窗口背景透明?

    我想让 Gtk 窗口的背景透明 以便只有窗口中的小部件可见 我找到了一些教程 http mikehearn wordpress com 2006 03 26 gtk windows with alpha channels https web
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • 在 Dynamics CRM 插件中访问电子邮件发件人地址

    我正在编写一个 Dynamics CRM 2011 插件 该插件挂钩到电子邮件实体的更新后事件 阶段 40 pipeline http msdn microsoft com en us library gg327941 aspx 并且在此阶
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • Process.Start 阻塞

    我正在调用 Process Start 但它会阻止当前线程 pInfo new ProcessStartInfo C Windows notepad exe Start process mProcess new Process mProce
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke

随机推荐