样条曲线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(0, 100));
    cps.append(QPointF(75, 75));
    cps.append(QPointF(200, 150));
    cps.append(QPointF(325, 25));
    cps.append(QPointF(400, 100));

    QPainter p(this);

    //draw control point
    foreach(const QPointF& pos, cps)
        p.drawEllipse(pos, 5, 5);

    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
    */
    QPointF prevFar, prev, point, next;
    for(int i = 0; i < cps.size(); i ++)
    {
        int prevFarIdx = i - 2;
        int prevIdx = i - 1;
        int nextIdx = i + 1;
        point = cps[i];
        if(prevIdx >= 0)
            prev = cps[prevIdx];
        else
            prev = point;
        if(prevFarIdx >= 0)
            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

时间: 2024-10-20 19:42:09

样条曲线catmull rom转bezier的相关文章

样条之CatmullRom

所谓样条曲线是指给定一组控制点而得到一条曲线,曲线的大致形状由这些点予以控制,一般可分为插值样条和逼近样条两种,插值样条通常用于数字化绘图或动画的设计,逼近样条一般用来构造物体的表面.CatmullRom样条与上一节所讲的B样条很相似,不同在于CatmullRom样条的曲线会经过其每一个控制点. The centripetal Catmull–Rom is a subclass of cubic Hermite spline that extends the Catmull–Rom implem

Cocos2d-x 3.2 Lua演示样本 ActionTest(操作测试)

Cocos2d-x 3.2 Lua演示样本 ActionTest(操作测试) 2014年博文大赛,请投上您宝贵的一票:http://vote.blog.csdn.net/Article/Details?articleid=38272837 移动开发狂热者群: 299402133,欢迎广大开发人员增加 Cocos2d-x官方真够给力的,3.1.1还没有熟悉完,3.2就出来.本篇博客继续介绍Cocos2d-x的Lua演示样例.关于3.2的样例变动不是非常大,略微介绍一下3.2的新特性吧: 3.2版本

[翻译] ios-image-filters

ios-image-filters https://github.com/esilverberg/ios-image-filters photoshop-style filter interface for UIImage class on iOS to make instagram-style images photoshop-风格的滤镜接口,可以像使用photshop那样子来配置图片. ios-image-filters These days everyone seems to want i

Unity中DOTween插件的DOTweenPath轨迹移动

先来看一下DOTweenPath组件的截图 1.Scene View Commands (1)SHIFT+CTRL:add a waypoint        加一个轨迹点 (2)SHIFT+ALT:remove a waypoint     移除一个轨迹点 2.INfo (1)Path Length:轨迹长度 3.Tween Options (1)AutoPlay:自动播放 (2)AutoKill:播放完自动销毁动画 (3)Duration:动画时长 SpeedBased:If selecte

Cocos2d-x 3.2 学习笔记(八)Action

Action -动作.所有精灵的表现,人机交互的表现,都是动作.cocos2dx 里面封装的动作可谓是丰富! Action有三个子类 1.FiniteTimeAction类是所有在有限时间能够完成的动作(action)的基类. 2.Follow是一种“跟随”某一个节点的动作. 3.Speed类改变一个action的运行速度,使他持续更长时间 (speed>1)或者更短的时间(speed<1).(Speed对象不能作为一个动作序列的一部分, 因为它不是一个ActionInterval对象) 其次

Cocos2d-x 3.2 Action动作

本文参考于Cocos2d-x v3.2学习笔记中的(八)动作(Action) Action有三个子类: 1.FiniteTimeAction类:所有在有限时间能够完成的动作(action)的基类. 2.Follow类:一种“跟随”某一个节点的动作. 3.Speed类:改变一个action的运行速度,使他持续更长时间 (speed>1)或者更短的时间(speed<1).(Speed对象不能作为一个动作序列的一部分, 因为它不是一个ActionInterval对象) 其次FiniteTimeAct

B样条曲线曲面

1 B样条曲线 1.1 B样条曲线方程 B样条方法具有表示与设计自由型曲线曲面的强大功能,是形状数学描述的主流方法之一,另外B样条方法是目前工业产品几何定义国际标准--有理B样条方法 (NURBS)的基础.B样条方法兼备了Bezier方法的一切优点,包括几何不变性,仿射不变性等等,同时克服了Bezier方法中由于整体表示带来不 具有局部性质的缺点(移动一个控制顶点将会影响整个曲线).B样条曲线方程可表示为 其中,di(i=0,1...n)为控制顶点(坐标),Ni,k(i=0,1...n)为k次规

清华版CG 实验6 Bezier曲线生成

1.实验目的: 了解曲线的生成原理,掌握几种常见的曲线生成算法,利用VC+OpenGL实现Bezier曲线生成算法. 2.实验内容: (1) 结合示范代码了解曲线生成原理与算法实现,尤其是Bezier曲线: (2) 调试.编译.修改示范程序. 3.实验原理: Bezier曲线是通过一组多边形折线的顶点来定义的.如果折线的顶点固定不变,则由其定义的Bezier曲线是唯一的.在折线的各顶点中,只有第一点和最后一点在曲线上且作为曲线的起始处和终止处,其他的点用于控制曲线的形状及阶次.曲线的形状趋向于多

Bezier曲线绘制 B样条绘制

/*输入点的个数是可以手动改动的,此程序中输入点的最大值设置为. *同时,程序实现了键盘的交互,用来控制程序运行过程中的退出.重画等 */ #include<GL/glut.h> #include<stdlib.h> int W,H; //屏幕的大小 int N =-1; //贝赛尔曲线的幂次 GLfloat Bfunc[15]={0.0}; //Bernstein多项式的值的数组 GLfloat point[15][2]={0.0}; //存储控制点的坐标 void Init()