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格式进 ...
随机推荐
- 前端css兼容性与易混淆的点
一.常用的骨灰级清除浮动 .clearfix:after { content: "."; display: block; height:; clear: both; visibil ...
- shell运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用. expr 是一款表达式计算工具,使用它能完成表达式的求值操作. #!/bin/bash v ...
- c#与java的区别
经常有人问这种问题,用了些时间java之后,发现这俩玩意除了一小部分壳子长的还有能稍微凑合上,基本上没什么相似之处,可以说也就是马甲层面上的相似吧,还是比较短的马甲... 一般C#多用于业务系统的开发 ...
- javaScript的原型继承与多态性
1.prototype 我们可以简单的把prototype看做是一个模版,新创建的自定义对象都是这个模版(prototype)的一个拷贝 (实际上不是拷贝而是链接,只不过这种链接是不可见,给人们的感觉 ...
- 让kindeditor显示高亮代码
kindeditor4.x代码高亮功能默认使用的是prettify插件,prettify是Google提供的一款源代码语法高亮着色器,它提供一种简单的形式来着色HTML页面上的程序代码,实现方式如下: ...
- C#文件安全管理解析
在实际的项目开发中,我们经常需要使用到文件的I/O操作,主要包含对文件的增改删查等操作,这些基本的操作我们都是很熟悉,但是较少的人去考虑文件的安全和操作的管理等方面,例如文件的访问权限管理,文件数据的 ...
- pdo的使用
PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口. PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据. PDO随 ...
- 快速了解微信小程序的使用,一个根据小程序的框架开发的todos app
微信官方已经开放微信小程序的官方文档和开发者工具.前两天都是在看相关的新闻来了解小程序该如何开发,这两天官方的文档出来之后,赶紧翻看了几眼,重点了解了一下文档中框架与组件这两个部分,然后根据简易教程, ...
- java.IO输入输出流:过滤流:buffer流和data流
java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...
- java中的内部类总结
内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类 如同一个人是由大脑.肢体.器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行为(血液.跳动) 显然, ...