样条曲线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空 ...
随机推荐
- Docker Rest API使用入门
Docker Rest API使用入门 系统:Centos7.2, Docker版本信息如下: [python] view plain copy Client: Version: 17.03 ...
- java程序中的ibatis连接mySql的基本实例
属性文件:SqlMap.properties driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/ibatis username= ...
- Converter(转换器)与Formatter(格式化) ,Validator(验证器)
Converter(转换器)与Formatter(格式化)都可以用于将一种对象类型转换为另一种对象类型.Converter是通用元件,可以在应用程序的任意层中使用,而Fotermatter这是专门为W ...
- Java 中 wait, notify 和 notifyAll的正确使用 – 以生产者消费者模型为例
如何使用Wait 尽管关于wait和notify的概念很基础,它们也都是Object类的函数,但用它们来写代码却并不简单.如果你在面试中让应聘者来手写代码,用wait和notify解决生产者消费者问题 ...
- 谷歌强制厂商升级KitKat 仍无法改善安卓碎片化
据一份泄露的内部文档显示,谷歌计划推出新的Android版本及设备审批条例,限制硬件制造商推出Android 4.4 KitKat以下的旧版本硬件,来改变平台碎片化现象.如果厂商一意孤行,继续推出搭载 ...
- 浏览器及CURL代理设置
需要代理的请求 代理服务器及端口 120.197.233.205 80 firefox为例浏览器代理设置:(浏览器端也可以通过foxyproxy插件方便设置) 选项->高级->网络-> ...
- SqlServer之geometry格式数据的添加和修改
SqlServer之geometry格式数据的添加和修改 SqlServer中geometry是一种存储空间数据的格式,其数据主要有点线面等几种格式: POINT( ) //点 LINESTRING ...
- BurpSuite系列(十二)----User options模块(用户选择)
一.简介 User options模块主要用来配置一些常用的选项. 二.模块说明 User options主要由4个模块组成: 1.Connections 连接 2.SSL 3.Display 4 ...
- 常用的API接口
主页 :http://api.36wu.com/ GetWeather(实时气象)API 服务地址:http://api.36wu.com/Weather/GetWeather?city=?;如:ht ...
- Keepalived 资源监控
简介: 作为一个高可用集群软件,Keepalived 没有 Heartbeat .RHCS 等专业的高可用集群软件功能强大,它不能够实现集群资源的托管,也不能实现对集群中运行服务的监控,好在 Keep ...