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横 ...
随机推荐
- cs108 java 02
Eclipise 1. import, 所有的homework 是以 eclipse project directories 的形式. 所以要选择 “File –> Import “, Exis ...
- Android应用更新升级实现
介绍 在产品的开发中,android升级提示,下载更新是必备的功能,否则等用户被动去官方网,或者第三方商店提示,就为时已晚了. 原理 在用户每次打开应用的时候,都与服务器进行一次交互,获取版本信息,对 ...
- UVa 11468 (AC自动机 概率DP) Substring
将K个模板串构成一个AC自动机,那些能匹配到的单词节点都称之为禁止节点. 然后问题就变成了在Tire树上走L步且不经过禁止节点的概率. 根据全概率公式用记忆化搜索求解. #include <cs ...
- 51nod1295 XOR key
第一次写可持久化trie指针版我... //Null 的正确姿势终于学会啦qaq... #include<cstdio> #include<cstring> #include& ...
- VC++的菜单控制和自绘菜单
菜单控制为什么即使调用EnableMenuItem菜单项后,菜单项还处于禁止状态 需要将CFrameWnd:: m_bAutomenuEnable设置为FALSE,如果该数据成员为TRUE(缺省值), ...
- 安装CouchbaseClient的过程中提示 Error 1935.An error occurred during the installation of assembly;Error:-1603 fatal error during installation
安装过程中提示报错 点击确定后 安装程序会接着回滚,又提示报错如下 Error 1935的解决方法是下载一个微软的补丁. http://support.microsoft.com/de ...
- cookie随便写的一点笔记(抄书的)
cookie是保存在客户端的文本,能够在一定程度上提高用户体验.Servlet API 中提供了Cookie类,可以创建Cookie对象,并通过响应中的addCookie方法,将cookie保存到客户 ...
- 【原创】牛顿法和拟牛顿法 -- BFGS, L-BFGS, OWL-QN
数据.特征和数值优化算法是机器学习的核心,而牛顿法及其改良(拟牛顿法)是机器最常用的一类数字优化算法,今天就从牛顿法开始,介绍几个拟牛顿法算法.本博文只介绍算法的思想,具体的数学推导过程不做介绍. 1 ...
- POJ 2249 Binomial Showdown
// n 个 数 取 k个数的取法// C(n,k) 注意些细节#include <iostream> #include <string> #include<sstrea ...
- ACCESS中的窗体、报表、宏模块等(ACCESS 2000)
窗体: 分为数据操作窗体,它包括单页.多页.连续.子窗口 控制窗体 信息交互窗体 窗体三种视图:“设计”视图.“窗体”视图.“数据表”视图 窗体建立的五种方式: 一:自动创建窗体 二:窗体向导(一对多 ...