OpenCASCADE Conic to BSpline Curves-Circle
OpenCASCADE Conic to BSpline Curves-Circle
Abstract. The conic sections and circles play a fundamental role in CAD/CAM applications. Undoubtedly one of the greatest advantages of NURBS is their capability of precisely representing conic sections and circles, as well as free-form curves and surfaces. We assume a knowledge of conics and circles, the purpose of this paper is to study them in the framework of their representation as NURBS curves.
Key Words. OpenCASCADE, Conic Curves, Circle, Convert, BSpline Curve
1. Introduction
B样条技术在自由曲线曲面的设计和表示方面显示出了其卓越的优点,但在表示初等曲线曲面时却遇到了麻烦。在很多应用领域,例如飞机、造船、汽车等工业中,圆弧、椭圆弧、抛物线、圆柱面、球面、圆锥面、圆环面等经常出现,这些形状都表示精确且往往要求较高的加工精度。传统的B样条技术只能精确地表示抛物线、抛物面,对其他的二次曲线曲面只能近似表示。因此,在一个造型系统内无法用一种统一的形式表示曲线曲面,因而使得系统的开发复杂化。非均匀有理B样条(NURBS)技术正是在这样的需求背景下逐步发展成熟起来的。
NURBS曲线曲面能够迅速接受的主要原因在于:
v NURBS技术可以精确表示规则曲线与曲面(如圆锥曲线、二次曲面、旋转曲面等)。
v 可以把规则曲线曲面和自由曲线曲面统一起来表示。因而便于用统一的算法进行处理和使用统一的数据库进行存储,程序量可明显减少;
v 由于增加了额外的自由度(权因子),若应用得当,有利于曲线曲面形状的控制和修改。
v NURBS技术是非有理Bezier曲线的和B样条形式的真正推广;
本文主要介绍圆的NURBS表示方法,即如何将圆转换为NURBS曲线。
2.The Effect of Multiple Knots (Multiplicity)
重节点的定义为在节点序列中顺序r个节点相同或xi重复出现r次,称为该节点xi具有重复度r(Multiplicity)。在OpenCASCADE中B样条曲线类的构造就是用的节点Knots及其对应的重复度Multiplicities来实现的,如下所示:
//! Creates a non-rational B_spline curve on the <br>
//! basis <Knots, Multiplicities> of degree <Degree>. <br>
Standard_EXPORT Geom_BSplineCurve(const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Multiplicities,const Standard_Integer Degree,const Standard_Boolean Periodic = Standard_False);
重节点有如下重要性质:
v 重节点连续阶性质。在每个节点区间(uj, uj+1)内部,Bi,p(u)为多项式函数,因此,所有导数存在。在一个节点uj处Bi,p(u)是p-mj次连续可微的,此处mj是该点的重数。所以增加次数,则增加连续性,而增加节点的重数,则降低连续性。通常为保证连续性,节点的最高重数为p;
v 重节点的插值基函数性质。当节点向量中的内节点uj的重数为p,则只有定义在上的基函数在uj上取值为1,其余基函数在uj取值为0。当节点向是中的端节点uj的重数为p+1,则只有定义在上的基函数在uj取值为1,其余基函数在uj取值为0。
如下图所示为具有重节点的B样条基函数:
Figure 2.1 U={0, 0, 0, 1, 2, 3, 4, 4, 5, 5, 5} p = 2 B-spline Basis Function
Figure 2.2 U={0, 0, 0, 0,1, 2, 3, 4, 4,4, 5, 5, 5,5} p = 3 B-spline Basis Function
由上图可知,重节点的出现对B样条曲线有影响,如下所述:
当节点向量内部某节点的重数与次数相同时,则B样条基数在此节点处的值为1,即由此得到的B样条曲线的控制顶点将与B样条曲线上的点重合。所以利用重节点的插值性质可以在B样条曲线内部构造尖点与尖角。
当端节点重数为p时,p次的B样条曲线的端点将与相应的控制多边形的端点相重,曲线在端节点处与控制多边形相切。
当端节点重数为p+1时,p次B样条曲线就具有与p次Bezier曲线相同的端点几何性质。这时如果B样条曲线的定义域仅有一个非零节点区间,则所定义的B样条曲线就是Bezier曲线。由此可知,B样条方法是Bezier方法的强有力的推广。
理解重节点的作用非常重要,利用重节点技术可用来控制B样条基以达到控制整条曲线在节点处的连续性的目的。
3.Construction of Circles
如前所述,NURBS技术是Bezier技术的推广。实际上,有理Bezier技术就可精确地表示圆锥曲线。由有理Bezier曲线的公式得二次有理Bezier曲线弧的表示形式为:
称k为形状不变因子,公式如下所示:
一段小于180度的圆弧也可以用二次有理Bezier曲线来表示。由于对称性,P0P1P2必须是一个等腰三角形,满足P0P1=P1P2,计算得ω1=cos(θ)。
Figure 3.1 圆心角度小于180度圆弧的二次有理Bezier表示
大于180度的圆弧可以使用多段小圆弧拼接而成。得用重节点技术,使多段圆弧拼接起来。重节点的一种方法是使用2重节点,在有i段圆弧时,其内部节点值可取为1/i,…,i-1/i,权因子的取法不变。
以180度的圆弧为例,可以使用两段90度圆弧拼接而成。节点矢量可取为U={0,0,0,1/2,1/2,1,1,1}。权因子可以取为ω1=ω3=cos45,ω0=ω2=ω4=1。则对应的B样条基函数及B样条曲线如下图所示:
由图可知基函数在1/2处取值为1,则对应的B样条曲线上的值与控制顶点重合。
Figure 3.2 U={0,0,0,1/2,1/2,1,1,1} B Spline Basis
Figure 3.3 Semi-Circle B Spline Curve
用四段圆弧组成一个整圆,节点矢量为U={0,0,0,1/4,1/4,2/4,2/4,3/4,3/4,1,1,1},权因子取{1,sqrt(2)/2,1,1,sqrt(2)/2,1,1,sqrt(2)/2,1},使用Tcl脚本在Draw Test Harness中显示如下图所示:
Figure 3.4 A Circle represented by 4 arcs
Tcl代码如下所示:
#
# Copyright (c) 2014 eryar All Rights Reserved.
#
# File : colorscale.tcl
# Author : eryar@163.com
# Date : 2014-10-13 18:10
# Version : 1.0v
#
# Description : Demonstrate the rational 2d Bezier curve
# and BSpline curve.
# pload MODELING # use 4 arc to composite a circle
2dbsplinecurve c2 \
/ / / \
\
sqrt(2.0)/2.0 \
\
- sqrt(2.0)/2.0 \
- \
- - sqrt(2.0)/2.0 \
- \
- sqrt(2.0)/2.0 \ # fit the 2d view
v2d
2dfit
也可用位于三角形上的控制点来表示圆,如下图所示:
Figure 3.5 A Circle represented by 3 arcs
相应的Tcl代码如下所示:
pload MODELING
# a 2d periodic circle (parameter from 0 to 2*pi !!)
dset h sqrt()/
2dpbsplinecurve c3 \
pi/1.5 pi/0.75 *pi \
-h/ \
0.5 -h/ 0.5 \
0.25 h/ \
*h/ 0.5 \
-0.25 h/ \
-0.5 -h/ 0.5 \
-h/
# fit the 2d view
v2d
2dfit
4.Code Analysis
OpenCASCADE中提供了将圆转换为NURBS曲线的功能,转换后得到的NURBS曲线的参数范围不再是[0,1]。下面给出具体的实例:
void TestCircleConvert(void)
{
gp_Circ2d aCircle;
aCircle.SetRadius(1.0);
Convert_ParameterisationType aType = Convert_TgtThetaOver2;
Convert_CircleToBSplineCurve aConvertor(aCircle, aType); Handle_Geom_Circle aGeomCircle = GC_MakeCircle(gp::XOY(), 1.0);
Handle_Geom_BSplineCurve aBSplineCurve =
GeomConvert::CurveToBSplineCurve(aGeomCircle, aType); std::cout << "Convert Circle to BSpline Curve: " << std::endl;
DumpConvertorInfo(aConvertor);
} int main(int argc, char* argv[])
{
TestCircleConvert(); return ;
}
结果如下图所示:
由上述结果可知,在默认参数化的情况下是按三段圆弧来拼接成一个整圆的。也可指定不同的参数化类型,将会得到不同的NURBS曲线。次数也可能不是2次,会用高次的NURBS曲线来表示圆。
5.Conclusion
利用重节点技术及二次有理B样条的性质,可以用NURBS来精确表示圆。选择不同的控制顶点,得到的圆的参数化效果也有所不同。
将常用的圆锥曲线用NURBS曲线来表示,即说明可以用NURBS曲线来统一表示圆锥曲线及自由曲线。这说明在理论上,一个造型内核的曲线可以只用一个类来表示,这个类对应OpenCASCADE中的Geom_BSplineCurve。
使用Tcl可以在Draw Test Harness中方便地产生NURBS曲线,从而可以快速验证一些算法的正确性。
6. References
1. 赵罡,穆国旺,王拉柱译Les Piegl,Wayne Tiller The NURBS Book(Second Edition) 2010 清华大学出版社
2. 莫容,常智勇 计算机辅助几何造型技术 2009 科学出版社
3. 朱心雄等,自由曲线曲面造型技术,2000,科学出版社
4. Kelly Dempski, Focus on Curves and Surface, 2003, Premier Press
5. 王仁宏,李崇君,朱春钢 计算几何教程 2008 科学出版社
PDF version and Tcl script: OpenCASCADE Conic to BSpline Curves-Circle
OpenCASCADE Conic to BSpline Curves-Circle的更多相关文章
- 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 ...
- B-spline Curves 学习前言与动机(1)
B-spline Curves 学习之前言 本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完成相关的翻译学习. (原来博客网址:http:// ...
- B-spline Curves 学习之B样条曲线的移动控制点、修改节点分析(7)
B-spline Curves: Moving Control Points 本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完成相关的翻译学习 ...
- B-spline Curves 学习之B样条曲线的系数计算与B样条曲线特例(6)
B-spline Curves: Computing the Coefficients 本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完成相关 ...
- B-spline Curves 学习之B样条曲线性质(5)
B-spline Curves: Important Properties 本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完成相关的翻译学习. ...
- B-spline Curves 学习之B样条曲线定义(4)
B-spline Curves: Definition 本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完成相关的翻译学习. (原来博客网址:h ...
- B-spline Curves 学习之B样条基函数的定义与性质(2)
B-spline Basis Functions 本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完成相关的翻译学习. (原来博客网址:http ...
- B-spline Curves 学习之B样条曲线的导数(8)
Derivatives of a B-spline Curve 本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完成相关的翻译学习. (原来博客 ...
随机推荐
- BZOJ1120 : [POI2009]STR
因为问题的对称性,只需要考虑求出有多少点离$A$更近即可. 枚举$4$个绝对值的正负号,可以解出坐标范围. 若可以转化为二维数点,则可以统一扫描线+树状数组解决. 否则是三维数点,按一维排序,剩下两维 ...
- linux 用户管理
linux 用户管理 创建一个用户 foo 这个用户只能在/home/foo 上面增加删除文件, foo 不能在其他目录加减文件 useradd -d /home/foo -m foo [root@] ...
- 在VS2012下静态链接MFC的问题
1>------ 已启动生成: 项目: MFCApplication1, 配置: Debug Win32 ------1>uafxcwd.lib(afxctrlcontainer2.obj ...
- Smack4.1注册新用户
更新了smack4.1后,发现之前的注册表单不能使用了,很多属性都不能使用. 发现4.1把帐号的出来都集中到 org.jivesoftware.smackx.iqregister.AccountMan ...
- Search a 2D Matrix
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...
- Android 怎么退出整个应用程序?
方法一: 我们在写android应用程序时,经常会遇到想退出当前Acitivity,或者直接退出应用程序.我之前的一般操作是按返回键,或者直接按home键直接返回,其实这两种操作都没有关闭当前应用程序 ...
- vue-cli 组件的使用
开始项目之前,先了解如何创建项目: http://www.cnblogs.com/pearl07/p/6247389.html 1,项目目录结构(路由是后来建的,将在下一篇使用路由,此处可忽略). 2 ...
- HDU1401 BFS
Solitaire Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- Allegro之无法保存(提示和用户有关或者和lock有关)
使用中无意出现此情况 无奈重新打开文件时发现brd文件下面有个.brd.lck文件,顺手删掉,回复正常~ 此为bug解bug,具体方法下次遇到再仔细研究是为什么~ 养成隔几分钟手动保存的好习惯,防止b ...
- 使用C#和Excel进行报表开发(三)-生成统计图(Chart)
有的Web项目选用Excel作为报表方案,在服务器端生成Excel文件,然后传送到客户端,由客户端进行打印.在国内的环境下,相对PDF方式,Excel的安装率应该比pdf阅读器的安装率要高,同时,微软 ...