原文地址:http://blog.csdn.net/jimi36/article/details/7792103

Bezier曲线的原理

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

一次Bezier曲线公式:

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

二次Bezier曲线公式:

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

三次Bezier曲线公式:

二次Bezier曲线的实现

  1. #ifndef CBEZIERCURVE_H_
  2. #define CBEZIERCURVE_H_
  3. #include <vector>
  4. class CBezierCurve
  5. {
  6. public:
  7. CBezierCurve();
  8. ~CBezierCurve();
  9. void SetCtrlPoint(POINT& stPt);
  10. bool CreateCurve();
  11. void Draw(CDC* pDC);
  12. private:
  13. // 主要算法,计算曲线各个点坐标
  14. void CalCurvePoint(float t, POINT& stPt);
  15. private:
  16. // 顶点和控制点数组
  17. std::vector<POINT> m_vecCtrlPt;
  18. // 曲线上各点坐标数组
  19. std::vector<POINT> m_vecCurvePt;
  20. };
  21. #endif
[html] view
plain
copy

  1. #include <math.h>
  2. #include "BezierCurve.h"
  3. CBezierCurve::CBezierCurve()
  4. {
  5. }
  6. CBezierCurve::~CBezierCurve()
  7. {
  8. }
  9. void CBezierCurve::SetCtrlPoint(POINT& stPt)
  10. {
  11. m_vecCtrlPt.push_back(stPt);
  12. }
  13. void CBezierCurve::CreateCurve()
  14. {
  15. // 确保是二次曲线,2个顶点一个控制点
  16. assert(m_vecCtrlPt.size() == 3);
  17. // t的增量, 可以通过setp大小确定需要保存的曲线上点的个数
  18. float step = 0.01;
  19. for (float t = 0.0; t <= 1.0; t += step)
  20. {
  21. POINT stPt;
  22. CalCurvePoint(t, stPt);
  23. m_vecCurvePt.push_back(stPt);
  24. }
  25. }
  26. void CBezierCurve::Draw(CDC* pDC)
  27. {
  28. // 画出曲线上个点,若不连续可以用直线连接各点
  29. int nCount = m_vecCurvePt.size();
  30. for (int i = 0; i < nCount; ++i)
  31. {
  32. pDC->SetPixel(m_vecCurvePt[i], 0x000000);
  33. }
  34. }
  35. void CBezierCurve::CalCurvePoint(float t, POINT& stPt)
  36. {
  37. // 确保是二次曲线,2个顶点一个控制点
  38. assert(m_vecCtrlPt.size() == 3);
  39. // 计算曲线点坐标,此为2次算法,改变此处可以实现多次曲线
  40. float x = (float)m_vecCtrlPt[0].x * pow(1 - t, 2)   +
  41. (float)m_vecCtrlPt[1].x * t * (1 - t) * 2 +
  42. (float)m_vecCtrlPt[2].x * pow(t, 2);
  43. float y = (float)m_vecCtrlPt[0].y * pow(1 - t, 2)   +
  44. (float)m_vecCtrlPt[1].y * t * (1 - t) * 2 +
  45. (float)m_vecCtrlPt[2].y * pow(t, 2);
  46. stPt.x =x;
  47. stPt.y= y;
  48. }

Bezier曲线的原理 及 二次Bezier曲线的实现的更多相关文章

  1. Bezier贝塞尔曲线的原理、二次贝塞尔曲线的实现

    Bezier曲线的原理 Bezier曲线是应用于二维图形的曲线.曲线由顶点和控制点组成,通过改变控制点坐标可以改变曲线的形状. 一次Bezier曲线公式: 一次Bezier曲线是由P0至P1的连续点, ...

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

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

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

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

  4. Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之ORACLE集群概念和原理(二)

    ORACLE集群概念和原理(二) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总.然后形成体 ...

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

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

  6. 深入源码分析SpringMVC底层原理(二)

    原文链接:深入源码分析SpringMVC底层原理(二) 文章目录 深入分析SpringMVC请求处理过程 1. DispatcherServlet处理请求 1.1 寻找Handler 1.2 没有找到 ...

  7. JVM 内部原理(二)— 基本概念之字节码

    JVM 内部原理(二)- 基本概念之字节码 介绍 版本:Java SE 7 每位使用 Java 的程序员都知道 Java 字节码在 Java 运行时(JRE - Java Runtime Enviro ...

  8. 【转】Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之ORACLE集群概念和原理(二)

      阅读目录 目录 Oracle集群概念和原理 RAC概述 RAC 集成集群件管理 RAC 的体系结构 RAC 的结构组成和机制 RAC 后台进程 RAC 共享存储 RAC 数据库和单实例数据库的区别 ...

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

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

随机推荐

  1. Hibernate配置文件和映射元素解释

    象关系的映射是用一个XML文档来说明的.映射文档可以使用工具来生成,如XDoclet,Middlegen和AndroMDA等.下面从一个映射的例子开始讲解映射元素. AD:干货来了,不要等!WOT20 ...

  2. jQuery_效果(滑动)

    1.jQuery slideDown() 方法(用于向下滑动元素) 语法:$(selector).slideDown(speed,callback); 可选的 speed 参数规定效果的时长.它可以取 ...

  3. noi2015的回忆和教训

    前几天偶然打开了bzoj的rank list,突然发现——我竟然掉出了第一版!!! 自从我5月还是6月刷进第一版之后,我曾经天真的以为大概半年之内我还能保留在第一版内吧. 结果仅仅短短的4个月,我就已 ...

  4. Qt之自定义搜索框

    简述 关于搜索框,大家都经常接触.例如:浏览器搜索.Windows资源管理器搜索等. 当然,这些对于Qt实现来说毫无压力,只要思路清晰,分分钟搞定. 方案一:调用QLineEdit现有接口 void ...

  5. find命令下的atime,ctime,mtime

    Linux下的find命令在目录结构中搜索文件,并执行指定的操作.linux下的find命令提供了相当多的查找条件,功能很强大,由于find的功能很强大,所以他的选项也很多,今天我们来细说一下find ...

  6. 内核打上yaffs2补丁遇到的问题

    移植yaffs2文件系统时,首先要在内核中添加对yaffs2的支持,使用命令:./patch-ker.sh c 内核目录时,出现下面错误: usage:  ./patch-ker.sh  c/l m/ ...

  7. Spark快速入门(1)

    1 安装Spark 首先,到 https://spark.apache.org/downloads.html 选择最新的 Spark 版本和 Hadoop 版本(实际上我们暂时用不上 Hadoop,所 ...

  8. 【英语】Bingo口语笔记(8) - 爆破音的发音技巧

    轻读,有时候甚至是听不到的,就嘴巴碰一下而已.

  9. phonegap 退出确认

    实现 再按一次退出  ,这里只针对 主active继承 DroidGap 或者CordovaActive 以下有2种 方案1: 重写CordovaWebView类 新建类NobackWebView p ...

  10. POJ 2249 Binomial Showdown

    // n 个 数 取 k个数的取法// C(n,k) 注意些细节#include <iostream> #include <string> #include<sstrea ...