天天看点

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

B-Spline Basis Functions

摘要Abstract:直接根据B样条的Cox-deBoor递推定义写出计算B样条基函数的程序,并将计算结果在OpenSceneGraph中显示。

关键字Key Words:B Spline Basis Functions、OpenSceneGraph

一、概述Overview

有很多方法可以用来定义B样条基函数以及证明它的一些重要性质。例如,可以采用截尾幂函数的差商定义,开花定义,以及由de Boor和Cox等人提出的递推公式等来定义。我们这里采用的是递推定义方法,因为这种方法在计算机实现中是最有效的。

令U={u0,u1,…,um}是一个单调不减的实数序列,即ui<=ui+1,i=0,1,…,m-1。其中,ui称为节点,U称为节点矢量,用Ni,p(u)表示第i个p次B样条基函数,其定义为:

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

B样条基有如下性质:

a) 递推性;

b) 局部支承性;

c) 规范性;

d) 可微性;

二、程序 Codes

直接根据B样条基函数的Cox-deBoor递推定义,写出计算B样条基函数的程序如下:

头文件BSplineBasisFunction.h:

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

#ifndef _BSPLINEBASISFUNCTION_H_

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

#define_BSPLINEBASISFUNCTION_H_

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

#include

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

classBSplineBasisFunction

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

{

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

public:

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    BSplineBasisFunction(conststd::vector&U);

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

~BSplineBasisFunction(void);

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

public:

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

intFindSpan(doubleu);

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

doubleEvalBasis(inti,intp,doubleu);

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

intGetKnotVectorSize(void)const;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

doubleGetKnot(inti)const;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

private:

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    std::vectormKnotVector;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

};

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

#endif//_BSPLINEBASISFUNCTION_H_

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

实现文件BSplineBasisFunction.cpp:

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

#include"BSplineBasisFunction.h"

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

BSplineBasisFunction::BSplineBasisFunction(conststd::vector&U )

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    :mKnotVector(U)

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

{

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

}

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

BSplineBasisFunction::~BSplineBasisFunction(void)

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

{

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

}

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

intBSplineBasisFunction::GetKnotVectorSize(void)const

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

{

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

returnstatic_cast(mKnotVector.size());

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

}

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

doubleBSplineBasisFunction::GetKnot(inti )const

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

{

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

returnmKnotVector[i];

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

}

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

intBSplineBasisFunction::FindSpan(doubleu )

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

{

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

intiSize=static_cast(mKnotVector.size());

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

if(u>=mKnotVector[iSize-1])

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

{

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

returniSize;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    }

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

intiLow=0;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

intiHigh=iSize;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

intiMiddle=(iLow+iHigh)/2;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

while(umKnotVector[iMiddle+1])

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

{

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

if(u

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

{

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

            iHigh=iMiddle;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

        }

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

else

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

{

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

            iLow=iMiddle;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

        }

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

        iMiddle=(iLow+iHigh)/2;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    }

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

returniMiddle;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

}

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

doubleBSplineBasisFunction::EvalBasis(inti,intp,doubleu )

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

{

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

if((i+p+1)>=GetKnotVectorSize())

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

{

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

return0;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    }

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

if(0==p)

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

{

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

if(u>=mKnotVector[i]&&u

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

{

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

return1;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

        }

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

else

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

{

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

return0;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

        }

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    }

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

doubledLeftUpper=u-mKnotVector[i];

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

doubledLeftLower=mKnotVector[i+p]-mKnotVector[i];

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

doubledLeftValue=0;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

doubledRightUpper=mKnotVector[i+p+1]-u;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

doubledRightLower=mKnotVector[i+p+1]-mKnotVector[i+1];

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

doubledRightValue=0;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

if(dLeftUpper!=0&&dLeftLower!=0)

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

{

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

        dLeftValue=(dLeftUpper/dLeftLower)*EvalBasis(i, p-1, u);

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    }

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

if(dRightUpper!=0&&dRightLower!=0)

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

{

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

        dRightValue=(dRightUpper/dRightLower)*EvalBasis(i+1, p-1, u);

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    }

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

return(dLeftValue+dRightValue);

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

}

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

主函数:

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

#include

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

#include

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

#include

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

#include

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

#include"BSplineBasisFunction.h"

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

#pragma comment(lib,"osgd.lib")

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

#pragma comment(lib,"osgDBd.lib")

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

#pragma comment(lib,"osgGAd.lib")

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

#pragma comment(lib,"osgViewerd.lib")

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

osg::Node*MakeBasisFuncLine(BSplineBasisFunction&bf,inti,intp)

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

{

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

//The property basis functions.

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

intiLen=bf.GetKnotVectorSize();

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

intiStep=800;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

doubledStart=bf.GetKnot(0);

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

doubledEnd=bf.GetKnot(iLen-1);

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

doubledDelta=(dEnd-dStart)/iStep;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

doubleu=0;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

doublev=0;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

//Create the Geode (Geometry Node) to contain all our osg::Geometry objects.

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

osg::Geode*geode=newosg::Geode;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

//Create Geometry object to store all the vertices and lines primitive.

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

osg::ref_ptr<:geometry>linesGeom=newosg::Geometry;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

//Set the vertex array to the points geometry object.

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

osg::ref_ptr<:vec3array>pointsVec=newosg::Vec3Array;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

for(ints=0; s<=iStep; s++)

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

{

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

        u=s*dDelta;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

        v=bf.EvalBasis(i, p, u);

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

if(v!=0)

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

{

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

            pointsVec->push_back(osg::Vec3(u,0, v));

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

        }

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    }

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    linesGeom->setVertexArray(pointsVec);

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

//Set the colors.

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

osg::ref_ptr<:vec4array>colors=newosg::Vec4Array;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    colors->push_back(osg::Vec4(1.0f,1.0f,0.0f,0.0f));

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    linesGeom->setColorArray(colors.get());

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    linesGeom->setColorBinding(osg::Geometry::BIND_OVERALL);

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

//Set the normal in the same way of color.

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

osg::ref_ptr<:vec3array>normals=newosg::Vec3Array;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    normals->push_back(osg::Vec3(0.0f,-1.0f,0.0f));

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    linesGeom->setNormalArray(normals.get());

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    linesGeom->setNormalBinding(osg::Geometry::BIND_OVERALL);

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

//Add the points geometry to the geode.

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

linesGeom->addPrimitiveSet(newosg::DrawArrays(osg::PrimitiveSet::LINE_STRIP,0, pointsVec->size()));

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    geode->addDrawable(linesGeom.get());

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

returngeode;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

}

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

osg::Node*CreateScene(void)

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

{

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    osg::Group*root=newosg::Group;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

//Knot vector: U={0,0,0,1,2,3,4,4,5,5,5}.

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

std::vectorknotVector;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    knotVector.push_back(0);

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    knotVector.push_back(0);

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    knotVector.push_back(0);

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    knotVector.push_back(1);

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    knotVector.push_back(2);

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    knotVector.push_back(3);

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    knotVector.push_back(4);

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    knotVector.push_back(4);

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    knotVector.push_back(5);

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    knotVector.push_back(5);

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    knotVector.push_back(5);

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    BSplineBasisFunction basisFunc(knotVector);

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

for(inti=0; i

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

{

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

//

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

//root->addChild(MakeBasisFuncLine(basisFunc, i, 1));

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

//

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

root->addChild(MakeBasisFuncLine(basisFunc, i,2));

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    }

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

returnroot;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

}

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

intmain(intargc,char*argv[])

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

{

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    osgViewer::Viewer viewer;

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    viewer.setSceneData(CreateScene());

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    viewer.addEventHandler(newosgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()));

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    viewer.addEventHandler(newosgViewer::StatsHandler);

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

    viewer.addEventHandler(newosgViewer::WindowSizeHandler);

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions
matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

returnviewer.run();

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

}

若想显示出所有次数的B样条基函数,只需要在CreateScene中添加就好了。

以《The NURBS Book》中的例子2.2,节点矢量U={0, 0, 0, 1, 2, 3, 4, 4, 5, 5, 5},次数p=2,分别将程序计算的一次、二次B样条基函数的结果列出,如下图所示:

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

图1. 一次B样条基函数

matlab b样条的 coefs,B样条基函数——B-Spline Basis Functions

图2. 二次B样条基函数

本来还想将不同的B样条基函数以不同的颜色显示,试了几次,都没有成功。若以不同的颜色显示,会更直观。若你有设置颜色的方法,欢迎告诉我,[email protected]。

三、结论 Conclusion

程序计算结果与书中吻合,效果还不错。

理解了B样条的Cox-deBoor递推定义之后,可以将程序中的递归代码转换为非递归实现,这样就可以深入理解B样条基函数了。