节点qq图片代码
qq图片代码 时间:2021-02-26 阅读:(
)
B-SplineB-SplineB-SplineB-SplineCurveCurveCurveCurveLibraryLibraryLibraryLibraryininininOpenOpenOpenOpenCascadeCascadeCascadeCascadeB-SplineB-SplineB-SplineB-SplineCurveCurveCurveCurveLibraryLibraryLibraryLibraryininininOpenOpenOpenOpenCascadeCascadeCascadeCascadeOpenOpenOpenOpenCascadeCascadeCascadeCascade中的中的中的中的BBBB样条曲线库样条曲线库样条曲线库样条曲线库eryar@163163163163.
com摘要Abstract:简要介绍OpenCascade中的B样条曲线库BSplCLib的使用方法,并且结合源程序来对OpenCascade中的B样条曲线的组成部分如节点矢量、重复度等概念进行介绍,以及通过对计算B样条基函数的算法进行分析,加深对B样条曲线概念的理解.
关键字KeyWord:BSplineCurve、OpenCascade、KnotVector、Multiplicity一、概述Overview1919191946464646年由Schoenberg提出了B样条理论,给出了B样条的差分表达式;1972197219721972年deBoor和Cox分别独立给出了关于B样条的标准算法.
Gordon和Riesenfeld又把B样条理论用于形状描述,最终提出了B样条方法.
用B样条基替代了Bernstein基,构造出B样条曲线,这种方法继承了Bezier方法的一切优点,克服了Bezier方法存在的缺点,较成功地解决了局部控制问题,又轻而易举地在参数连续性基础上解决了连接问题,从而使自由曲线曲面形状的描述问题得到较好解决.
p次B样条曲线的定义为:∑==n0iip,iP)u(N)u(C其中:Pi是控制顶点(controlpoint);Ni,p(u)是定义在非周期节点矢量上的p次B样条基函数;有很多方法可以用来定义B样条基函数以及证明它的一些重要性质.
例如,可以采用截尾幂函数的差商定义,开花定义,以及由deBoor和Cox等人提出的递推公式等来定义.
我们这里采用的是递推定义方法,因为这种方法在计算机实现中是最有效的.
令U={u0000,u1111,…,um}是一个单调不减的实数序列,即uiandmustbeKnotsLength(KnotSequence,Periodic).
voidBSplCLib::Knots(constTColStd_Array1111OfReal&SeqKnots,TColStd_Array1111OfReal&knots,TColStd_Array1111OfInteger&mult,//constStandard_BooleanPeriodic)constStandard_Boolean){Standard_Realval=SeqKnots(1111);Standard_Integerkk=1111;knots(kk)=val;mult(kk)=1111;for(Standard_Integerjj=2222;jj==+,,1,0,01准均匀B样曲线(quasi-uniformB-Splinecurve):其节点序列中两端节点具有重复度k+1111,而所有内节点均匀分布,具有重复度1111.
分段Bezier曲线(piecewiseBeziercurve):其节点序列中两端节点重复度与准均匀B样条曲线的相同,所不同的是所有内节点重复度为k.
非均匀B样条曲线(generalnon-uniformB-Splinecurve):这是对任意分布的节点序列,只要在数学上成立,即节点序列非递减,都可取.
在基础类模块(ModuleFoundationClasses)的工具箱(ToolkitTKMath)中的包(GeomAbs)中有对B样样条曲线类型的定义,源程序如下所示://!
Thisenumerationisusedtonotespecificcurveform.
enumGeomAbs_BSplKnotDistribution{GeomAbs_NonUniform,GeomAbs_Uniform,GeomAbs_QuasiUniform,GeomAbs_PiecewiseBezier};而类BSplCLib主要是用来管理节点和重复度的,所有将节点和重复度也进行了分类.
根据节点矢量是否均匀分布,将节点分配方式(KnotDistribution)分为:均匀(BSplCLib_Uniform)和非均匀(BSplCLib_NonUniform).
源程序如下所示:enumBSplCLib_KnotDistribution{BSplCLib_NonUniform,BSplCLib_Uniform};根据重复度数组将重复度的分配方式分为如下三种类型:BSplCLib_Constant:重复度都相同;BSplCLib_QuasiConstant:首、尾节点的重复度与内部节点的重复度不同;BSplClib_NonConstant:其它情况;源程序如下所示:enumBSplCLib_MultDistribution{BSplCLib_NonConstant,BSplCLib_Constant,BSplCLib_QuasiConstant};判断节点矢量和重复度矢量类型分别由下列函数实现:B-SplineB-SplineB-SplineB-SplineCurveCurveCurveCurveLibraryLibraryLibraryLibraryininininOpenOpenOpenOpenCascadeCascadeCascadeCascadeBSplCLib::KnotForm();BSplCLib::MultForm();具体的判断方法可以查看源程序.
将节点分布方式与重复度的分布方式进行组合,可以得出B样条曲线的那几种类型.
B-SplineB-SplineB-SplineB-SplineCurveCurveCurveCurveLibraryLibraryLibraryLibraryininininOpenOpenOpenOpenCascadeCascadeCascadeCascade五、B样条基函数的计算EvaluatetheB-SplineBasisB样条基函数的计算主要使用了B样条基了函数的递推公式(Cox-deBoor公式)的局部支撑性质,如下所示:)u(Nuuuu)u(Nuuuu)u(N0uuu1)u(N1p,1i1i1pi1pi1p,iipiip,i1ii0,i+++++++++=0000时,Ni,p(u)是两个p-1111次基函数的线性组合;计算一组基函数需要事先指定节点矢量U和次数p;半开区间[ui,ui+1111)称为第i个节点区间(knotspan),它的长度可以为零,因为相邻节点可以是相同的;计算p次基函数的过程可以生成一个如下形式的三角形陈列:4,03,12,23,01,32,11,22,00,31,10,21,00,10,0NNNNNNNNNNNNNNB样条有局部支撑性,即若u不在区间[ui,ui+p+1111),则Ni,p(u)=0000.
可从下面的三角形中看出N1111,3333是N1111,0000、N2222,0000、N3333,0000和N4444,0000的线性组合,而N1111,0000在区间[u1111,u2222)上非零,N2222,0000在区间[u2222,u3333)上非零,N3333,0000在区间[u3333,u4444)上非零,N4444,0000在区间[u4444,u5555)上非零,所以N1111,3333仅在区间[u1111,u5555)上非零.
在任意给定的节点区间[uj,uj+1111)内,最多有p+1111个是非零的,它们是Nj-p,p、Nj-p+1111、…、Nj,p.
例如,在[u3333,u4444)上,零次基函数中只有N3333,0000是非零的,一次基函数只有N2222,1111和N3333,1111是非零的,非零的三次基函数只有N0000,3333、N1111,3333、N2222,3333、N3333,3333.
这个性质如下图所示:B-SplineB-SplineB-SplineB-SplineCurveCurveCurveCurveLibraryLibraryLibraryLibraryininininOpenOpenOpenOpenCascadeCascadeCascadeCascade上面两幅图中右边的图中所示的推算过程表明,给定节点序列U及B样条曲线的次数p,给出任意一个u值,找出其所在的节点区间[ui,ui+1111)上,最多有Ni-p,p,Ni-p+1111,p,…,Ni,p个非零的基函数.
例如我们根据递推公式写出二次基函数的一般形式,如下所示:当给定的u值在区间[u3333,u4444)上即(i=3333)时,根据上面的三角形,得出下列重要结论:0)()(0)()(0)()(1,41,131,11,231,11,2======++uNuNuNuNuNuNii即这两项不需要计算.
另外一个重要结论就是图中用相同颜色框中的部分是相同的,也就是下面程序中的变量temp表示的内容.
我们引入下面符号:B-SplineB-SplineB-SplineB-SplineCurveCurveCurveCurveLibraryLibraryLibraryLibraryininininOpenOpenOpenOpenCascadeCascadeCascadeCascade由二次基函数推出的三个公式可写为:上述推导过程为《TheNURBSBook》中的算法,算法代码如下所示:理解了变量temp的意义之后,整个程序就很好理解了.
将OpenCascade中计算基函数的算法是不同的,将其源程序摘抄如下所示://function:BuildBSplineMatrixB-SplineB-SplineB-SplineB-SplineCurveCurveCurveCurveLibraryLibraryLibraryLibraryininininOpenOpenOpenOpenCascadeCascadeCascadeCascade//purpose:BuildstheBsplineMatrixStandard_IntegerBSplCLib::EvalBsplineBasis//(constStandard_IntegerSide,//=1rigthside,-1leftside(constStandard_Integer,//=1rigthside,-1leftsideconstStandard_IntegerDerivativeRequest,constStandard_IntegerOrder,constTColStd_Array1OfReal&FlatKnots,constStandard_RealParameter,Standard_Integer&FirstNonZeroBsplineIndex,math_Matrix&BsplineBasis){//thematrixmusthaveatleastDerivativeRequest+1//rowandOrdercolumns//theresultarestoredinthefollowingwayin//theBsplinematrix//LetibetheFirstNonZeroBsplineIndexand//tbetheparametervalue,ktheorderofthe//knotvector,rtheDerivativeRequest:////B(t)B(t)B(t)//ii+1i+k-1////(1)(1)(1)//B(t)B(t)B(t)//ii+1i+k-1//////////(r)(r)(r)//B(t)B(t)B(t)//ii+1i+k-1//Standard_IntegerReturnCode,ii,pp,qq,ss,NumPoles,LocalRequest;//,Index;B-SplineB-SplineB-SplineB-SplineCurveCurveCurveCurveLibraryLibraryLibraryLibraryininininOpenOpenOpenOpenCascadeCascadeCascadeCascadeStandard_RealNewParameter,Inverse,Factor,LocalInverse,Saved;//,*FlatKnotsArray;ReturnCode=0;FirstNonZeroBsplineIndex=0;LocalRequest=DerivativeRequest;if(DerivativeRequest>=Order){LocalRequest=Order-1;}if(BsplineBasis.
LowerCol()!
=1||BsplineBasis.
UpperCol()=Order){LocalRequest=Order-1;}for(qq=2;qq=Order){LocalRequest=Order-1;}对B样条基数计算结果矩阵BsplineBasis存储空间进行检查.
若存储空间不足,则会退出,程序代码如下所示:if(BsplineBasis.
LowerCol()!
=1||BsplineBasis.
UpperCol()px[Ihi]){Ilc=Ihi+1;return;}Standard_IntegerIm;while(Ihi-Ilc!
=1){Im=(Ihi+Ilc)>>1;if(X>px[Im])Ilc=Im;elseIhi=Im;}}确定参数所在区间[ui,ui+1111)后,可得到第一个非零基函数的索引值为i-p;FirstNonZeroBsplineIndex=ii-Order+1;基函数计算的主要算法代码如下所示:BsplineBasis(1,1)=1.
0e0;for(qq=2;qq#include#include#include#include#pragmacomment(lib,"TKernel.
lib")#pragmacomment(lib,"TKMath.
lib")#pragmacomment(lib,"TKG2d.
lib")intmain(intargc,char*argv[]){//Knotvector:[0,0,0,1,2,3,4,4,5,5,5]TColStd_Array1OfRealknotSeq(1,11);knotSeq.
Init(0);knotSeq.
SetValue(1,0);knotSeq.
SetValue(2,0);knotSeq.
SetValue(3,0);knotSeq.
SetValue(4,1);knotSeq.
SetValue(5,2);knotSeq.
SetValue(6,3);knotSeq.
SetValue(7,4);knotSeq.
SetValue(8,4);B-SplineB-SplineB-SplineB-SplineCurveCurveCurveCurveLibraryLibraryLibraryLibraryininininOpenOpenOpenOpenCascadeCascadeCascadeCascadeknotSeq.
SetValue(9,5);knotSeq.
SetValue(10,5);knotSeq.
SetValue(11,5);cout<<"KnotSequence:[";for(Standard_Integeri=1;i<=knotSeq.
Length();i++){cout<Value(i)<<"";}cout<<"]"<BSplCLib::Knots(knotSeq,knots,mults);cout<<"Knots:[";for(Standard_Integeri=1;i<=knots.
Length();i++){cout<Value(i)<<"";}cout<<"]"<Length();i++){cout<Value(i)<<"";}cout<<"]"<"<"<5;Standard_IntegeriOrder=2+1;Standard_IntegeriFirstNonZeroIndex=0;B-SplineB-SplineB-SplineB-SplineCurveCurveCurveCurveLibraryLibraryLibraryLibraryininininOpenOpenOpenOpenCascadeCascadeCascadeCascademath_MatrixbSplineBasis(1,1,1,iOrder,0);BSplCLib::EvalBsplineBasis(1,0,iOrder,knotSeq,rValue,iFirstNonZeroIndex,bSplineBasis);cout<<"FirstNon-ZeroBasisindex:"<程序输出为:KnotSequence:[00012344555]Knots:[012345]Multiplicity:[311123]Knotsisuniform.
FirstNon-ZeroBasisindex:3math_MatrixofRowNumber=1andColNumber=3math_Matrix(1,1)=0.
125math_Matrix(1,2)=0.
75math_Matrix(1,3)=0.
125Pressanykeytocontinue.
.
.
B-SplineB-SplineB-SplineB-SplineCurveCurveCurveCurveLibraryLibraryLibraryLibraryininininOpenOpenOpenOpenCascadeCascadeCascadeCascade七、结论Conclusion通过学习《TheNURBSBook》并给合OpenCascade的源程序,理论联系实际,使对NURBS的学习更轻松.
根据BBBB样条基的递推公式,B样条曲线的局部性是通过节点来具体实现的.
与Bezier曲线不同的就是增加了节点这个参数.
根据Cox-deBoor递推公式亲自推导出一次、二次、三次B样条基函数,可以加深对B样条曲线的理解.
计算给定节点矢量、次数及参数,计算参数所在区间上所有非零基函数算法的步骤为:通过二分法查找出参数所在的节点区间;根据B样条基的局部支撑性,计算出所在节点区间上所有非零基函数;八、致谢Acknowledgments感谢晓天的支持与鼓励.
九、参考文献Bibliography1.
赵罡,穆国旺,王拉柱译LesPiegl,WayneTillerTheNURBSBook(SecondEdition)2010201020102010清华大学出版社2.
莫容,常智勇计算机辅助几何造型技术2009200920092009科学出版社3.
王仁宏,李崇君,朱春钢计算几何教程2008200820082008科学出版社
百纵科技:美国高防服务器,洛杉矶C3机房 独家接入zenlayer清洗 带金盾硬防,CPU全系列E52670、E52680v3 DDR4内存 三星固态盘阵列!带宽接入了cn2/bgp线路,速度快,无需备案,非常适合国内外用户群体的外贸、搭建网站等用途。官方网站:https://www.baizon.cnC3机房,双程CN2线路,默认200G高防,3+1(高防IP),不限流量,季付送带宽美国洛杉矶C...
木木云怎么样?木木云品牌成立于18年,此为贵州木木云科技有限公司旗下新运营高端的服务器的平台,目前已上线美国中部大盘鸡,母鸡采用E5-267X系列,硬盘全部组成阵列。目前,木木云美国vps进行了优惠促销,1核1G/500M带宽/1T硬盘/4T流量,仅35元/月。点击进入:木木云官方网站地址木木云优惠码:提供了一个您专用的优惠码: yuntue目前我们有如下产品套餐:DV型 1H 1G 500M带宽...
ZJI原名维翔主机,是原来Wordpress圈知名主机商家,成立于2011年,2018年9月更名为ZJI,提供香港、日本、美国独立服务器(自营/数据中心直营)租用及VDS、虚拟主机空间、域名注册业务。ZJI今年全新上架了台湾CN2线路服务器,本月针对香港高主频服务器和台湾CN2服务器提供7折优惠码,其他机房及产品提供8折优惠码,优惠后台湾CN2线路E5服务器月付595元起。台湾一型CPU:Inte...
qq图片代码为你推荐
arm开发板新手入门应如何选择 ARM 开发板?镜像文件是什么什么是镜像文件啊奇虎论坛奇虎论坛最新推荐歌曲列表·idc前线永恒之塔内侧 删档吗 ?网页打开很慢为什么打开网页很慢去鼠标加速度去鼠标加速到底有什么好处.......怎么在图片上写文字如何在图片上写字?主板温度多少正常主板温度多少算正常?关闭qq相册图标如何关闭QQ相册的图标请客网飞宴网是做什么的
php空间租用 国外vps租用 域名备案流程 博客主机 163网 http500内部服务器错误 hnyd 卡巴斯基永久免费版 777te 云全民 工信部icp备案号 江苏双线服务器 网页提速 cxz 美国迈阿密 空间申请 七牛云存储 e-mail pptpvpn studentmain 更多