CAD 爆炸图算法

2024-02-14

我正在制作一个程序来查看 3D CAD 模型,并希望构建自动分解视图。将看到的所有组件都是轴对称的。有些可能不是,但大多数是。我想找出一种算法,用于自动将组件中的零件移动到分解视图位置。这是我想通过算法实现的示例(当然不包括标签):

我必须使用的唯一值是每个部分的边界框的中心。如果需要更多的信息,我可以计算更多的信息,但看起来应该足够了。我想到的粗略方法是计算沿轴对称轴从装配原点到每个零件中心的矢量,然后计算相对于中心轴到零件中心的径向矢量。从那里,我需要找出一些计算,能够沿着这两个向量的某种组合缩放每个部分的位置。这就是我不太确定该朝哪个方向发展的部分。我包含的图像显示了我想要的确切功能,但我希望能够通过任何浮点值缩放位置以扩展或收缩爆炸视图,其中 1.0 是原始组装模型。有任何想法吗?


你的问题相当广泛,因此我的解释变得有些冗长。我将提出两种用于轴向和径向处理的爆炸算法变体。

为了用示例来说明它们,我将使用以下数字(仅沿轴的边界框,仅五个部分):

P1: [ 0,10] (battery)
P2: [10,14] (motor)
P3: [14,16] (cog)
P4: [16,24] (bit holder)
P5: [18,26] (gear casing)

而零件P1 to P4准确地互相接触,P4 and P5实际上重叠。

第一个是一种基本上按一个因子缩放距离的算法,例如您提出的那样。如果组件中的零件尺寸差异很大,而且重叠零件也如此(例如,在您的示例中,沿轴的圆形齿轮的延伸远小于钻头固定器),则会受到影响。

令缩放因子为f,然后每个边界框的中心缩放f,但扩展不是。那么零件将是

P1:  5 + [-5,5]   => P1':  5*f + [-5,5]
P2: 12 + [-2,2]   => P2': 12*f + [-2,2]
P3: 15 + [-1,1]   => P3': 15*f + [-1,1]
P4: 20 + [-4,4]   => P4': 20*f + [-4,4]
P5: 22 + [-4,4]   => P5': 22*f + [-4,4]

零件之间的距离P1' to P4然后由下式给出

P2' - P1' : (12*f-2) - (5*f+5) = 7*(f-1)
P3' - P2' : (15*f-1) - (12*f+2) = 3*(f-1)
P4' - P3' : (20*f-4) - (15*f+1) = 5*(f-5)

正如预期的那样,差异为零f=0但对于任何分解图,距离很大程度上取决于各个部件的尺寸。我认为如果尺寸变化较大,这看起来不会太好。

另外对于重叠部分

P5' - P4' : (22*f-4) - (20*f+4) = 2*f-8

它们对于合理的 f 仍然重叠。

另一种可能性是不定义轴的比例因子,而是定义恒定的部分距离d。然后边界框将如下所示对齐:

P1': [ 0,10]
P2': [10,14]+d
P3': [14,16]+2*d
P4': [16,24]+3*d
P5': [18,26]+4*d+6

请注意,在最后一行我们添加了24-8=6,即重叠以区分两个部分。

虽然该算法以(在我看来)更好的方式处理上述情况,但我们必须特别注意覆盖多个其他部分且不应包含在分组中的部分(例如,您案例中的手柄顶部)。

一种可能性是第一步将部件分组,然后将算法应用于这些组的边界框。然后可以再次将其应用于每一组中的零件,省略覆盖多个子组的零件。在你的情况下,它会是(注意嵌套分组是可能的):

[
    ([battery,(switch,circuit switch),motor],handle top),
    motor cog, 
    tri-cog,
    red-cog,
    circle-cog,
    bit-holder,
    (gear casing,spring,lock knob)
]

您可能会看到我引入了两种不同类型的组:方括号中的部分/组由算法处理,即在此类组内的每个部分/子组之间添加间距,而圆括号内的组不会分解。

到目前为止,我们还没有处理径向爆炸,因为它很好地与轴处理解耦。但同样,这两种方法也可用于径向爆炸。但在我看来,第二种算法会产生更令人愉快的结果。例如。各组可按如下方式进行放射治疗:

 [
     (battery,switch,<many parts>,gear casing),
     (switch,spring),
     (handle top, lock knob)
 ]

在这种情况下,我们将添加一个附加组件r到第二组中的所有径向中心并且2*r给第三组的所有人。

请注意,简单的缩放算法在没有特殊用户指导的情况下运行(一旦给出缩放因子),而第二个算法使用附加信息(分组)。

我希望这个相当长的解释能给您一些如何进一步进行的想法。如果我的解释在某些时候不清楚或者您还有其他问题,请随时发表评论。

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

CAD 爆炸图算法 的相关文章

  • cordova 使用什么 js“引擎”?

    Cordova 使用什么 JS 引擎 它是特定于平台的还是跨所有平台的一个标准 意味着 iOS 的 safari 和 Android 的 chrome 以及 Windows 可能的 IE 标准 或者跨所有平台的 Cordova JS 引擎
  • 字符串排序真的是 O(n^2logn) 吗? [复制]

    这个问题在这里已经有答案了 我读了以下内容 排序需要 O NlogN 那么它怎么是 O N 2logN 我们在这里想念的是 两个字符串的比较不是 O 1 在最坏的情况下 需要 在 所以最终的复杂度是O N 2logN 它是否正确 我一直认为
  • 线性代数如何在算法中使用?

    我的几个同行都提到 学习算法时 线性代数 非常重要 我研究了各种算法并学习了一些线性代数课程 但我没有看到其中的联系 那么线性代数如何应用在算法中呢 例如 图的连接矩阵可以带来哪些有趣的事情 三个具体例子 线性代数是现代 3D 图形的基础
  • 在 O(n) 时间内找到 n x n 矩阵中的局部最小值

    所以 这不是我的家庭作业问题 而是取自 coursera 算法和数据结构课程的未评分作业 现已完成 You are given an n by n grid of distinct numbers A number is a local m
  • 如何高效地在屏幕上精确绘制N个点?

    这听起来是一个简单的问题 但我发现要获得良好的性能是非常棘手的 我提出的第一个算法是随机绘制点 从一组中检查是否已绘制 否则绘制 如果我们只绘制几个点 那么这种方法效果很好 但当我们接近填满屏幕时 速度会灾难性地减慢 我想出的最好的方法是构
  • Codility 钉板

    尝试了解 Codility NailingPlanks 的解决方案 问题链接 https app codility com programmers lessons 14 binary search algorithm nailing pla
  • 找到一系列间隔的最有效分组

    我有一个应用程序 其中有一系列不重叠的固定宽度间隔 每个间隔都有一个给定的键 每个间隔具有相同的宽度 并且可以存在连续的间隔 本质上 我想以最小化单独间隔的数量的方式对间隔和键进行分组 这可以通过合并具有相同键的连续间隔或查找匹配间隔并将它
  • 最慢的计算复杂度(Big-O)

    在这些算法中 我知道 Alg1 是最快的 因为它是 n 平方的 接下来是 Alg4 因为它是 n 的立方 然后 Alg2 可能是最慢的 因为它是 2 n 这应该具有非常差的性能 然而Alg3和Alg5在我的阅读速度方面还没有遇到过 这两种算
  • 解释一下从 N 个给定集合中的每一个中给出第 K 个最大数字的示例?

    今天我尝试解决一个Facebook 编程挑战赛 https facebook interviewstreet com recruit challenges 我遇到的挑战是 酒吧问题 可以找到here https github com alo
  • 寻找将集合映射到整数的双射函数

    对于任意两个序列 a b 其中 a a1 a2 an 且 b b1 b2 bn 0a b具有相同的元素 而不关心它们的顺序 例如 如果 a 1 1 2 3 b 2 1 3 1 c 3 2 1 3 则 f a f b f a f b 我知道有
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • 如何仅使用单个数组在 JavaScript 中模拟调用堆栈

    我正在看维基百科页面 https en wikipedia org wiki Call stack在调用堆栈上 并尝试理解这个图像 据我所知 哈哈 const memory memory 0 3 top of stack pointer m
  • 带路径压缩算法的加权 Quick-Union

    有一种 带路径压缩的加权快速联合 算法 代码 public class WeightedQU private int id private int iz public WeightedQU int N id new int N iz new
  • 在常数空间中创建 1..N 的随机排列

    我正在寻找枚举固定空间中数字 1 N 的随机排列 这意味着我无法将所有数字存储在列表中 原因是 N 可能非常大 超过可用内存 我仍然希望能够一次遍历这样一个数字的排列 只访问每个数字一次 我知道对于某些 N 可以这样做 许多随机数生成器随机
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这
  • 如何有效地找到距给定点最远的点(从一组点中)?

    我正在寻找一种算法或数据结构来解决以下问题 给你一组点 S 然后你会得到另一个点形式的 Q 查询 对于每个查询 找到集合中距离给定点最远的点 集合中最多有 10 5 个点和 10 5 个查询 所有点的坐标都在 0 到 10 5 范围内 我想
  • 如何检查是否存在可能的路径?

    我正在开发一个基于 javascript 的实验性游戏 玩家必须在二维平铺地图上移动才能退出 请随意检查这个小提琴并演奏 http jsfiddle net moonlife 74vLd 我只是随机放置障碍物 但有时障碍物会挡住玩家和出口之
  • 找到一条穿过任意节点序列的最短路径?

    In 这个先前的问题 https stackoverflow com questions 7314333 find shortest path from vertex u to v passing through a vertex wOP询
  • CSS3DObject 始终位于 WebGL Mesh 前面

    我正在混合CSS3D Renderer with WebGL Renderer to add HTML3D 空间中的元素WebGL场景 这CSS3DObject在前面WebGL网格即使WebGL Renderer具有较高的 z index
  • Florian 的 Grisu2 算法如何工作?

    我遇到了一个关于将 double 转换为 ascii 的问题 经过搜索 我得到了 Florian 的论文 使用整数快速准确地打印浮点数 http www cs tufts edu nr cs257 archive florian loits

随机推荐

  • 同时使用 Thymeleaf 和 JSP

    我使用的是 JSP JSTL 但我对 c if c choose 感到厌烦 因此 我希望我的 JSP 页面同时使用 JSP 和 Thymeleaf 来呈现 我计划尽快删除所有 JSTL 我正在使用春季MVC框架
  • 如何显示“stack haddock”的进度?

    Ran stack haddock haskell src exts I get haskell src exts 1 20 3 configure haskell src exts 1 20 3 build haskell src ext
  • 如何确保一次只运行一份 Perl 脚本副本?

    我需要确保一次只运行一份 Perl 脚本副本 根据建议here http www perlmonks org node id 590619我写了一个子程序来进行检查 sub check instances open my fh lt 0 o
  • 如何在 HTML5 中流式传输实时视频?

    我正在寻找一种方法来广播从植根于 PC 的网络摄像头或相机拍摄的实时视频 广播应该使用标签 我认为支持 rtp 和 rtsp 显示在 HTML5 页面中 查看流的用户不必安装任何插件或视频播放器 例如 QuickTime 我需要视频为 mp
  • Javascript 循环/递增 html 代码,值最大为 55

    我需要在静态 html 页面中自动创建链接列表 有没有办法使用 JavaScript 来执行此操作 我厌倦了一些脚本 但无法解决 这是我的html a href 1 html img src images 1 jpg width 119 h
  • 导入 typescript npm 包中的子文件夹

    我正在创建一个包npm但我希望通过以下方式导入它 import myPackage from my package import subFunction1 subFunction2 from my package subfunctions
  • googleMap标记旋转位置变化

    我使用叠加层作为标记 这是我创建的以下代码
  • 使用 CSS 将 div 相对于不是其父级的另一个 div 定位

    我知道position relative and position absolute相对于其父级来定位 div 的技巧 但是如果 div 不是它的父级并且我想相对于它定位它怎么办 我正在尝试按照这些思路实施一些事情 我也知道position
  • 集合已修改;枚举操作可能无法执行。锁到处都在用怎么可能?

    这是一个只有我在编写和使用的小程序 现在我将编写使用导致此问题的哈希集的所有区域的代码 我不明白这怎么可能 该项目仅在主窗口中使用 hsProxyList 是一个哈希集 HashSet
  • 在 C# 中列出目录中的大量文件

    我正在尝试获取特定目录中的文件列表 其中包含超过 2000 万个文件 每个文件大小从 2 KB 到 20 KB 不等 问题是我的程序每次都会抛出内存不足异常 而像 robocopy 这样的工具可以很好地将文件夹复制到另一个目录 没有任何问题
  • 如何在 Yii2 查询中使用不等于

    我想用一个yii2我想在其中检查不等于条件的查询 我这样尝试过 但没有给出想要的结果 我该怎么做 details MovieShows find gt where movie id gt id gt andWhere location id
  • 有没有可以预览 Markdown 文件的 Vim 插件? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我喜欢标记和 Mou 编辑器 它具有即时预览渲染结果的强大功能 所以我想知道 有没有办法在 Vim 中做
  • 科尔多瓦可以捏合放大吗

    这方面的信息并不多 而且我能找到的信息也非常模糊且无益 我的意思是希望我的 cordova phonegap 应用程序中的一个页面具有可以捏合以放大和平移的图像 这可能吗 如果可以 我该怎么做 在本机代码中 紧接此行之后 super loa
  • $_SERVER['REMOTE_USER'] 可以被欺骗吗?

    我遇到一种情况 我正在打开基于 SERVER REMOTE USER 变量的文件 我不认为这是可以欺骗的 但只是想确认一下 我不想让自己容易受到任意文件读取的影响 是的 该用户名是远程用户指定的用户名 您还需要验证密码 如果密码是由您的服务
  • 从两组日期范围中查找差距日期范围 C#

    我有基准日期范围和测试日期范围 我需要获取基础和测试之间的差距 这意味着缺少基础中但不在测试中的日期范围 最好的方法是什么 Base Date Ranges 1 1 2012 1 10 2012 1 11 2012 1 25 2012 Te
  • 什么时候必须在 Javascript 中使用 new 关键字?

    有时我应该打电话new Foo 创建一个新的 foo 对象 但有时我可以调用Foo 创建它 一般来说 对于给定的函数 我如何知道使用哪个 什么是new关键字做什么 See 这个问题 https stackoverflow com quest
  • 如何取消对 jar 的签名?

    有没有办法取消 java jar 文件的签名 我尝试在开发环境中使用一些已签名的 jar 但遇到安全异常 因此我想取消对这些 jar 的签名 以便稍后在准备部署时对其进行签名 我不知道答案 但我会这样做 解压相关的 jar 文件 jar 只
  • 如何创建腾讯微博(qq)分享按钮?

    我需要实现相当于网站中文翻译的 Tweet 按钮 即not我已经得到的 在微博上分享 按钮 使用生成器here http open weibo com sharebutton 而是一个腾讯 QQ微博分享按钮 到目前为止我所做的 订阅微博 阅
  • 将 sed 的输出存储到变量中[重复]

    这个问题在这里已经有答案了 我想将文件的第二行存储到一个变量中 所以我这样做 sed n 2p myfile 我希望存储的输出sed命令写入名为的变量line 执行此操作的正确语法是什么 Use 命令替换 http tldp org LDP
  • CAD 爆炸图算法

    我正在制作一个程序来查看 3D CAD 模型 并希望构建自动分解视图 将看到的所有组件都是轴对称的 有些可能不是 但大多数是 我想找出一种算法 用于自动将组件中的零件移动到分解视图位置 这是我想通过算法实现的示例 当然不包括标签 我必须使用