永发信息网

谁能给我一个c++下的n次B样条曲线的程序?

答案:1  悬赏:0  手机版
解决时间 2021-01-25 07:52
一定是要n次的!
最佳答案
基本思路:

namespace sp//样条曲线曲面域名空间
{
static double eps=1.0e-8;//精度

//设定精度
void SetEps(double Eps)
{
if(Eps <0.1) return;
eps=Eps;
}

//获取精度
double GetEps()
{
return eps;
}

inline int MBiger(double a,double b)//判断a的绝对值是否比b大
{
return a> b||a <-b;
}

// k次规范B样条基函数
double N(int i,int k,double su[],double u)
{
if(k==0)
{
if(u-su[0] {
if(i==0)
return 1.0;
else
return 0.0;
}
if(u> =su[i]&&u else return 0.0;
}
else if(k> 0)
{
if(MBiger(su[i+k]-su[i],eps)&&MBiger(su[i+k+1]-su[i+1],eps))
{
return (u-su[i])*N(i,k-1,su,u)/(su[i+k]-su[i])
+(su[i+k+1]-u)*N(i+1,k-1,su,u)/(su[i+k+1]-su[i+1]);
}
else if(!MBiger(su[i+k]-su[i],eps)&&MBiger(su[i+k+1]-su[i+1],eps))
{
return (su[i+k+1]-u)*N(i+1,k-1,su,u)/(su[i+k+1]-su[i+1]);
}
else if(MBiger(su[i+k]-su[i],eps)&&!MBiger(su[i+k+1]-su[i+1],eps))
{
return (u-su[i])*N(i,k-1,su,u)/(su[i+k]-su[i]);
}
else return 0.0;
}
else return 0.0;
}

//B样条曲线
double BSL1(int k,double su[],double d[],int n,double u)
{
int i;
double s=0.0;
for(i=0;i return s;
}

//德布尔算法计算B样条曲线
inline double alpha(int l,int j,int k,double su[],double u)
{
if(su[j+k+1-l]-su[j] -eps) return 0.0;
return (u-su[j])/(su[j+k+1-l]-su[j]);
}
double d1(int l,int j,int k,double su[],double d[],double u)
{
if(l <=0) return d[j];
double a=alpha(l,j,k,su,u);
return (1-a)*d1(l-1,j-1,k,su,d,u)+a*d1(l-1,j,k,su,d,u);
}
double BSL(int k,double su[],double d[],int n,double u)
{
int i;
for(i=1;i {
if(u if(i> k&&u==su[i]) break;
}
i--;
return d1(k,i,k,su,d,u);
}
//德布尔算法计算B样条曲线的导矢
double d2(int l,int j,int k,double su[],double d[],double u)
{
if(l <=0) return d[j];
double z=su[j+k+1-l]-su[j];
if(z -eps) return 0.0;
return (k+1-l)*(d2(l-1,j,k,su,d,u)-d2(l-1,j-1,k,su,d,u))/z;
}
double GetDerValue(int k,double su[],double d[],int n,int r,double u)
{
int i,j;
double s=0.0;
for(i=1;i {
if(u if(i> k&&u==su[i]) break;
}
i--;
for(j=i-k+r;j <=i;j++)
{
s+=d2(r,j,k,su,d,u)*N(j,k-r,su,u);
}
return s;
}
////////////////////////////////////////////////////////////////////////////////////////////
//B样条曲面
double BSS(int k,double su[],int l,double sv[],double **d,int m,double u,int n,double v)
{
int i,j;
double s=0.0;
for(i=0;i for(j=0;j return s;
}

//NURBS曲线
double NURBSL(int k,double su[],double d[],double w[],int n,double u)
{
int i,t=k;
double s1=0.0,s2=0.0,wN;
for(i=0;i {
if(u <=su[i])
{
t=i-1;
break;
}
}
if(t for(i=t-k;i <=t;i++)
{
wN=w[i]*N(i,k,su,u);
s1=s1+d[i]*wN;
s2=s2+wN;
}
if(s2> eps||s2 <-eps) return s1/s2;
else return 0.0;
}

//NURBS曲面
double NURBSS(int k,double su[],int l,double sv[],double **d,double **w,int m,double u,int n,double v)
{
int i,j,tu=k,tv=l;
double s1=0.0,s2=0.0,wN;
for(i=0;i {
if(u <=su[i])
{
tu=i-1;
break;
}
}
for(j=0;j {
if(v <=sv[j])
{
tv=j-1;
break;
}
}
if(tu if(tv for(i=tu-k;i <=tu;i++)
{
for(j=tv-l;j <=tv;j++)
{
wN=w[i][j]*sp::N(i,k,su,u)*N(j,l,sv,v);
s1=s1+d[i][j]*wN;
s2=s2+wN;
}
}
if(s2> eps||s2 <-eps) return s1/s2;
else return 0.0;
}

//均匀B样条曲线
double UBSL(int k,double d[],int n,double u)
{
double s,*su=new double[n+k+1];
int i;
for(i=0;i s=BSL(k,su,d,n,u);
delete []su;
return s;
}

//准均匀B样条曲线
double QUBSL(int k,double d[],int n,double u)
{
double s,*su=new double[n+k+1];
int i;
for(i=0;i for(i=k;i <=n;i++) su[i]=double(i-k)/(n-k);
for(i=n+1;i s=BSL(k,su,d,n,u);
delete []su;
return s;
}

//均匀B样条曲面
double UBSS(int k,int l,double **d,int m,double u,int n,double v)
{
double s,*su=new double[m+k+1],*sv=new double[n+l+1];
int i;
for(i=0;i for(i=0;i s=BSS(k,su,l,sv,d,m,u,n,v);
delete []su;
delete []sv;
return s;
}

//准均匀B样条曲面
double QUBSS(int k,int l,double **d,int m,double u,int n,double v)
{
double s,*su=new double[m+k+1],*sv=new double[n+l+1];
int i;
for(i=0;i for(i=k;i <=m;i++) su[i]=double(i-k)/(m-k);
for(i=m+1;i
for(i=0;i for(i=l;i <=n;i++) sv[i]=double(i-l)/(n-l);
for(i=n+1;i
s=BSS(k,su,l,sv,d,m,u,n,v);
delete []su;
delete []sv;
return s;
}
//非均匀三次B样条Riesenfeld方法
void RiBSL(double *dx,double *dy,int n,double u,double *x,double *y)
{
int i;
double *su=new double[n+3];
double *l=new double[n];
double L=0.0,l1;
l[0]=0.0;
for(i=1;i {
l[i]=sqrt(pow2(dx[i]-dx[i-1])+pow2(dy[i]-dy[i-1]));
L=L+l[i];
}
su[0]=su[1]=su[2]=su[3]=0;
l1=l[1];
for(i=4;i {
l1=l1+l[i-2];
su[i]=l1/L;
}
su[n]=su[n+1]=su[n+2]=su[n-1]=1;
*x=BSL(3,su,dx,n,u);
*y=BSL(3,su,dy,n,u);
delete []su;
delete []l;
}
}

你有n次的一定要告诉我,给我留言
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
汕头市哪个区的大工厂最多???
巨鹿县王虎寨镇中学地址在什么地方,想过去办
森咖啡怎么去啊,我要去那办事
WAR3里 自爆蝙蝠自爆前喊的那句话是什么?
跪求英文歌曲男声歌词高潮部分好像是i want t
“有什么比石头更硬?有什么比谁更软?坚持不
装网线需要具备哪些知识,我想了解一下,谢谢各
怎样能让头发变厚变密??
怎么样开启国行的facetime audio功能
离婚后一方去世财产怎样分割,
如何养生,才能一直健康到老
巨鹿县张王疃乡中地址好找么,我有些事要过去
开福区长沙紫凤社区公共服务中心地址在哪里啊
巨鹿县堤村乡中学怎么去啊,我要去那办事
微信密码突然不对了
推荐资讯
【化学实验设备】化学试验设备有哪些?
合伙企业的名称
便利店有权收快递费吗
英德英青汽车特约经销商地址在哪,我要去那里
怎样和一个初恋的女孩发短信??
恩格思说:“当革命风暴横扫整个法国的时候,
小龙cf单机版怎么进不了
陕西华山景区和仙峪景区冬天的景色怎么样?绿
被除数610,商23,余数12,求除数
【prison】prison的用法什么时候加the什么时
边缘地带地址有知道的么?有点事想过去
中国工商银行ATM取款机(254省道)怎么去啊,我
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?