样条曲线catmull rom转bezier
b0,..,b3是贝塞尔,c-1, c2是catmull rom控制点
[b0] = 1 [ 0 6 0 0] [c_1]
[b1] - [-1 6 1 0] [c0]
[b2] 6 [ 0 1 6 -1] [c1]
[b3] [ 0 0 6 0] [c2]
Qt版本代码:
QList<QPointF> cps;
cps.append(QPointF(, ));
cps.append(QPointF(, ));
cps.append(QPointF(, ));
cps.append(QPointF(, ));
cps.append(QPointF(, )); QPainter p(this); //draw control point
foreach(const QPointF& pos, cps)
p.drawEllipse(pos, , ); QPainterPath path;
//create bezier from catrull-rom
/*
full conversion matrix (inverse bezier * catmull-rom): 4*4(matrix, 4* 1(catrull-rom control points)
0.000, 1.000, 0.000, 0.000,
-0.167, 1.000, 0.167, 0.000,
0.000, 0.167, 1.000, -0.167,
0.000, 0.000, 1.000, 0.000 conversion doesn't require full matrix multiplication,
so below we simplify
*/
path.moveTo(cps.first()); QPointF prevFar, prev, point, next;
for(int i = ; i < cps.size(); i ++)
{
int prevFarIdx = i - ;
int prevIdx = i - ;
int nextIdx = i + ;
point = cps[i];
if(prevIdx >= )
prev = cps[prevIdx];
else
prev = point;
if(prevFarIdx >= )
prevFar = cps[prevFarIdx];
else
prevFar = prev;
if(nextIdx < cps.size())
next = cps[nextIdx];
else
next = point; QPointF control1(prevFar.x() * qreal(-0.167) +
prev.x() +
point.x() * qreal(0.167),
prevFar.y() * qreal(-0.167) +
prev.y() +
point.y() * qreal(0.167)); QPointF control2(prev.x() * qreal(0.167) +
point.x() +
next.x() * qreal(-0.167),
prev.y() * qreal(0.167) +
point.y() +
next.y() * qreal(-0.167)); path.cubicTo(control1, control2, point);
}
p.drawPath(path);
参考:
1. http://stackoverflow.com/questions/1030596/drawing-hermite-curves-in-opengl
样条曲线catmull rom转bezier的更多相关文章
- Cocos Creator 动作(动画)笔记
动作cc.ActionInterval 和cc.ActionInstant; var action = cc.moveTo(2, 100, 100); // 创建一个移动动作node.runActio ...
- 样条之CatmullRom
所谓样条曲线是指给定一组控制点而得到一条曲线,曲线的大致形状由这些点予以控制,一般可分为插值样条和逼近样条两种,插值样条通常用于数字化绘图或动画的设计,逼近样条一般用来构造物体的表面.CatmullR ...
- cocos学习
第一章 JavaScript 快速入门 1.1 变量 在 JavaScript 中,我们像这样声明一个变量: var a; 保留字 var 之后紧跟着的,就是一个变量名,接下来我们可以为变量赋值: v ...
- Cocos2d-x 3.2 Lua演示样本 ActionTest(操作测试)
Cocos2d-x 3.2 Lua演示样本 ActionTest(操作测试) 2014年博文大赛,请投上您宝贵的一票:http://vote.blog.csdn.net/Article/Details ...
- Cocos2d-x 3.2 学习笔记(八)Action
Action -动作.所有精灵的表现,人机交互的表现,都是动作.cocos2dx 里面封装的动作可谓是丰富! Action有三个子类 1.FiniteTimeAction类是所有在有限时间能够完成的动 ...
- Unity中DOTween插件的DOTweenPath轨迹移动
先来看一下DOTweenPath组件的截图 1.Scene View Commands (1)SHIFT+CTRL:add a waypoint 加一个轨迹点 (2)SHIFT+ALT: ...
- [翻译] ios-image-filters
ios-image-filters https://github.com/esilverberg/ios-image-filters photoshop-style filter interface ...
- 解析DXF图形文件格式
一.DXF文件格式分析 DXF文件由标题段.表段.块段.实体段和文件结束段5部分组成,其内容如下. ☆标题段(HEADER)标题段记录AutoCAD系统的所有标题变量的当前值或当前状态.标题变量记录了 ...
- UE制作PBR材质攻略Part 1 - 色彩知识
目录 一.前言 二.色彩知识 2.1 色彩理论 2.1.1 成像原理 2.1.2 色彩模型和色彩空间 2.1.3 色彩属性 2.1.4 直方图 2.1.5 色调曲线 2.1.6 线性空间与Gamma空 ...
随机推荐
- 安装FreePBX的ISO版本
下载地址:http://schmoozecom.com/distro-download.php 这个相当于系统了,第一步:安装程序会提示选择你想安装Asterisk的版本:现在出现了11版本,这个根据 ...
- org.hibernate.Session常用方法的作用总结
clear(): 清理session缓存.把所有加载出来的持久化实例都从session缓存中清除,同时,也会挂掉当前session中正在排队的save,update,delete操作. evict: ...
- Apache 的编译安装
直接看步骤: 1.安装必备环境:gcc.pcre .................................. 2.安装apr.apr-util 3.解压编译安装Apache: ./confi ...
- RPC框架的服务注册和发现
https://www.cnblogs.com/valor-xh/p/6281502.html https://blog.csdn.net/listslim1/article/details/5157 ...
- 深入浅出 Java Concurrency (8): 加锁的原理 (Lock.lock)
接上篇,这篇从Lock.lock/unlock开始.特别说明在没有特殊情况下所有程序.API.文档都是基于JDK 6.0的. public void java.util.concurrent.lock ...
- 第八篇 实例化Flask的参数 及 对app的配置
Flask 是一个非常灵活且短小精干的web框架 , 那么灵活性从什么地方体现呢? 有一个神奇的东西叫 Flask配置 , 这个东西怎么用呢? 它能给我们带来怎么样的方便呢? 首先展示一下: from ...
- Django的contenttypes应用、缓存相关
一.django的contenttypes contenttypes 是Django内置的一个应用 , 可以追踪项目中所有app 和 model 的对应关系, 并记录djang_content_typ ...
- A generic error occurred in GDI+的解决方案
转自智慧光原文A generic error occurred in GDI+. 解决方法 使用image1.RotateFlip(RotateFlipType.Rotate90FlipNone)方法 ...
- Markdown之表格的处理
目前编辑器不支持表格,以往是通过截图,呈现的效果并不好,Markdown支持html,所以我们可以用html来写表格.但是......用html写表格,实在太麻烦了,这里有个简单的转换方法,供大家参考 ...
- UINavigation,UiView,ModalView Controller之间的关系
如果当前是个VC,那么就太简单了,直接就可以push到下一个vc AddShopViewController *controller = [[AddShopViewController alloc] ...