- 论坛徽章:
- 0
|
本帖最后由 osmanthusgfy 于 2012-07-24 21:40 编辑
这个问题自己解决了,和大家分享一下:
研究半天,仔细看了二次贝赛尔曲线的定义,以及它和一次/线性贝赛尔曲线之间的关系,
把这个问题测地搞明白了.
一次/线性贝赛尔曲线也就是我们常说的两点确定的一条直线,
先看一次/线性贝赛尔曲线函数表达式:
在此强调下,以上函数描述的就是一次/线性贝赛尔曲线上的点的与起点P0,终点P1和t的一个对应关系,
并且曲线上的点的x和y都满足这个对应关系.
二次贝塞尔曲线的声称算法的描述:
二次贝塞尔曲线,可以中介点Q0和Q1作为由0至1的t:
由P1至C的连续点Q0,描述一条线性贝塞尔曲线。
由C至P2的连续点Q1,描述一条线性贝塞尔曲线。
由Q0至Q1的连续点B(t),描述一条二次贝塞尔曲线。
所以,以上所说的中介点Q0和Q1就是我要求的控制点和终点.
二次贝赛尔曲线的函数表达式:
根据一次/线性贝赛尔曲线函数表达式很容易求出控制点和终点的坐标:
typedef struct Point
{
float x;
float y;
} Point;
Point p1 = ...; //起点
Point cp = ...; //初始的控制点
Point p2 = ...; //初始的终点
float t = 0;
float c1x; //将要求出的控制点的x
float c1y; //将要求出的控制点的y
float c2x; //将要求出的终点的x
float c2y; //将要求出的终点的y
float px; //二次贝赛尔曲线上的点的x
float py; //二次贝赛尔曲线上的点的y
while ( t < 1 ) {
/*
控制点是由起点和初始的控制点组成的一次/线性贝赛尔曲线上的点,
所以由一次/线性贝赛尔曲线函数表达式求出c1x,c1y
*/
c1x = p1.x + ( cp.x - p1.x ) * t;
c1y = p1.y + ( cp.y - p1.y ) * t;
/*
终点是由初始的控制点和初始的终点组成的一次/线性贝赛尔曲线上的点,
所以由一次/线性贝赛尔曲线函数表达式求出c2x,c2y
*/
c2x = cp.x + ( p2.x - cp.x ) * t;
c2y = cp.y + ( p2.y - cp.y ) * t;
/*
二次贝赛尔曲线上的点是由控制点和终点组成的一次/线性贝赛尔曲线上的点,
所以由一次/线性贝赛尔曲线函数表达式求出px,py
*/
px = c1x + ( c2x - c1x ) * t;
py = c1y + ( c2y - c1y ) * t;
t += 0.01f;
}
将c1x,c1y, c2x,c2y带入以上px,py计算式,,发现是满足二次贝赛尔曲线的函数表达式.
很难理解,但是只要搞清一次/线性贝赛尔曲线和二次贝赛尔曲线函数定义,也是非常简单的.
最后附上一篇很好的wiki:
http://zh.wikipedia.org/wiki/%E8 ... E%E6%9B%B2%E7%B7%9A
我是仔细看了这篇wiki才搞明白的.
|
|