Bezier贝塞尔曲线的原理、二次贝塞尔曲线的实现
Bezier曲线的原理
Bezier曲线是应用于二维图形的曲线。曲线由顶点和控制点组成,通过改变控制点坐标可以改变曲线的形状。
一次Bezier曲线公式:


一次Bezier曲线是由P0至P1的连续点,描述的一条线段
二次Bezier曲线公式:


二次Bezier曲线是 P0至P1 的连续点Q0和P1至P2 的连续点Q1 组成的线段上的连续点B(t),描述一条抛物线。
三次Bezier曲线公式:


二次Bezier曲线的实现
#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;
};
#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() == ); // 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 = ; i < nCount; ++i)
{
pDC->SetPixel(m_vecCurvePt[i], 0x000000);
}
} void CBezierCurve::CalCurvePoint(float t, POINT& stPt)
{
// 确保是二次曲线,2个顶点一个控制点
assert(m_vecCtrlPt.size() == ); // 计算曲线点坐标,此为2次算法,改变此处可以实现多次曲线
float x = (float)m_vecCtrlPt[].x * pow( - t, ) +
(float)m_vecCtrlPt[].x * t * ( - t) * +
(float)m_vecCtrlPt[].x * pow(t, );
float y = (float)m_vecCtrlPt[].y * pow( - t, ) +
(float)m_vecCtrlPt[].y * t * ( - t) * +
(float)m_vecCtrlPt[].y * pow(t, );
stPt.x =x;
stPt.y= y;
}
Bezier贝塞尔曲线的原理、二次贝塞尔曲线的实现的更多相关文章
- 贝塞尔曲线:原理、自定义贝塞尔曲线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 ...
- canvas绘制二次贝塞尔曲线----演示二次贝塞尔四个参数的作用
canvas中绘制二次贝塞尔曲线的方法为ctx.quadraticCurveTo(x1,y1,x2,y2); 四个参数分别为两个控制点的坐标.开始点即当前canvas中目前的点,如果想从指定的点开始, ...
- Bezier曲线的原理 及 二次Bezier曲线的实现
原文地址:http://blog.csdn.net/jimi36/article/details/7792103 Bezier曲线的原理 Bezier曲线是应用于二维图形的曲线.曲线由顶点和控制点组成 ...
- 基于canvas二次贝塞尔曲线绘制鲜花
canvas中二次贝塞尔曲线参数说明: cp1x:控制点1横坐标 cp1y:控制点1纵坐标 x: 结束点1横坐标 y:结束点1纵坐标 cp2x:控制点2横坐标 cp2y:控制点2纵坐标 z:结束点2横 ...
- word2vec原理(二) 基于Hierarchical Softmax的模型
word2vec原理(一) CBOW与Skip-Gram模型基础 word2vec原理(二) 基于Hierarchical Softmax的模型 word2vec原理(三) 基于Negative Sa ...
- juc线程池原理(二):ThreadPoolExecutor的成员变量介绍
概要 线程池的实现类是ThreadPoolExecutor类.本章,我们通过分析ThreadPoolExecutor类,来了解线程池的原理. ThreadPoolExecutor数据结构 Thread ...
- 【分类模型评判指标 二】ROC曲线与AUC面积
转自:https://blog.csdn.net/Orange_Spotty_Cat/article/details/80499031 略有改动,仅供个人学习使用 简介 ROC曲线与AUC面积均是用来 ...
- 并发之AQS原理(二) CLH队列与Node解析
并发之AQS原理(二) CLH队列与Node解析 1.CLH队列与Node节点 就像通常医院看病排队一样,医生一次能看的病人数量有限,那么超出医生看病速度之外的病人就要排队. 一条队列是队列中每一个人 ...
随机推荐
- 2019前端面试之html5
html5新增特性 语义化标签 表单新特性 视频和音频canva画布 svg画图 地理位置 为鼠标提供的拖放api webwroker storage websocker 常见块级标签 div,p,h ...
- KONG -- 配置 service 并添加 key-auth
默认情况下, KONG 监听下面几个端口: 8000 这个端口用于监听客户端的 HTTP 请求,并转发给上游服务 8443 这个端口用于监听客户端的 HTTPS 请求,并转发给上游服务 800 ...
- 洛谷P3380 【模板】二逼平衡树(树套树)(线段树+树状数组)
P3380 [模板]二逼平衡树(树套树) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询k在区间内的排名 查询区间内排名为k的值 修改某一位值上的数 ...
- this android sdk requires android developer toolkit version
this android sdk requires android developer toolkit version 10.0.0 or above. current version is 8.0. ...
- 当构造方法参数过多时使用builder模式
静态工厂和构造方法都有一个限制:它们不能很好地扩展到很多可选参数的情景.请考虑一个代表包装食品上的营养成分标签的例子.这些标签有几个必需的属性——每次建议的摄入量,每罐的份量和每份卡路里 ,以及超过 ...
- Linux表面工作
https://www.cnblogs.com/welhzh/p/5899875.html 1.显示文本文件的内容 /etc/issue #登录前提示 /etc/motd #登录后提示 ssh ...
- windows下运行jar
run.bat 1. javaw运行 @echo offstart javaw -Xmx128m -Xms64m -jar testlog.jarexit 2.java运行 @echo offjava ...
- java动态线程池LinkedBlockingQueue和SynchronousQueue比较
import java.util.concurrent.Callable; public class MyCallable implements Callable<String> { pr ...
- mysql /etc/my.cnf
[client] port=3306 socket = /tmp/mysql.sock default-character-set=utf8 [mysqld] # 1 general config p ...
- Ubuntu14.04下sogou输入法的输入框只显示英文不显示中文的问题
解决方法:首先强制更新,把依赖文件全部安装 sudo apt-get install -f 如果仍然不管用,删除sogou的配置文件,在~/.config目录下,一般情况下是SogouPY.Sogou ...