- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在制作一个程序来查看 3D CAD 模型,并希望构建自动分解 View 。将要查看的所有组件都是轴对称的。有些可能不是,但大多数是。我想找出一种自动将装配体中的零件移动到分解图位置的算法。这是我想通过算法实现的示例(当然减去标签):
我必须使用的唯一值是每个部分的边界框的中心。如果需要更多信息,我可以计算更多信息,但似乎应该足够了。我想到的粗略方法是沿轴对称轴计算从装配原点到每个零件中心的矢量,然后计算相对于中心轴到零件中心的径向矢量。从那里,我需要找出一些计算方法,能够根据这两个向量的某种组合来缩放每个部分的位置。那是我不太确定该往哪个方向发展的部分。我包含的图像显示了我想要的确切功能,但我希望能够按任何浮点值缩放位置以扩展或收缩分解 View ,其中 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
到 P4
完全接触,但 P4
和 P5
实际上重叠。
第一个是一种算法,它基本上按一个因素来缩放距离,例如您提出的。如果部件的尺寸在装配体中有很大不同,但对于重叠部件也会受到影响(例如,在您的示例中,沿轴的圆齿轮的延伸远小于钻头支架)。
设缩放因子为f
,则每个边界框的中心按f
缩放,但extension不是。然后零件将是
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'
到 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
。
请注意,简单的缩放算法在没有特殊用户指导的情况下运行(一旦给出缩放因子),而第二个算法使用额外的信息(分组)。
我希望这个相当长的解释能给您一些想法,让您了解如何进一步进行。如果我的解释在某些时候不清楚,或者您还有其他问题,请随时发表评论。
关于algorithm - CAD 的分解图算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5462847/
滑动窗口限流 滑动窗口限流是一种常用的限流算法,通过维护一个固定大小的窗口,在单位时间内允许通过的请求次数不超过设定的阈值。具体来说,滑动窗口限流算法通常包括以下几个步骤: 初始化:设置窗口
表达式求值:一个只有+,-,*,/的表达式,没有括号 一种神奇的做法:使用数组存储数字和运算符,先把优先级别高的乘法和除法计算出来,再计算加法和减法 int GetVal(string s){
【算法】前缀和 题目 先来看一道题目:(前缀和模板题) 已知一个数组A[],现在想要求出其中一些数字的和。 输入格式: 先是整数N,M,表示一共有N个数字,有M组询问 接下来有N个数,表示A[1]..
1.前序遍历 根-左-右的顺序遍历,可以使用递归 void preOrder(Node *u){ if(u==NULL)return; printf("%d ",u->val);
先看题目 物品不能分隔,必须全部取走或者留下,因此称为01背包 (只有不取和取两种状态) 看第一个样例 我们需要把4个物品装入一个容量为10的背包 我们可以简化问题,从小到大入手分析 weightva
我最近在一次采访中遇到了这个问题: 给出以下矩阵: [[ R R R R R R], [ R B B B R R], [ B R R R B B], [ R B R R R R]] 找出是否有任
我正在尝试通过 C++ 算法从我的 outlook 帐户发送一封电子邮件,该帐户已经打开并记录,但真的不知道从哪里开始(对于 outlook-c++ 集成),谷歌也没有帮我这么多。任何提示将不胜感激。
我发现自己像这样编写了一个手工制作的 while 循环: std::list foo; // In my case, map, but list is simpler auto currentPoin
我有用于检测正方形的 opencv 代码。现在我想在检测正方形后,代码运行另一个命令。 代码如下: #include "cv.h" #include "cxcore.h" #include "high
我正在尝试模拟一个 matlab 函数“imfill”来填充二进制图像(1 和 0 的二维矩阵)。 我想在矩阵中指定一个起点,并像 imfill 的 4 连接版本那样进行洪水填充。 这是否已经存在于
我正在阅读 Robert Sedgewick 的《C++ 算法》。 Basic recurrences section it was mentioned as 这种循环出现在循环输入以消除一个项目的递
我正在思考如何在我的日历中生成代表任务的数据结构(仅供我个人使用)。我有来自 DBMS 的按日期排序的任务记录,如下所示: 买牛奶(18.1.2013) 任务日期 (2013-01-15) 任务标签(
输入一个未排序的整数数组A[1..n]只有 O(d) :(d int) 计算每个元素在单次迭代中出现在列表中的次数。 map 是balanced Binary Search Tree基于确保 O(nl
我遇到了一个问题,但我仍然不知道如何解决。我想出了如何用蛮力的方式来做到这一点,但是当有成千上万的元素时它就不起作用了。 Problem: Say you are given the followin
我有一个列表列表。 L1= [[...][...][.......].......]如果我在展平列表后获取所有元素并从中提取唯一值,那么我会得到一个列表 L2。我有另一个列表 L3,它是 L2 的某个
我们得到二维矩阵数组(假设长度为 i 和宽度为 j)和整数 k我们必须找到包含这个或更大总和的最小矩形的大小F.e k=7 4 1 1 1 1 1 4 4 Anwser是2,因为4+4=8 >= 7,
我实行 3 类倒制,每周换类。顺序为早类 (m)、晚类 (n) 和下午类 (a)。我固定的订单,即它永远不会改变,即使那个星期不工作也是如此。 我创建了一个函数来获取 ISO 周数。当我给它一个日期时
假设我们有一个输入,它是一个元素列表: {a, b, c, d, e, f} 还有不同的集合,可能包含这些元素的任意组合,也可能包含不在输入列表中的其他元素: A:{e,f} B:{d,f,a} C:
我有一个子集算法,可以找到给定集合的所有子集。原始集合的问题在于它是一个不断增长的集合,如果向其中添加元素,我需要再次重新计算它的子集。 有没有一种方法可以优化子集算法,该算法可以从最后一个计算点重新
我有一个包含 100 万个符号及其预期频率的表格。 我想通过为每个符号分配一个唯一(且前缀唯一)的可变长度位串来压缩这些符号的序列,然后将它们连接在一起以表示序列。 我想分配这些位串,以使编码序列的预
我是一名优秀的程序员,十分优秀!