节点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科学出版社
外贸主机哪家好?抗投诉VPS哪家好?无视DMCA。ParkinHost今年还没有搞过促销,这次parkinhost俄罗斯机房上新服务器,母机采用2个E5-2680v3处理器、128G内存、RAID10硬盘、2Gbps上行线路。具体到VPS全部200Mbps带宽,除了最便宜的套餐限制流量之外,其他的全部是无限流量VPS。ParkinHost,成立于 2013 年,印度主机商,隶属于 DiggDigi...
标题【萤光云双十二 全场6折 15元/月 续费同价】今天站长给大家推荐一家国内云厂商的双十二活动。萤光云总部位于福建福州,其成立于2002 年。主打高防云服务器产品,主要提供福州、北京、上海 BGP 和香港 CN2 节点。萤光云的高防云服务器自带 50G 防御,适合高防建站、游戏高防等业务。这家厂商本次双十二算是性价比很高了。全线产品6折,上海 BGP 云服务器折扣更大 5.5 折(测试了一下是金...
提速啦(www.tisula.com)是赣州王成璟网络科技有限公司旗下云服务器品牌,目前拥有在籍员工40人左右,社保在籍员工30人+,是正规的国内拥有IDC ICP ISP CDN 云牌照资质商家,2018-2021年连续4年获得CTG机房顶级金牌代理商荣誉 2021年赣州市于都县创业大赛三等奖,2020年于都电子商务示范企业,2021年于都县电子商务融合推广大使。资源优势介绍:Ceranetwo...
qq图片代码为你推荐
weipin唯品宝是什么?和唯品金融有什么关系?安装程序配置服务器失败安装用友T3出现安装程序配置服务器失败是怎么回事vista系统重装Vista系统的重装的步骤,有系统恢复盘spgnux怎么安装思普操作系统邮箱打不开怎么办我的邮箱打不开怎么办自助建站什么情况下采用自助建站方式建站好?中小企业信息化中小企业信息化途径有哪些qq空间装扮qq空间的装扮空间在哪?ios系统ios系统有哪些版本?ios系统ios是什么意思 ios系统是什么
新网域名管理 wordpress技巧 哈喽图床 info域名 php探针 debian6 12306抢票助手 tna官网 南通服务器 电信虚拟主机 双12 web应用服务器 贵阳电信测速 深圳域名 学生服务器 攻击服务器 hostease 聚惠网 百度新闻源申请 rsync 更多