免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 13984 | 回复: 5
打印 上一主题 下一主题

[算法] 求二次贝塞尔曲线的控制点和终点的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-24 14:30 |只看该作者 |倒序浏览
10可用积分
已知起点P1, 控制点C, 终点P2. 这三点确定一条二次贝塞尔曲线.

怎样求出这条二次贝塞尔曲线的所有的控制点和终点的坐标?

多谢!!!

论坛徽章:
0
2 [报告]
发表于 2012-07-24 21:40 |只看该作者
本帖最后由 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才搞明白的.

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
3 [报告]
发表于 2012-07-26 23:13 |只看该作者
看到LZ问的这个问题, 叔叔就知道最后回答这个问题的只有LZ自己...

论坛徽章:
0
4 [报告]
发表于 2012-07-26 23:19 |只看该作者
这尼玛看着一堆数学公式脑袋就犯晕

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
5 [报告]
发表于 2012-07-27 09:05 |只看该作者
谋事在人,成事在天;天者,二人也;故人不二者,万事难成矣!

论坛徽章:
0
6 [报告]
发表于 2012-07-28 15:27 |只看该作者
哥哥嫩是学数学的啊?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP