Convert BSpline Curve to Arc Spline in OpenCASCADE

eryar@163.com

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

 

Convert BSpline Curve to Arc Spline in OpenCASCADE的更多相关文章

  1. OPEN CASCADE BSpline Curve Interpolation

    OPEN CASCADE BSpline Curve Interpolation eryar@163.com Abstract. Global curve interpolation to point ...

  2. OpenCASCADE Conic to BSpline Curves-Circle

    OpenCASCADE Conic to BSpline Curves-Circle eryar@163.com Abstract. The conic sections and circles pl ...

  3. OpenCASCADE Conic to BSpline Curves-Hyperbola

    OpenCASCADE Conic to BSpline Curves-Hyperbola eryar@163.com Abstract. Rational Bezier Curve can repr ...

  4. OpenCASCADE Conic to BSpline Curves-Parabola

    OpenCASCADE Conic to BSpline Curves-Parabola eryar@163.com Abstract. Rational Bezier Curve can repre ...

  5. OpenCascade B-Spline Basis Function

    OpenCascade B-Spline Basis Function eryar@163.com Abstract. B-splines are quite a bit more flexible ...

  6. Geometry Curve of OpenCascade BRep

    Geometry Curve of OpenCascade BRep eryar@163.com 摘要Abstract:几何曲线是参数表示的曲线 ,在边界表示中其数据存在于BRep_TEdge中,BR ...

  7. OpenNURBS to OpenCASCADE

    OpenNURBS to OpenCASCADE eryar@163.com Abstract. The OpenNURBS initiative provides CAD/CAM/CAE and c ...

  8. Render OpenCascade Geometry Curves in OpenSceneGraph

    在OpenSceneGraph中绘制OpenCascade的曲线 Render OpenCascade Geometry Curves in OpenSceneGraph eryar@163.com ...

  9. OpenCascade BRep Format Description

    OpenCascade BRep Format Description eryar@163.com 摘要Abstract:本文结合OpenCascade的BRep格式描述文档和源程序,对BRep格式进 ...

随机推荐

  1. TODO:即将开发的第一个小程序

    TODO:即将开发的第一个小程序 微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验.个人理解小程序是寄宿在微信平台上的一个前端框架,具有跨平台功能, ...

  2. MVC Core 网站开发(Ninesky) 1、创建项目

    又要开一个新项目了!说来惭愧,以前的东西每次都没写完,不是不想写完,主要是我每次看到新技术出来我都想尝试一下,看到.Net Core 手又痒了,开始学MVC Core. MVC Core最吸引我的有三 ...

  3. 【HanLP】资料链接汇总

    Java中调用HanLP配置 HanLP自然语言处理包开源官方文档 了解HanLP的全部 自然语言处理HanLP 开源自由的汉语言处理包主页 GitHub源码 基于hanLP的中文分词详解-MapRe ...

  4. springMVC学习笔记--知识点总结1

    以下是学习springmvc框架时的笔记整理: 结果跳转方式 1.设置ModelAndView,根据view的名称,和视图渲染器跳转到指定的页面. 比如jsp的视图渲染器是如下配置的: <!-- ...

  5. 代码的坏味道(14)——重复代码(Duplicate Code)

    坏味道--重复代码(Duplicate Code) 重复代码堪称为代码坏味道之首.消除重复代码总是有利无害的. 特征 两个代码片段看上去几乎一样. 问题原因 重复代码通常发生在多个程序员同时在同一程序 ...

  6. python中IndentationError: expected an indented block错误的解决方法

    IndentationError: expected an indented block 翻译为IndentationError:预期的缩进块 解决方法:有冒号的下一行要缩进,该缩进就缩进

  7. BPM配置故事之案例14-数据字典与数据联动

    小明遇到了点麻烦,他昨天又收到了行政主管发来的邮件,要求把出差申请单改由H3 BPM进行,表单如下 行政主管的出差申请表 小明对表单进行了调整,设计出了一份适合在系统中使用的表单,但在"出差 ...

  8. Android种使用Notification实现通知管理以及自定义通知栏(Notification示例四)

    示例一:实现通知栏管理 当针对相同类型的事件多次发出通知,作为开发者,应该避免使用全新的通知,这时就应该考虑更新之前通知栏的一些值来达到提醒用户的目的.例如我们手机的短信系统,当不断有新消息传来时,我 ...

  9. window7系统怎么找到开始运行命令

    右击开始->属性->开始菜单->自定义>点击运行命令(选择)->确定

  10. Ubuntu下利用Mono,Jexus搭建Asp.Net(MVC) Web服务器

    最近在Ubuntu上搭建了Asp.Net的Web服务器,其中遇到很多问题,整理一下思路,以备后用. 搭建环境以及配套软件 Ubuntu: 11.10 Mono:3.0.6 下载地址(http://do ...