关闭

曲线平滑-贝塞尔曲线

4952人阅读 评论(1) 收藏 举报
分类:

Bézier curve(贝塞尔曲线)是应用于二维图形应用程序的数学曲线 曲线定义:起始点、终止点(也称锚点)、控制点。通过调整控制点,贝塞尔曲线的形状会发生变化。 1962年,法国数学家Pierre Bézier第一个研究了这种矢量绘制曲线的方法,并给出了详细的计算公式,因此按照这样的公式绘制出来的曲线就用他的姓氏来命名,称为贝塞尔曲线。 

以下公式中:B(t)t时间下 点的坐标;

 P0为起点,Pn为终点,Pi为控制点

一阶贝塞尔曲线(线段)


意义:由 P0 至 P1 的连续点, 描述的一条线段

 

二阶贝塞尔曲线(抛物线)



原理:由 P0 至 P1 的连续点 Q0,描述一条线段。 
      由 P1 至 P2 的连续点 Q1,描述一条线段。 
      由 Q0 至 Q1 的连续点 B(t),描述一条二次贝塞尔曲线。

 

经验:P1-P0为曲线在P0处的切线。

 

三阶贝塞尔曲线:




通用公式:

 

高阶贝塞尔曲线:

4阶曲线:


5阶曲线:

 

http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/Bezier/de-casteljau.html

三次贝塞尔曲线光滑示例:

struct D_DOT3D //D_DOT3D的主要参数,未完全实现
{
	double x,y,z;
}
double GetThreeBezierValue(double p0, double p1, double p2, double p3, double t)
{
	return pow(1-t,3.0) * p0 + 3*t*(1-t)*(1-t)*p1 + 3*t*t*(1-t)*p2 + t*t*t*p3;
}

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

	return dot;
}

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

	vector<D_DOT3D> vout;

	for (int i=0; i<line.size()-3; i += 3)
	{
		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 = GetThreeBezierValue(p0, p1, p2, p3, 0.);
			vout.push_back(dot1);
		}
		D_DOT3D dot2 = GetThreeBezierValue(p0, p1, p2, p3, 1/3.0);
		D_DOT3D dot3 = GetThreeBezierValue(p0, p1, p2, p3, 2/3.0);
		D_DOT3D dot4 = GetThreeBezierValue(p0, p1, p2, p3, 1.0);

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

	line = vout;
	return 1;
}


1
0
查看评论

平滑曲线连接各点(贝塞尔曲线)

void Widget::Bsaier() { polygon.clear(); for(int i = 0; i < 5; i++){ int y1,y2; float t = 0; for(int n = 0; n < ...
  • gaobobo138968
  • gaobobo138968
  • 2014-05-25 22:21
  • 1495

VC++三次样条插值&amp;贝塞尔曲线&amp;GDI+平滑曲线程序

  • 2009-02-05 14:38
  • 3.85MB
  • 下载

穿过已知点画平滑曲线(3次贝塞尔曲线)

为了把一串点连成光滑的曲线,先研究贝塞尔曲线,又搞B样条插值。。。。都没有成功(数学没那么强)。后来在 “[翻译] AGG 之贝塞尔插值 ”http://liyiwen.javaeye.com/blog/705489  。看到一种比较好的方法:运用贝塞尔曲线的光滑性来穿过这些点。大致思...
  • microchenhong
  • microchenhong
  • 2011-04-11 18:59
  • 30622

穿过已知点画平滑曲线(3次贝塞尔曲线)

http://blog.csdn.net/microchenhong/article/details/6316332 为了把一串点连成光滑的曲线,先研究贝塞尔曲线,又搞B样条插值。。。。都没有成功(数学没那么强)。 后来在 “[翻译] AGG 之贝塞尔插值 ”http...
  • OnafioO
  • OnafioO
  • 2016-09-08 19:15
  • 2364

原迹手写之贝赛尔曲线(穿过已知点画平滑曲线(3次贝塞尔曲线)

为了把一串点连成光滑的曲线,先研究贝塞尔曲线,又搞B样条插值。。。。都没有成功(数学没那么强)。 后来在 “[翻译] AGG 之贝塞尔插值 ”http://liyiwen.javaeye.com/blog/705489  。看到一种比较好的方法: 运用贝塞尔曲线的...
  • sky_pjf
  • sky_pjf
  • 2016-10-14 16:11
  • 2341

[贝塞尔曲线(Bezier Curves) 2d实现]

如有转载,请注明: http://www.azure.com.cn/ 回忆下绘制直线的过程, 它是个从起点运动到终点的过程, 这里我们就需要用到线性插值算法. 线性插值的伪代码如下: Linear Interpolation procedure draw...
  • pizi0475
  • pizi0475
  • 2013-10-20 12:29
  • 1585

贝塞尔曲线拟合原理

1.什么是贝塞尔曲线? 贝塞尔曲线所依据的最原始的数学公式,是早在1912年就广为人知的伯恩斯坦多项式。简单来说,伯恩斯坦多项式可以用来证明,在[ a, b ] 区间上所有的连续函数都可以用多项式来逼近,并且收敛性很强,也就是一致收敛。再简单点,就是一个连续函数,你可以将它写成若干个伯恩斯坦多项式相...
  • shenziheng1
  • shenziheng1
  • 2017-01-13 18:07
  • 1985

OpenGL--贝塞尔曲线或曲面

理论基础 贝塞尔曲线和曲面:OpenGL只能直接绘制基本图元,对于曲线和曲面我们一般采用一系列线段或多边形来模拟的,这样当线段或多边形增多时必定很耗性能。其实对于这种曲线和曲面,我们可以使用一些控制点,通过求值器程序先计算出坐标等信息,然后直接用这些数据绘制,这样不仅节省内存,还提高了模拟曲线或曲...
  • u010223072
  • u010223072
  • 2015-04-29 10:32
  • 4417

demo06_直播效果贝塞尔曲线

  • 2017-04-27 16:15
  • 263KB
  • 下载

关于贝塞尔曲线画特殊线条的总结

#import "MyView.h" #define UMColor(R,G,B) [UIColor colorWithRed:R/255.f green:G/255.f blue:B/255.f alpha:1.] #define UMWidth [UIScreen main...
  • ZhongLv_HoneyMoon
  • ZhongLv_HoneyMoon
  • 2016-04-02 09:49
  • 780
    个人资料
    • 访问:135535次
    • 积分:1869
    • 等级:
    • 排名:千里之外
    • 原创:43篇
    • 转载:58篇
    • 译文:0篇
    • 评论:10条
    最新评论