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横 ...
随机推荐
- POJ3415 Common Substrings
后缀数组 求长度不小于k的公共子串的个数 代码: #include <stdio.h> #include <string.h> ; int len, len1; int wa[ ...
- JSON 之 SuperObject(10): Merge、Clone、ForcePath
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, For ...
- Home Server
今天分享一个作品--HomeServer,一个基于云存储理念的集家庭数据存储.共享.管理及远程访问为一体的家用存储设备.通俗的讲,就是一个家庭数据银行,为家庭的数据提供专业.安全.便捷.持久.全天候的 ...
- spring mvc出现 Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'endtime'
在使用spring mvc中,绑定页面传递时间字符串数据给Date类型是出错: Failed to convert property value of type [java.lang.String] ...
- Hadoop2配置详解
配置文件 hadoop的配置是由两种重要类型的配置文件进行驱动的: 默认是只读的配置: core-default.xml, hdfs-default.xml, yarn-default.xml and ...
- 进程描述符task_struct
1.进程状态 volatile long state; int exit_state; state成员的可能取值如下: #define TASK_RUNNING 0 #define TA ...
- 【转】很有用但鲜有人知的 Linux 命令
Linux命令行吸引了大多数Linux爱好者.一个正常的Linux用户一般掌握大约50-60个命令来处理每日的任务.Linux命令和它们的转换对于Linux用户.Shell脚本程序员和管理员来说是最有 ...
- iPad中控制器view的width和height
一.iPad中控制器view的width和height 1> 规律 * width 是宽高中最小的那个值 * height 是宽高中最大的那个值 2> 举例(比如窗口根控制器的view,有 ...
- HDU 5003 Osu!
解题思路:水题,不多说. #include<cstdio> #include<cstring> #include<algorithm> #include<cm ...
- Spring 事务配置5种方式
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSo ...