曲线平滑-B样条曲线

3D空间曲线三次B样条平滑示例:

struct D_DOT3D //D_DOT3D示例,未完全实现  
{  
    double x,y,z;  
} 

double GetThreeBSplineValue(double p0, double p1, double p2, double p3, double t)
{
	double A0 = (p0 + 4*p1 + p2) / 6;
	double A1 = - (p0 - p2)/2;
	double A2 = (p0 - 2*p1 + p2) / 2;
	double A3 = - (p0 - 3*p1 + 3*p2 - p3)/6;
	return A0 + A1 * t + A2 * t*t + A3 * t*t*t;
}

D_DOT3D GetThreeBSplineValue(D_DOT3D p0, D_DOT3D p1, D_DOT3D p2, D_DOT3D p3 , double t)
{
	D_DOT3D dot;
	dot.x = GetThreeBSplineValue(p0.x, p1.x, p2.x, p3.x, t);
	dot.y = GetThreeBSplineValue(p0.y, p1.y, p2.y, p3.y, t);
	dot.z = GetThreeBSplineValue(p0.z, p1.z, p2.z, p3.z, t);

	return dot;
}

long ThreeBSplineCurve( vector<D_DOT3D> &line )
{
	if (line.size()<4)
		return 0;

	vector<D_DOT3D> vout;
	for (int i=0; i<line.size()-3; ++i)
	{
		D_DOT3D p0(line[i]);
		D_DOT3D p1(line[i+1]);
		D_DOT3D p2(line[i+2]);
		D_DOT3D p3(line[i+3]);
		if(0 == i)
		{
			D_DOT3D dot1 = GetThreeBSplineValue(p0, p1, p2, p3, 0.0);
			vout.push_back(dot1);
		}

		D_DOT3D dot2 = GetThreeBSplineValue(p0, p1, p2, p3, 1/3.0);
		D_DOT3D dot3 = GetThreeBSplineValue(p0, p1, p2, p3, 2/3.0);
		D_DOT3D dot4 = GetThreeBSplineValue(p0, p1, p2, p3, 1.0);

		vout.push_back(dot2);
		vout.push_back(dot3);
		vout.push_back(dot4);
	}

	line = vout;

	return 1;
}


  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值