Convert BSpline Curve to Arc Spline in OpenCASCADE
Convert BSpline Curve to Arc Spline in OpenCASCADE
Abstract. The paper based on OpenCASCADE algorithms to approximate the NURBS curve to arc spline. The method is most useful in numerical control to drive the cutter along straight line or circular paths. Or in the shipbuilding industry to manufacture section bar for cold frame bender.
Key Words. NURBS, Biarc approximation, arc spline,
1.Introduction
在数控加工CNC领域,通常需要用尽量少段数的圆弧和直线段来对曲线进行拟合。有的数控绘图机也只有直线和圆弧插补器,即只能绘制直线和圆弧,所以也需要将自由曲线转换成直线和圆弧来进行绘制。在船舶制造方面,如肋骨冷弯机只有两种状态:弯和不弯,也只能加工出直线和圆弧,所以也需要将曲面型材的弯曲信息转换成肋骨冷弯机能加工的数据。如下图所示为型材模型及其基线:
Figure 1. 型材模型及基线
Figure 2. 肋骨冷弯机
如上图所示,型材都是直线的,通过弯曲加工出曲线效果。所以也需要将实际的自由曲线的型材数据转换成圆弧样条(直线和圆弧)便于加工。国内外关于这方面的论文很多,本文基于opencascade做了一个测试,opencascade平台相关的数据结构完善,B样条相关算法齐全,可以基于这个开源平台做些开发。
2.Algorithm
看了国内外的一些论文,对NURBS曲线进行圆弧样条拟合的大概思路都是一个先对NURBS曲线离散的过程。一个极端情况就是生成NURBS曲线的显示数据,即多段线来逼近。多段线对于有的机器设备(CNC)而言,加工不便,所以提出尽量使用少的圆弧和直线段来逼近NURBS曲线这种问题。
总的思路是先将NURBS曲线离散成多段线,或将NURBS转换成分段Bezier曲线,然后再用双圆弧样条曲线来进行拟合。
3.Polygon Approximation
将曲线离散成多段线的相关算法是个相对重要的算法,因为可以用于对NURBS曲线的显示。生成曲线显示数据时也有用尽量少的多段线来逼近曲线的问题。所以可以先用生成曲线显示数据的算法来对曲线进行离散化。OpenCASCADE中取曲线上点的相关类都在包GCPnts中:
如类GCPnts_TangentialDeflection可以在满足角度偏差和曲率偏差的条件下对曲线进行离散化。根据文档注释可知:
由上图可知,曲线离散的算法满足条件为向量P1P3和P3P2之间的夹角和P1P2与P1P3之间的夹角分别满足角度和曲率偏差。
如果对经过上述算法处理过的曲线上相邻两个点,根据切线来拟合一段圆弧,这样处理起来程序比用双圆弧拟合要简单,对于尖点的处理也很方便。
过样条曲线上相邻两个节点,且在节点处都切于样条曲线的圆弧一般是不存在的,但却可以决定一圆弧使得在节点处两对切线间的夹角相等,这种方法称为平均切线法。故结合样条曲线离散算法和平均切线法,可以将样条曲线转换成直线和圆弧来逼近表示的圆弧样条曲线。直线的情况就是相邻两个节点处的切线之间的夹角小于一定的偏差,则认为是直线,其他情况都认为是圆弧。
4.Arc Spline Fitting
根据上述原理使用OpenCascade编写程序,OpenCascade在NURBS方面的算法还是很全面的,如计算NURBS曲线曲面上的点或切线,或任意阶导数等等。也有关于圆弧、线段等全面的数据结构,所以借助OpenCascade这个平台,可以快速实现一些想法。
上图所示为当精度为0.5时B样条曲线转换成圆弧样条曲线的结果。其中红色曲线为B样条曲线,黄色为圆弧样条。
当精度为0.1时得到的圆弧样条。
当精度为0.01时得到的圆弧样条。由图可知,圆弧样条与B样条基本重合。
5.Conclusion
综上所述,当离散精度越高时,得到的圆弧样条越逼近原始的B样条,但是圆弧和直线段的数量也会越多。
使用上述算法实现程序简单,避免了双圆弧拟合的一些复杂计算。
OpenCascade中有完善的NURBS相关算法及常见的几何曲线曲面的数据结构,所以借助这个平台,可以快速验证一些想法。
6.References
1.Les A. Piegl, Wayne Tiller. Biarc approximation of NURBS curves.
2.卢建彪,雍俊海. 二次Bezier曲线的双圆弧样条插值二分算法.
3.何援军. 计算机图形学. 机械工业出版社. 2010
PDF Version: Convert BSpline Curve to Arc Spline in OpenCASCADE
Convert BSpline Curve to Arc Spline in OpenCASCADE的更多相关文章
- OPEN CASCADE BSpline Curve Interpolation
OPEN CASCADE BSpline Curve Interpolation eryar@163.com Abstract. Global curve interpolation to point ...
- OpenCASCADE Conic to BSpline Curves-Circle
OpenCASCADE Conic to BSpline Curves-Circle eryar@163.com Abstract. The conic sections and circles pl ...
- OpenCASCADE Conic to BSpline Curves-Hyperbola
OpenCASCADE Conic to BSpline Curves-Hyperbola eryar@163.com Abstract. Rational Bezier Curve can repr ...
- OpenCASCADE Conic to BSpline Curves-Parabola
OpenCASCADE Conic to BSpline Curves-Parabola eryar@163.com Abstract. Rational Bezier Curve can repre ...
- OpenCascade B-Spline Basis Function
OpenCascade B-Spline Basis Function eryar@163.com Abstract. B-splines are quite a bit more flexible ...
- Geometry Curve of OpenCascade BRep
Geometry Curve of OpenCascade BRep eryar@163.com 摘要Abstract:几何曲线是参数表示的曲线 ,在边界表示中其数据存在于BRep_TEdge中,BR ...
- OpenNURBS to OpenCASCADE
OpenNURBS to OpenCASCADE eryar@163.com Abstract. The OpenNURBS initiative provides CAD/CAM/CAE and c ...
- Render OpenCascade Geometry Curves in OpenSceneGraph
在OpenSceneGraph中绘制OpenCascade的曲线 Render OpenCascade Geometry Curves in OpenSceneGraph eryar@163.com ...
- OpenCascade BRep Format Description
OpenCascade BRep Format Description eryar@163.com 摘要Abstract:本文结合OpenCascade的BRep格式描述文档和源程序,对BRep格式进 ...
随机推荐
- 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)
分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...
- 对抗密码破解 —— Web 前端慢 Hash
(更新:https://www.cnblogs.com/index-html/p/frontend_kdf.html ) 0x00 前言 天下武功,唯快不破.但在密码学中则不同.算法越快,越容易破. ...
- 07.LoT.UI 前后台通用框架分解系列之——轻巧的文本编辑器
LoT.UI汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui 上次说的是强大的百度编辑器 http://www.cnblogs.com/d ...
- OpenCASCADE Job - dimue
- Android性能优化之利用Rxlifecycle解决RxJava内存泄漏
前言: 其实RxJava引起的内存泄漏是我无意中发现了,本来是想了解Retrofit与RxJava相结合中是如何通过适配器模式解决的,结果却发现了RxJava是会引起内存泄漏的,所有想着查找一下资料学 ...
- Hawk 6. 编译和扩展开发
Hawk是开源项目,因此任何人都可以为其贡献代码.作者也非常欢迎使用者能够扩展出更有用的插件. 编译 编译需要Visual Stuido,版本建议使用2015, 2010及以上没有经过测试,但应该可以 ...
- 【Python五篇慢慢弹】快速上手学python
快速上手学python 作者:白宁超 2016年10月4日19:59:39 摘要:python语言俨然不算新技术,七八年前甚至更早已有很多人研习,只是没有现在流行罢了.之所以当下如此盛行,我想肯定是多 ...
- Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part2:clusterware安装和升级
Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part2:clusterware安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 3.安装Clus ...
- 深入浅出Redis-redis哨兵集群
1.Sentinel 哨兵 Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所 ...
- 调用微信退款接口或发红包接口时出现System.Security.Cryptography.CryptographicException: 出现了内部错误 解决办法
我总结了一下出现证书无法加载的原因有以下三个 1.证书密码不正确,微信证书密码就是商户号 解决办法:请检查证书密码是不是和商户号一致 2.IIS设置错误,未加载用户配置文件 解决办法:找到网站使用的应 ...