Bezier曲线的原理

Bezier曲线是应用于二维图形的曲线。曲线由顶点和控制点组成,通过改变控制点坐标可以改变曲线的形状。

一次Bezier曲线公式:

一次Bezier曲线是由P0至P1的连续点,描述的一条线段

二次Bezier曲线公式:

二次Bezier曲线是 P0至P1 的连续点Q0和P1至P2 的连续点Q1 组成的线段上的连续点B(t),描述一条抛物线。

三次Bezier曲线公式:

二次Bezier曲线的实现

#include <vector>

class CBezierCurve
{
public:
CBezierCurve();
~CBezierCurve(); void SetCtrlPoint(POINT& stPt); bool CreateCurve(); void Draw(CDC* pDC); private:
// 主要算法,计算曲线各个点坐标
void CalCurvePoint(float t, POINT& stPt); private:
// 顶点和控制点数组
std::vector<POINT> m_vecCtrlPt;
// 曲线上各点坐标数组
std::vector<POINT> m_vecCurvePt;
};
    #include <math.h>
#include "BezierCurve.h" CBezierCurve::CBezierCurve()
{
} CBezierCurve::~CBezierCurve()
{
} void CBezierCurve::SetCtrlPoint(POINT& stPt)
{
m_vecCtrlPt.push_back(stPt);
} void CBezierCurve::CreateCurve()
{
// 确保是二次曲线,2个顶点一个控制点
assert(m_vecCtrlPt.size() == ); // t的增量, 可以通过setp大小确定需要保存的曲线上点的个数
float step = 0.01;
for (float t = 0.0; t <= 1.0; t += step)
{
POINT stPt;
CalCurvePoint(t, stPt);
m_vecCurvePt.push_back(stPt);
}
} void CBezierCurve::Draw(CDC* pDC)
{
// 画出曲线上个点,若不连续可以用直线连接各点
int nCount = m_vecCurvePt.size();
for (int i = ; i < nCount; ++i)
{
pDC->SetPixel(m_vecCurvePt[i], 0x000000);
}
} void CBezierCurve::CalCurvePoint(float t, POINT& stPt)
{
// 确保是二次曲线,2个顶点一个控制点
assert(m_vecCtrlPt.size() == ); // 计算曲线点坐标,此为2次算法,改变此处可以实现多次曲线
float x = (float)m_vecCtrlPt[].x * pow( - t, ) +
(float)m_vecCtrlPt[].x * t * ( - t) * +
(float)m_vecCtrlPt[].x * pow(t, );
float y = (float)m_vecCtrlPt[].y * pow( - t, ) +
(float)m_vecCtrlPt[].y * t * ( - t) * +
(float)m_vecCtrlPt[].y * pow(t, );
stPt.x =x;
stPt.y= y;
}

Bezier贝塞尔曲线的原理、二次贝塞尔曲线的实现的更多相关文章

  1. 贝塞尔曲线:原理、自定义贝塞尔曲线View、使用!!!

    一.原理 转自:http://www.2cto.com/kf/201401/275838.html Android动画学习Demo(3) 沿着贝塞尔曲线移动的Property Animation Pr ...

  2. Android 利用二次贝塞尔曲线模仿购物车加入物品抛物线动画

    Android 利用二次贝塞尔曲线模仿购物车加入物品抛物线动画 0.首先.先给出一张效果gif图. 1.贝塞尔曲线原理及相关公式參考:http://www.jianshu.com/p/c0d7ad79 ...

  3. canvas绘制二次贝塞尔曲线----演示二次贝塞尔四个参数的作用

    canvas中绘制二次贝塞尔曲线的方法为ctx.quadraticCurveTo(x1,y1,x2,y2); 四个参数分别为两个控制点的坐标.开始点即当前canvas中目前的点,如果想从指定的点开始, ...

  4. Bezier曲线的原理 及 二次Bezier曲线的实现

    原文地址:http://blog.csdn.net/jimi36/article/details/7792103 Bezier曲线的原理 Bezier曲线是应用于二维图形的曲线.曲线由顶点和控制点组成 ...

  5. 基于canvas二次贝塞尔曲线绘制鲜花

    canvas中二次贝塞尔曲线参数说明: cp1x:控制点1横坐标 cp1y:控制点1纵坐标 x: 结束点1横坐标 y:结束点1纵坐标 cp2x:控制点2横坐标 cp2y:控制点2纵坐标 z:结束点2横 ...

  6. word2vec原理(二) 基于Hierarchical Softmax的模型

    word2vec原理(一) CBOW与Skip-Gram模型基础 word2vec原理(二) 基于Hierarchical Softmax的模型 word2vec原理(三) 基于Negative Sa ...

  7. juc线程池原理(二):ThreadPoolExecutor的成员变量介绍

    概要 线程池的实现类是ThreadPoolExecutor类.本章,我们通过分析ThreadPoolExecutor类,来了解线程池的原理. ThreadPoolExecutor数据结构 Thread ...

  8. 【分类模型评判指标 二】ROC曲线与AUC面积

    转自:https://blog.csdn.net/Orange_Spotty_Cat/article/details/80499031 略有改动,仅供个人学习使用 简介 ROC曲线与AUC面积均是用来 ...

  9. 并发之AQS原理(二) CLH队列与Node解析

    并发之AQS原理(二) CLH队列与Node解析 1.CLH队列与Node节点 就像通常医院看病排队一样,医生一次能看的病人数量有限,那么超出医生看病速度之外的病人就要排队. 一条队列是队列中每一个人 ...

随机推荐

  1. git 修改远程仓库源

    自己已经写好了一个项目,想上传到 github github 创建新项目 新建 README.md , LICENSE 本地项目添加 github 远程仓库源 不是git项目 git remote a ...

  2. linux的防火墙端口配置

    健忘啊,记下来吧 Red Hat Linux系统 此类型系统包括red hat的各类衍生及相关不版本,包括RHEL.CentOS.Fedora等等. 防火墙配置文件: /etc/sysconfig/i ...

  3. [SCOI2010]连续攻击游戏 BZOJ1854 二分图匹配

    题目描述 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性.并且每种装备 ...

  4. 洛谷P2025 脑力大人之监听电话

    题目描述 话说埃菲尔铁塔小区的房子只有一栋,且只有一层,其中每一家都装有一个监听器,具体地,如果编号为第i家的人给编号第\(j\)家的人打了电话,\(i \leq j\),当然,也会有些人无聊地自己给 ...

  5. xcode8.3 shell 自动打包脚本

    题记 xcode升级8.3后发现之前所用的xcode自动打包基本无法使用,因此在网上零碎找到些资料,将之前的脚本简化.此次脚本是基于xcode证书配置进行打包(之前是指定描述文件.相对繁琐).因此代码 ...

  6. [转]深入探讨C语言中局部变量与全局变量的作用域与存储类别

    C语言中局部变量和全局变量变量的作用域与存储类别(auto,static,extern,register) 1.局部变量和全局变量在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元, ...

  7. java日期与时间戳相互转换大全

    转载大神 https://blog.csdn.net/djc777/article/details/50904989/

  8. WebP图片格式

    腾讯科技讯 科技博客Gig‍‍‍aOM近日撰文称,谷歌(微博)试图让WebP图片格式取代JPEG等现有图片格式.虽然谷歌无法很快达成所愿,但WebP仍然会对互联网产生重大影响. 文章全文如下: 受够了 ...

  9. Problem D. Dwarf Tower spfa

    http://codeforces.com/gym/100269/attachments 首先建图,然后图中每条边的权值是会变化的,是由dis[x] + dis[y]  --->   dis[m ...

  10. ACdream 1236 Burning Bridges 割边 + 去重边

    题目就是求一副图的割边,然后对于那些有重复的边的,不能算做割边. 思路就是每次加入一条边的时候,判断这条边是否存在过,存在过的话,就把那条边设为inf,表示不能作为割边.于是有了这样的代码 #incl ...