根据表面包围的 3D 区域将表面分配给区域

2024-03-16

给定三维空间中的一组曲面,我尝试将每个曲面分配给一个区域,该区域引用该组所包围的最小 3D 区域,或者如果不适用则不指定任何区域。我还想确定一个表面是否是两个区域之间的界面。因此,例如,如果我们有 11 个表面,代表两个堆叠在一起的立方体,则顶部立方体中的表面将位于同一区域,而底部表面将位于不同区域(界面表面为在两个区域)。

举个例子,我想采用一组表面,例如this http://imgur.com/I6OsCax并将其转换为this https://i.stack.imgur.com/cJzG8.jpg。这里的每种颜色代表一个区域,灰色表示没有关联的区域(如底部的翻盖所示)。

我做了一些搜索,试图找到是否有人已经想出了一种算法来做到这一点,但我还没有找到任何东西(大多数似乎识别区域而不是将表面链接到它们所包围的区域)。因此,我正在尝试提出自己的算法,并且想知道是否还有其他替代方案或者我的方法是否可行。

我假设所有表面都是相连的。

我的想法如下:

  1. 选择一个随机表面,其各边恰好接触另一个表面,并将其添加到区域 1。
  2. 将每个连接的表面添加到区域 1,前提是其每一侧恰好接触另一个表面。
  3. 对于那些至少一侧接触多个表面的连接表面,将其添加到“可能”列表中。
  4. 对于区域 1 中的每个新表面,重复步骤 2-3。
  5. 一旦某个表面被添加到“可能”列表两次,请将其添加到区域 1 并从“可能”列表中删除。将此表面标记为区域界面。
  6. 将区域接口添加到区域 2。
  7. 从“可能”列表中选择一个随机表面并将其分配给区域 2,并清除“可能”列表。
  8. 重复步骤 2-7(当然更新区域编号),直到没有未分配的表面。

这似乎适用于简单的场景(例如,两个立方体堆叠在一起),但我不确定是否需要注意任何棘手的条件,或者一旦有两个以上的区域,它是否会分崩离析共同的一面。

对我的粗略算法/替代实现想法的任何改进将不胜感激。谢谢!

编辑:以下是针对一些评论的更多详细信息。 根据我的定义,区域只是一组完全包围 3D 区域、没有间隙的表面。因此,如果我有两个不接触的立方体 A 和 B,我将有两个区域:一个由立方体 A 的所有表面组成,另一个由立方体 B 的所有表面组成。如果我有一个缺失的立方体一侧,不会有与这些表面相关的区域。

我的最终目标是在我正在创建的建模工具中创建一个自动化的曲面分组过程。具体细节是分类的,但本质上我正在处理的模型中,某些属性仅在如上所述的同一“区域”中的表面之间是常见的。我想创建一个创建这些区域的自动化过程,以便用户可以立即将这些属性应用到区域中的所有表面,而不是手动执行。

本质上,问题归结为找到被任意一组表面完全包围的最小 3D 区域,并跟踪哪些表面属于哪些区域。我希望这能让我的问题更清楚。


那么,您感兴趣的是从一组输入多边形中发现闭合表面(体积)网格拓扑;换句话说 - 多面体。这对于几乎所有 3D 建模包来说都很常见。我猜想 Blender 有可以做到这一点的代码。有不同的方法可以做到这一点,但通常使用某种版本的半边图。请参阅此处的维基链接:双链半边图 https://en.wikipedia.org/wiki/Doubly_connected_edge_list。这个想法是遍历您的输入策略并构建这些图表。完成后,您可以轻松查询每个图表以查看是否存在漏洞(边缘缺失等)。

我附上一张图片,解释如何使用半边结构来获得你想要的东西:假设你有一个由五个矩形组成的汤(它们组成一个没有顶部的立方体。U处理你的第一个矩形,比如ABCD,这会创建你的第一个图,比如说 G1。现在你处理第二个多边形,比如说 FEHG,你还没有见过这些顶点,所以你创建第二个图,G2。现在假设你处理多边形 CDGH。你以前已经见过这些顶点,所以而不是创建一个新的图形,您合并(连接)共享这些节点的现有图形。继续,直到处理完所有多边形。您将得到图片中的图形。

现在,查询图表以获取您的信息。一旦您浏览该图,您将看到恰好有四个顶点(节点)缺少边。这些顶点对应于盒子缺失的顶部(图中边缘为红色)。因此您知道该图不是闭合流形。如果您有另一个盒子,它不与这个盒子共享节点,那么您将得到另一张图。因此,一旦您处理完多边形,每个图形都是您的一个“区域”。

请注意,如果您有两个相交的形状,您也可以使用这些图表来跟踪它们,但它要复杂得多。基本上,在处理新的多边形时,您不仅要查看其任何顶点是否属于已处理的图形,还要查看此多边形是否与任何先前处理的多边形相交,如果是,则分割此多边形并将所有这些添加到相交图。

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

根据表面包围的 3D 区域将表面分配给区域 的相关文章

  • 保存为 HDF5 的图像未着色

    我目前正在开发一个将文本文件和 jpg 图像转换为 HDF5 格式的程序 用HDFView 3 0打开 似乎图像仅以灰度保存 hdf h5py File Sample h5 img Image open Image jpg data np
  • 如何用python脚本控制TP LINK路由器

    我想知道是否有一个工具可以让我连接到路由器并关闭它 然后从 python 脚本重新启动它 我知道如果我写 import os os system ssh l root 192 168 2 1 我可以通过 python 连接到我的路由器 但是
  • 如何使用 opencv.omnidir 模块对鱼眼图像进行去扭曲

    我正在尝试使用全向模块 http docs opencv org trunk db dd2 namespacecv 1 1omnidir html用于对鱼眼图像进行扭曲处理Python 我正在尝试适应这一点C 教程 http docs op
  • Pandas/Google BigQuery:架构不匹配导致上传失败

    我的谷歌表中的架构如下所示 price datetime DATETIME symbol STRING bid open FLOAT bid high FLOAT bid low FLOAT bid close FLOAT ask open
  • Python getstatusoutput 替换不返回完整输出

    我发现了这个很棒的替代品getstatusoutput Python 2 中的函数在 Unix 和 Windows 上同样有效 不过我觉得这个方法有问题output被构建 它只返回输出的最后一行 但我不明白为什么 任何帮助都是极好的 def
  • 使用 Python 从文本中删除非英语单词

    我正在 python 上进行数据清理练习 我正在清理的文本包含我想删除的意大利语单词 我一直在网上搜索是否可以使用像 nltk 这样的工具包在 Python 上执行此操作 例如给出一些文本 Io andiamo to the beach w
  • 跟踪 pypi 依赖项 - 谁在使用我的包

    无论如何 是否可以通过 pip 或 PyPi 来识别哪些项目 在 Pypi 上发布 可能正在使用我的包 也在 PyPi 上发布 我想确定每个包的用户群以及可能尝试积极与他们互动 预先感谢您的任何答案 即使我想做的事情是不可能的 这实际上是不
  • n 或 nlog(n) 比常数时间或对数时间更好吗?

    在 Coursera 上的普林斯顿教程中 讲师解释了遇到的常见增长顺序函数 他说 线性和线性算术运行时间是 我们努力的目标 他的推理是 随着输入大小的增加 运行时间也会增加 我认为这是他犯了错误的地方 因为我之前听过他提到线性增长顺序对于高
  • datetime.datetime.now() 返回旧值

    我正在通过匹配日期查找 python 中的数据存储条目 我想要的是每天选择 今天 的条目 但由于某种原因 当我将代码上传到 gae 服务器时 它只能工作一天 第二天它仍然返回相同的值 例如当我上传代码并在 07 01 2014 执行它时 它
  • Python beautifulsoup 仅限 1 级文本

    我看过其他 beautifulsoup 得到相同级别类型的问题 看来我的有点不同 这是网站 我正试图拿到右边那张桌子 请注意表的第一行如何展开为该数据的详细细分 我不想要那个数据 我只想要最顶层的数据 您还可以看到其他行也可以展开 但在本例
  • 从Python中的字典列表中查找特定值

    我的字典列表中有以下数据 data I versicolor 0 Sepal Length 7 9 I setosa 0 I virginica 1 I versicolor 0 I setosa 1 I virginica 0 Sepal
  • 每个术语出现的次数

    我得到了一个数组a n 2 where n can be 10 5最大时有n个科目和n个学生 全部编号为 1 2 n a i 0 and a i 1 1 lt i lt n 表示在第 i 个科目中 所有来自a i 0 to a i 1 通过
  • “隐藏”内置类对象、函数、代码等的名称和性质[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我很好奇模块中存在的类builtins无法直接访问的 例如 type lambda 0 name function of module
  • 在 Sphinx 文档中*仅*显示文档字符串?

    Sphinx有一个功能叫做automethod从方法的文档字符串中提取文档并将其嵌入到文档中 但它不仅嵌入了文档字符串 还嵌入了方法签名 名称 参数 我如何嵌入only文档字符串 不包括方法签名 ref http www sphinx do
  • 改变for循环的顺序?

    我遇到一种情况 我需要根据用户输入以不同的顺序循环遍历 xyz 坐标 所以我是 3D 空间中的一个区域 然后是一组像这样的 for 循环 for int x 0 x lt build getWidth x for int y 0 y lt
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • 如何在 Windows 命令行中使用参数运行 Python 脚本

    这是我的蟒蛇hello py script def hello a b print hello and that s your sum sum a b print sum import sys if name main hello sys
  • 如何计算Python中字典中最常见的前10个值

    我对 python 和一般编程都很陌生 所以请友善 我正在尝试分析包含音乐信息的 csv 文件并返回最常听的前 n 个乐队 从下面的代码中 每听一首歌曲都是一个列表中的字典条目 格式如下 album Exile on Main Street
  • Pandas 每周计算重复值

    我有一个Dataframe包含按周分组的日期和 ID df date id 2022 02 07 1 3 5 4 2022 02 14 2 1 3 2022 02 21 9 10 1 2022 05 16 我想计算每周有多少 id 与上周重
  • 使用随机放置的 NaN 创建示例 numpy 数组

    出于测试目的 我想创建一个M by Nnumpy 数组与c随机放置的 NaN import numpy as np M 10 N 5 c 15 A np random randn M N A mask np nan 我在创建时遇到问题mas

随机推荐

  • 如何处理第三方库代码中的 exit() 调用?

    我正在开发一个 C 应用程序 该应用程序使用另一个团队用 C 编写的库 图书馆的作者喜欢打电话exit 当发生错误时 立即结束程序 而不调用 C 应用程序中堆栈上对象的析构函数 应用程序设置了一些系统资源 这些资源在进程结束后不会自动被操作
  • 发送 TCP 请求并获得响应

    我尝试使用 TCP 请求发送一些字符串 我的服务器 ID 和端口是正确的 我搜索 TCP 请求并找到了一些示例或教程 这是我的来源 public class TcpClient public static final String SERV
  • postgres复制命令,二进制文件

    我正在使用 COPY 将字段从表复制到文件 该字段是一个压缩文本文件 因此我使用二进制副本 文件已创建 唯一的问题是 COPY 向文件添加了标头和尾部 这是我不需要的 这可以改变吗 是否有一个参数可以使 COPY 将字段与数据库中的字段完全
  • 如何在 Angular CLI 中更新 Angular 2

    如何更新 Angular 2 版本 我使用 Angular CLI 1 0 0 beta 20 4 并尝试了 npm update save 但它没有执行任何操作 下面是我目前的 package json 文件 感谢对此的任何帮助 name
  • 如何在黑莓手机中制作状态栏?

    我想在屏幕底部设置状态栏 它应该在左侧和右侧显示一个按钮 你可以在下面看到我的屏幕 我的代码是这样的 private void BottomLayout Bitmap topBg Bitmap getBitmapResource Image
  • 使用 iOS 版 OAuthConsumer 将图像上传到 tumblr

    我正在使用OAuth消费者 http code google com p oauthconsumer 在我的 iOS 应用程序中 它使用汤不热API http www tumblr com docs en api v2 posting 一般
  • paypal沙箱商户账户错误

    我有一个网站 我正在尝试使用 php 脚本将 paypal 连接到该网站 php 构建查询字符串然后提交到https www paypal com cgi bin webscr https www paypal com cgi bin we
  • Maui -- 如何使背景颜色透明?

    我正在尝试编写一个程序 该程序将用作另一个程序之上的覆盖 我希望文本 按钮和边框是实心的 背景是透明的
  • 如何向 Traefik 添加唯一的请求 ID 标头

    在Traefik中 是否可以为请求添加唯一的Request ID标头 我希望能够将访问日志与后端服务的日志关联起来 AFAIK 不支持它 但是 Traefik 2 3 6 中有一个功能解决方法 static config tracing W
  • 通过 FQL 识别来自 fb:comments 的垃圾邮件

    我正在运行 FQL 查询来获取网站上特定帖子的评论 有没有办法识别是否被标记为垃圾邮件 如果没有 我可以看到博客所有者删除了一些评论 以便它们在网站上不可见 是否有办法识别哪些内容已被博客所有者 隐藏 删除 Thanks 我正在使用 is
  • 如何使用 TypeScript 返回正确的 Promise

    所以我正在用 typescript 学习 Angular 2 我正在编写一个模拟服务 如果服务成功获取对象 它 我相信 应该返回一个 Promise 如果发生任何情况 则返回一个错误 我尝试过以下代码 但看起来它不是打字稿的编写语法 更新了
  • 指令中的 $watch 函数在 Angular JS 中没有被触发

    我是 Angular JS 的新手 一直在到处寻找为什么这不起作用的答案 我在这里有我的指令 directive carrouselPreview function return function scope element attrs s
  • 如何禁用表单身份验证

    我的网站中有一个文件夹 我使用基于表单的身份验证对其进行保护 我现在必须在该文件夹中开发两个新页面 并且我想在测试和调试新表单时关闭安全性 我已将网站 web config 文件中的身份验证模式更改为 mode None 并且已从安全文件夹
  • 嵌套溢出滚动隐藏的溢出不起作用

    我有一个 div 没有被剪切到父级的问题 即使它有overflow hidden 我已经浏览过overflow hiddenstackoverflow 上有问题 但大多数都有问题position或者似乎表明我的代码应该可以工作 这是一个MW
  • 读取 CSV Oracle 存储过程 UTL_FILE 时忽略引号之间的逗号

    示例数据 1 test xy yz dog cat 2 test2 xy fish bear 正如您在上面所看到的 第二列可能会也可能不会用引号引起来 并且作为字符串的一部分 我只是想找到一种方法来忽略引号内的逗号 如果有的话 我正在使用
  • 使用 Django 下载文件

    这可能是一个简单的问题 但我不知何故找不到解决方案 Django 提供了很多有关上传文件的信息 但是如何下载文件 假设我们有一个 HTML 按钮uploads something txt作为一个文件 我尝试过django views sta
  • MongoDB 项目放入数组中

    我有对象数组 嵌套 我想从这些嵌套对象中提取一些元素 并在数组中返回这些字段 下面是我的文档结构 从原始数据中模拟 detailLine name first value lineNumber 1 subLineCode detailLin
  • 为什么 IEnumerable 继承自 IEnumerable?

    这可能是一个老问题 为什么IEnumerable
  • Doxygen 将全局变量声明视为 C++ 中的函数

    当我运行 Doxygen 1 8 15 时 我在日志文件中收到警告 指出并未记录函数的所有参数 warning parameters of member gSwInstallIoMgr are not all documented warn
  • 根据表面包围的 3D 区域将表面分配给区域

    给定三维空间中的一组曲面 我尝试将每个曲面分配给一个区域 该区域引用该组所包围的最小 3D 区域 或者如果不适用则不指定任何区域 我还想确定一个表面是否是两个区域之间的界面 因此 例如 如果我们有 11 个表面 代表两个堆叠在一起的立方体