Bezier曲线的原理 及 二次Bezier曲线的实现
原文地址: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曲线的实现
- #ifndef CBEZIERCURVE_H_
- #define CBEZIERCURVE_H_
- #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;
- };
- #endif
- #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() == 3);
- // 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 = 0; i < nCount; ++i)
- {
- pDC->SetPixel(m_vecCurvePt[i], 0x000000);
- }
- }
- void CBezierCurve::CalCurvePoint(float t, POINT& stPt)
- {
- // 确保是二次曲线,2个顶点一个控制点
- assert(m_vecCtrlPt.size() == 3);
- // 计算曲线点坐标,此为2次算法,改变此处可以实现多次曲线
- float x = (float)m_vecCtrlPt[0].x * pow(1 - t, 2) +
- (float)m_vecCtrlPt[1].x * t * (1 - t) * 2 +
- (float)m_vecCtrlPt[2].x * pow(t, 2);
- float y = (float)m_vecCtrlPt[0].y * pow(1 - t, 2) +
- (float)m_vecCtrlPt[1].y * t * (1 - t) * 2 +
- (float)m_vecCtrlPt[2].y * pow(t, 2);
- stPt.x =x;
- stPt.y= y;
- }
Bezier曲线的原理 及 二次Bezier曲线的实现的更多相关文章
- Bezier贝塞尔曲线的原理、二次贝塞尔曲线的实现
Bezier曲线的原理 Bezier曲线是应用于二维图形的曲线.曲线由顶点和控制点组成,通过改变控制点坐标可以改变曲线的形状. 一次Bezier曲线公式: 一次Bezier曲线是由P0至P1的连续点, ...
- 贝塞尔曲线:原理、自定义贝塞尔曲线View、使用!!!
一.原理 转自:http://www.2cto.com/kf/201401/275838.html Android动画学习Demo(3) 沿着贝塞尔曲线移动的Property Animation Pr ...
- Android 利用二次贝塞尔曲线模仿购物车加入物品抛物线动画
Android 利用二次贝塞尔曲线模仿购物车加入物品抛物线动画 0.首先.先给出一张效果gif图. 1.贝塞尔曲线原理及相关公式參考:http://www.jianshu.com/p/c0d7ad79 ...
- Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之ORACLE集群概念和原理(二)
ORACLE集群概念和原理(二) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总.然后形成体 ...
- canvas绘制二次贝塞尔曲线----演示二次贝塞尔四个参数的作用
canvas中绘制二次贝塞尔曲线的方法为ctx.quadraticCurveTo(x1,y1,x2,y2); 四个参数分别为两个控制点的坐标.开始点即当前canvas中目前的点,如果想从指定的点开始, ...
- 深入源码分析SpringMVC底层原理(二)
原文链接:深入源码分析SpringMVC底层原理(二) 文章目录 深入分析SpringMVC请求处理过程 1. DispatcherServlet处理请求 1.1 寻找Handler 1.2 没有找到 ...
- JVM 内部原理(二)— 基本概念之字节码
JVM 内部原理(二)- 基本概念之字节码 介绍 版本:Java SE 7 每位使用 Java 的程序员都知道 Java 字节码在 Java 运行时(JRE - Java Runtime Enviro ...
- 【转】Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之ORACLE集群概念和原理(二)
阅读目录 目录 Oracle集群概念和原理 RAC概述 RAC 集成集群件管理 RAC 的体系结构 RAC 的结构组成和机制 RAC 后台进程 RAC 共享存储 RAC 数据库和单实例数据库的区别 ...
- 基于canvas二次贝塞尔曲线绘制鲜花
canvas中二次贝塞尔曲线参数说明: cp1x:控制点1横坐标 cp1y:控制点1纵坐标 x: 结束点1横坐标 y:结束点1纵坐标 cp2x:控制点2横坐标 cp2y:控制点2纵坐标 z:结束点2横 ...
随机推荐
- Asp.net MVC 3实例学习之ExtShop(四)——完成产品列表页
在完成产品列表页前要做一些准备功夫.首先是去下载MvcPager用了为产品列表分页.下载的可能是基于MVC 2的,没关系,可以用在MVC 3上.如果有担心,下载源代码重新编译一次好了.下载后将DLL添 ...
- 手机号段、ip地址归属地大全,最新手机号段归属地,IP地址归属地数据库
百事通:http://www.114best.com/dh/114.aspx?w=17097232323,联通识别为电信的,1349错 二三四五:http://tools.2345.com/frame ...
- hibernate学习笔记6--Criteria查询方式、完整小练习(开发步骤)
一.Criteria查询方式没有sql语了,因此更加面向对象一些.Criteria是一种比HQL更面向对象的查询方式:Criteria的创建方式: Criteria c = s.createCrite ...
- 51nod1084 矩阵取数问题 V2
O(n4)->O(n3)妈呀为什么跑这么慢woc #include<cstdio> #include<cstring> #include<cctype> #i ...
- Asp.Net判断字符是否为汉字的方法大全
判断一个字符是不是汉字通常有三种方法: 第一种用 ASCII 码判断,缺点:把全角逗号“,”当汉字处理 第二种用汉字的 UNICODE 编码范围判 断, 第三种用正则表达式判断 1.用ASCII码判断 ...
- [转载]charisma-master 加载慢的原因及解决方法
[我的总结] 原文中指出的地址有的已经转换,因为版本问题. 所以根据2014年11月获取的charisma-master版本,应做以下更改: 1.charisma-app.css 这个文件中的外链字体 ...
- BZOJ 4571 美味
又一部SCOI血泪史.... 唉. 就是在这棵树上一遍又一遍跑嘛. 以后不要直接求答案啊.要最后再异或起来. 要学习简单的代码风格. #include<iostream> #include ...
- Linux apt-get
apt-get apt-get是一条linux命令,适用于deb包管理式的操作系统,主要用于自动从互联网的软件仓库中搜索.安装.升级.卸载软件或操作系统. apt-get命令一般需要root权限执行, ...
- 别人的的MYSQL学习心得(十五) 日志
我的MYSQL学习心得(十五) 日志 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...
- Datawindow.net+access数据窗口制作方法
1) 数据字典:采用SQLServer桌面程序来创建数据字典.配置正确的pbl文件生成输入列表. 在SQLServers查询器中执行select * from pbcatedt where pbe_n ...