原文地址: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. cs108 java 02

    Eclipise 1. import, 所有的homework 是以 eclipse project directories 的形式. 所以要选择 “File –> Import “, Exis ...

  2. Android应用更新升级实现

    介绍 在产品的开发中,android升级提示,下载更新是必备的功能,否则等用户被动去官方网,或者第三方商店提示,就为时已晚了. 原理 在用户每次打开应用的时候,都与服务器进行一次交互,获取版本信息,对 ...

  3. UVa 11468 (AC自动机 概率DP) Substring

    将K个模板串构成一个AC自动机,那些能匹配到的单词节点都称之为禁止节点. 然后问题就变成了在Tire树上走L步且不经过禁止节点的概率. 根据全概率公式用记忆化搜索求解. #include <cs ...

  4. 51nod1295 XOR key

    第一次写可持久化trie指针版我... //Null 的正确姿势终于学会啦qaq... #include<cstdio> #include<cstring> #include& ...

  5. VC++的菜单控制和自绘菜单

    菜单控制为什么即使调用EnableMenuItem菜单项后,菜单项还处于禁止状态 需要将CFrameWnd:: m_bAutomenuEnable设置为FALSE,如果该数据成员为TRUE(缺省值), ...

  6. 安装CouchbaseClient的过程中提示 Error 1935.An error occurred during the installation of assembly;Error:-1603 fatal error during installation

    安装过程中提示报错   点击确定后 安装程序会接着回滚,又提示报错如下       Error 1935的解决方法是下载一个微软的补丁. http://support.microsoft.com/de ...

  7. cookie随便写的一点笔记(抄书的)

    cookie是保存在客户端的文本,能够在一定程度上提高用户体验.Servlet API 中提供了Cookie类,可以创建Cookie对象,并通过响应中的addCookie方法,将cookie保存到客户 ...

  8. 【原创】牛顿法和拟牛顿法 -- BFGS, L-BFGS, OWL-QN

    数据.特征和数值优化算法是机器学习的核心,而牛顿法及其改良(拟牛顿法)是机器最常用的一类数字优化算法,今天就从牛顿法开始,介绍几个拟牛顿法算法.本博文只介绍算法的思想,具体的数学推导过程不做介绍. 1 ...

  9. POJ 2249 Binomial Showdown

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

  10. ACCESS中的窗体、报表、宏模块等(ACCESS 2000)

    窗体: 分为数据操作窗体,它包括单页.多页.连续.子窗口 控制窗体 信息交互窗体 窗体三种视图:“设计”视图.“窗体”视图.“数据表”视图 窗体建立的五种方式: 一:自动创建窗体 二:窗体向导(一对多 ...