UG/NX二次开发自动编程系列之六识别加工面的加工方向

有疑问或无法实现请留言或私信可以提供解答

算法介绍

这个算法与上一节算法有些许不同,它不在去验证每个面是否可见。而是关注光阴的边界。就像太阳光照在大山上就会产生阳面和阴面。我们可以从山顶出发一路向下。当遇见光阴边界就停下来。那么从山顶到边界一路上遇到的一草一木都是可见的。这也是我们算法的原理。从顶面出发,因为顶面没有遮挡总是可见的。然后找到与面的外轮廓边相接的面。然后验证这条轮廓边是否是这个面的顶边,因为我们需要保证一路向下。然后检测这个面是否被遮挡,没有的话,再去找到这个面有哪些边是可见的。最后我们移动到这个面,从这面开始再一路往下,不断重复这个过程直到边界停下。最后统计出一路上遇到的面。这些面都是可见的。这个算法对于合规的几何体(平面,圆柱,圆锥组合的几何体)的识别率可以达到90%以上。剩下无法识别的部分也可以使用上一节的算法来补刀处理。这个算法有些许麻烦,环节稍多。但对于最终效果还是值得的。需要小伙伴们花时间耐心调试。也希望有更好办法的小伙伴提出改进意见。

算法实现步骤

重点步骤讲解

获取顶面

顶面就是与此面相接的面全是底面的面。这里注意一下顶面会有多个,想象一下群山之中会只有一个山顶吗?

判断边是否是顶边

  1. 如果当前面与观察轴是垂直关系。顶边是包含投影轴极值点的边。
  2. 如果当前面与观察轴不垂直,顶边是包含观察轴极值点并且边与观察轴的角度最小的边。(注意是两个条件)
  3. 第二种场景的顶边可能会有多个。只要在顶边集合中皆为顶边。

当前面是否遮挡邻面

算法步骤中出现了很多次当前面 与 邻面。这两个面是这样定义的。当前面相当于顶面。邻面相当于与顶面相接的合法底面。所有的计算都是验证这底面是否可见。

这个判断用到了投影算法。原理是这样,我们从两个面相连的边的中间点出发,分别在两个面上画一条射线。然后计算这两条射线的投影。如果x值为正值,则说明被遮挡,如果x为负,则说明不遮挡。

  1. 怎么计算中间点,这个很简单。一条边有两个点。把这两向量相加然后除以2就可以得到中点
  2. 怎么画射线。画射线是一种形象说法,算法要的是两个向量。这两个向量分别代表这两个面的走向。其实就是获取每个面的指示向量。指示向量的实现有些许麻烦,限于篇幅只介绍实现原理。首先我们使用法向量与边向量计算出两个指示向量。(边有两个点,边向量有两个分别是Ponit1-Point2,Point2-Point1,这两个向量分别与法向量叉积就得到一对方向互反的向量)。然后我们用上一节的点在多边行内算法,计算出哪个向量与面有多个交点,谁就是指示向量。不用担心凹多边形的影响,因为我们前提是这条边是极限边。
  3. 计算投影,这个很简单,可以按照第四节的投影算法直接计算。

判断当前边是否是隐藏边

何为隐藏边,我们知道多边形是一条环线,环线的上半部分就是显示边,下半部分就是隐藏边

判断边的走向是否改变

这个用二维向量的叉乘来计算。它值的正负对应着正逆时针

判断邻面的邻面是否被邻面遮挡

这一步听起来跟绕口令一样,其实主要目的就是检验这条边是不是光阴的边界。要判断就是这个邻面有没有遮挡住与它相邻的面。

这里用到的方法是比较角度。首先找到两个面的指示向量。然后将这两个向量投影到 观察轴+投影轴(具体选择哪个投影轴需要看这两个面在哪个轴上有扩展)。之后分别计算出 观察轴与邻面向量的角度 top,观察轴与邻面邻面的角度 bottom,邻面向量与邻面邻面向量的角度other 如果top+bottom = other时 则other小于180则遮挡。其他不遮挡。

计算邻面是否被遮挡

这是分别找到当前面的指示向量(以当前面与邻面相接边的中点做指示向量)和邻面与邻面里面的指示向量(以邻面与邻面的邻面的相接边的中点做指示向量)。然后解算两个向量的角度是否大于90度,大于则遮挡。

总结

这个算法有少许复杂,但是性能还不错。一个复杂工件的的识别可以在秒级完成。缺点是识别并不完整。会有少许遗漏面。这个算法强调宁少不错。少的可以用其他算法来弥补,但是错了就很麻烦。这也是算法的设计的一个重点。我们可以通过不同算法来逼近,但是前提是每次计算的结果不能是错了,因为错了逼不逼近也没啥意义了。算法中没有介绍圆柱面与圆锥面怎么处理。它其实是用轴向量,来代替指示向量。具体操作也不是很麻烦。这里面看一下AskFaceData对象里的属性,稍作变通即可。算作给小伙伴留一个思考空间可以尝试自行解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值