节点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科学出版社
在之前的一些文章中有提到HostYun商家的信息,这个商家源头是比较老的,这两年有更换新的品牌域名。在陆续的有新增机房,价格上还是走的低价格路线,所以平时的折扣力度已经是比较低的。在前面我也有介绍到提供九折优惠,这个品牌商家就是走的低价量大为主。中秋节即将到,商家也有推出稍微更低的88折。全场88折优惠码:moon88这里,整理部分HostYun商家的套餐。所有的价格目前都是原价,我们需要用折扣码...
我们一般的站长或者企业服务器配置WEB环境会用到免费版本的宝塔面板。但是如果我们需要较多的付费插件扩展,或者是有需要企业功能应用的,短期来说我们可能选择按件按月付费的比较好,但是如果我们长期使用的话,有些网友认为选择宝塔面板企业版或者专业版是比较划算的。这样在年中大促618的时候,我们也可以看到宝塔面板也有发布促销活动。企业版年付899元,专业版永久授权1888元起步。对于有需要的网友来说,还是值...
艾云怎么样?艾云是一家去年年底成立的国人主机商家,商家主要销售基于KVM虚拟架构的VPS服务,机房目前有美国洛杉矶、圣何塞和英国伦敦,目前商家推出了一些年付特价套餐,性价比非常高,洛杉矶套餐低至85元每年,给500M带宽,可解奈飞,另外圣何塞也有特价机器;1核/1G/20G SSD/3T/2.5Gbps,有需要的朋友以入手。点击进入:艾云官方网站艾云vps促销套餐:KVM虚拟架构,自带20G的防御...
qq图片代码为你推荐
96155北京的住房公积金贷款不能打印还款凭证吗, 给96155打电话,他们说没这项业务,让问问贷款中心打开网页出现错误网页出现错误怎么解决?要最简单的那种申请证书一、如何申请证书?免费免费建站最好的免费建站小米手柄手机用小米手柄能玩什么游戏blogcnblogcn的博客可以搬家到哪些网站?网站地图制作我想给网站做网站地图不知道怎么做的,请教高手!首页无法修改主页不能修改怎么办小米什么时候抢购小米再一次抢购在什么时候?!熊猫直播频道熊猫TV直播平台主播有哪些
qq云存储 koss 网站保姆 服务器怎么绑定域名 元旦促销 日本bb瘦 宁波服务器 me空间社区 太原网通测速平台 购买国外空间 免费外链相册 starry 主机管理系统 百度云空间 双线空间 广东主机托管 国外代理服务器 葫芦机 亿库 发证机构 更多