原文地址: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. POJ 3259 Wormholes【Bellman_ford判断负环】

    题意:给出n个点,m条正权的边,w条负权的边,问是否存在负环 因为Bellman_ford最多松弛n-1次, 因为从起点1终点n最多经过n-2个点,即最多松弛n-1次,如果第n次松弛还能成功的话,则说 ...

  2. WEBUS2.0 In Action - 搜索操作指南 - (4)

    上一篇:WEBUS2.0 In Action - 搜索操作指南(3) 6. 搜索多个索引 为了提升性能, 我们可以从多个索引同时进行搜索, Webus.Search.MultiSearcher提供了相 ...

  3. XmlElement可以避免由XmlSerializer多余生成的代码

    public class Program { static void Main(string[] args) { var alarm = new Alarm() { Code = "1588 ...

  4. 甚是挂念学校的acmer

    虽然自己一直不承认.. 今天头疼,不想工作,况且自己服务端代码也写差不多了,于是又干起了自己的本行,去信息站找退役帖看,又把3xian的文章看了一遍,这次我从文章里面读到的更多的是懊恼,恨铁不成钢.经 ...

  5. 06day2

    蠕虫游戏 模拟 [问题描述] 蠕虫是一个古老的电脑游戏,它有许多版本.但所有版本都有一个共同规则:操纵一条蠕虫在屏幕上转圈,并试着去避免撞到自己或障碍物. 这里我们将模拟一个简单的版本.游戏将在 50 ...

  6. Myeclipse提示失效?

  7. 梯度下降之随机梯度下降 -minibatch 与并行化方法

    问题的引入: 考虑一个典型的有监督机器学习问题,给定m个训练样本S={x(i),y(i)},通过经验风险最小化来得到一组权值w,则现在对于整个训练集待优化目标函数为: 其中为单个训练样本(x(i),y ...

  8. Spring AOP简介

    AOP简述 AOP的概念早在上个世纪九十年代初就已经出现了,当时的研究人员通过对面向对象思想局限性的分析研究出了一种新的编程思想来帮助开发者减少代码重复提高开发效率,那就是AOP,Aspect-Ori ...

  9. Hibernate查询出现java.lang.IllegalArgumentException异常解决方法

    Hibernate查询出现java.lang.IllegalArgumentException. 异常信息如下:java.lang.IllegalArgumentException        at ...

  10. ios 页面传值4种方式(一) 之全局变量

    通用的是用代理的方式实现页面传值,但是有时候利用其它方式也可以很巧妙的解决问题,页面传值一共有4种方式: 1.使用全局变量, SharedApplication,定义一个变量来传递. 2.使用文件,或 ...