`

[转] n次贝塞尔曲线AS再现

阅读更多
http://bbs.9ria.com/viewthread.php?tid=71904&extra=page%3D1%26amp;orderby%3Ddateline%26amp;filter%3D86400


新年快到了,再也忍不住几个月不发帖了,这贴主要内容有:
1)n次方贝塞尔曲线(以1-10阶次为例子)
2)n次方贝塞尔曲线(Can Move版)(曲线可以移动,而效率不错哟,包括10次贝塞尔曲线)
3)n次方贝塞尔曲线(等分)(简单版等分,详细在
http://bbs.9ria.com/thread-24082-1-1.html
中,不同的是,俺不使用复杂的公式)

新年系列之——n次贝塞尔曲线AS再现出发!!
以俺的思路讲解,如果有必要的话,看看其他资料,保证对不明白贝塞尔曲线的兄弟们了解提升 一大步。

看看二次、三次的贝塞尔曲线公式:



其公式主要成分为基函数(贝塞尔曲线计算耗时的原因),基函数推导过程(以二次为例):




如此类推。。。所有的基函数数值都能计算出来
如果你还是一头汗!!那也没关系,先看看代码,基函数的代码
function BEZ(n:int,k:int,t:Number):Number {//基函数
        return C(n,k)*Math.pow(t,k)*Math.pow(1-t,n-k);
}
function C(n:int,k:int):Number {//组合排序
        var son:int=jie_cheng(n);
        var mother:int=jie_cheng(k)*jie_cheng(n-k);
        return son/mother;
}
function jie_cheng(i:int):int {//阶乘
        var n:int=1;
        for (var j:int=1; j<=i; j++) {
                n*=j;
        }
        return n;
}



二次贝塞尔曲线一个点要计算出6次基函数数值,因此越平滑,越高阶的贝塞尔曲线,会越折磨CPU的。
要画出一个贝塞尔曲线的一个点在上面的第一张图中已经看出了,所以完整的帧代码为:
var points:Array = [];
var sp:Sprite=new Sprite();
var n:int = 5;
addChild(sp);
draw_points(points,n);
function P_BEZ(t:Number,sz:Array):Point {//n次
        var x_p:Number = 0;
        var y_p:Number = 0;
        var n:int = sz.length;
        for (var i:int=0; i<sz.length; i++) {
                var b:Number = BEZ(n - 1,i,t);
                x_p += sz[i].x * b;
                y_p+=sz[i].y*b;
        }
        return (new Point(x_p,y_p));
}
function BEZ(n:int,k:int,t:Number):Number {//基函数
        return C(n,k)*Math.pow(t,k)*Math.pow(1-t,n-k);
}
function C(n:int,k:int):Number {//组合排序
        var son:int=jie_cheng(n);
        var mother:int=jie_cheng(k)*jie_cheng(n-k);
        return son/mother;
}
function jie_cheng(i:int):int {//阶乘
        var n:int=1;
        for (var j:int=1; j<=i; j++) {
                n*=j;
        }
        return n;
}
function draw_points(sz:Array,n:int):void {
        sz.length=0;
        for (var i:int=0; i<=n; i++) {
                sz[i]=new Point(800*Math.random(),500*Math.random());
                draw_point(sz[i]);
        }
        draw_lines(sz);
        sp.graphics.lineStyle(2,0xff0000);
        var p:Point=P_BEZ(0,sz);
        sp.graphics.moveTo(p.x,p.y);
        for (var j:Number=0; j<1; j+=0.01) {
                p=P_BEZ(j,sz);
                sp.graphics.lineTo(p.x,p.y);
        }
        p=P_BEZ(1,sz);
        sp.graphics.lineTo(p.x,p.y);
}
function draw_point(p:Point):void {//画点
        sp.graphics.lineStyle(0);
        sp.graphics.drawCircle(p.x,p.y,3);
}
function draw_lines(sz:Array):void {//画边
        sp.graphics.lineStyle(0,0,0.3);
        sp.graphics.moveTo(sz[0].x,sz[0].y);
        for (var i:int=0; i<sz.length; i++) {
                var p:Point=sz[i];
                sp.graphics.lineTo(p.x,p.y);
        }
}


5阶次的贝塞尔曲线



10阶次的贝塞尔曲线



1阶次的贝塞尔曲线





那么,要移动10阶次的贝塞尔曲线,需要怎么做?
一切都是基函数的问题,就从他入手。
假设需要画100个点(已经可以画出很平滑的曲线了)
var sep:int = 100;
复制代码
如果阶次肯定地话,基函数的数值也就肯定了,如10阶次,一个点x坐标、y坐标分别需要计算出11个基函数数值。
把它保存起来
var datas:Array = [];
复制代码
以后需要的时候使用,这样就会得到意识不到的效果。(当然,3次贝塞尔曲线就足以模拟n次贝塞尔曲线,as3.0也是如此,但是做出实实在在的n次贝塞尔曲线,实在 )
效果图(移动前):



效果图(移动后):



效果图: 下载 (41.44 KB)




初始化时CPU会高一些,此后CPU都十分理想。哈哈,代码会在最后给出。




本帖最后由 shen_0_ 于 2011-1-7 18:37 编辑


http://bbs.9ria.com/thread-24082-1-1.html   帖子已经解答出等分的问题,但是考虑其效果的用途,可以再简单一些
我使用一个点
var p:Point=P_BEZ(0,sz);
复制代码
将曲线大致跟踪了一次(画的同时)
在画的时候不是画出真正的贝塞尔曲线,而是画出其相似的等分线段:



当然密集时会产生不理想的效果





这个教程告一段落! 新的一年要更加努力呀!!!!


  • 大小: 22.5 KB
  • 大小: 33.7 KB
  • 大小: 30.9 KB
  • 大小: 36.2 KB
  • 大小: 26.8 KB
  • 大小: 34.9 KB
  • 大小: 37.1 KB
  • 大小: 41.4 KB
  • 大小: 27.4 KB
  • 大小: 14.6 KB
分享到:
评论
1 楼 xellosssky 2011-03-07  
感谢楼主分享,最想做连接2点的随机曲线,用了万有引力公式,结果一个点变成另一个点的“卫星”,不断的绕着转了…… 。现在可以尝试下贝塞尔曲线公式了

相关推荐

    c# 二次贝塞尔曲线算法

    根据控制点的数量不同,贝塞尔曲线可以分为线性贝塞尔曲线(一次)、二次贝塞尔曲线、三次贝塞尔曲线等。本文将重点介绍二次贝塞尔曲线及其在C#中的实现方法。 #### 二、二次贝塞尔曲线简介 二次贝塞尔曲线是由三个...

    2次贝塞尔曲线算法

    一个简单的策略是将360度的圆弧等分为n段,每一段对应一个三次贝塞尔曲线。对于更小的圆弧,可以根据其弧度相对于360度的比例来决定分段数。 **控制点的确定** 得到分段数后,接下来的任务是确定每个三次贝塞尔...

    圆弧与贝塞尔曲线互相转换

    三次贝塞尔曲线是贝塞尔曲线中的一种,其特点是具有四个控制点,包括起点、终点以及两个控制点。三次贝塞尔曲线能够提供足够的灵活性来近似较为复杂的曲线形状。 总结来说,圆弧与贝塞尔曲线的互相转换是一个复杂但...

    贝塞尔曲线 [N次] [核心算法]

    利用 De Casteljau算法生成n次的贝塞尔曲线 , 为了实现军标

    用Opengl实现三次贝塞尔曲线

    此外,对于学习者来说,了解贝塞尔曲线的性质,如线性不等价性(改变控制点的位置不会改变曲线的形状)、平滑性(曲线在控制点处的切线可通过相邻控制点确定)和可分解性(任何三次贝塞尔曲线都可以拆分成两个二次...

    n点贝塞尔曲线(Bézier curve)C++程序.rar

    贝塞尔曲线(Bézier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线。一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋,我们...

    c#/WPF二次贝塞尔曲线

    这篇关于“C#/WPF二次贝塞尔曲线”的主题将深入探讨二次贝塞尔曲线的概念、参数方程以及如何在C# WPF应用中实现它的绘制。 二次贝塞尔曲线是一种由两个控制点和一个起始点及结束点定义的参数曲线。这种曲线在图形...

    二次贝塞尔曲线算法(TC)

    用TC生存二次贝塞尔曲线,其实稍微改一下就可以实现三次贝塞尔曲线的了。

    visualization7_三次贝塞尔曲线的绘制_

    三次贝塞尔曲线是一种在计算机图形学中广泛应用的数学模型,常用于曲线的平滑插值和形状设计。本文将深入探讨三次贝塞尔曲线的基本概念、数学公式、OpenGL实现及其在可视化中的应用。 三次贝塞尔曲线是由四个控制点...

    java 二次贝塞尔曲线算法

    java 二次贝塞尔曲线算法,根据起点、终点和控制点输出点集合

    VC++三次样条插值和贝塞尔曲线实例程序.zip_VC++ 三次样条_vc 贝塞尔曲线_三次样条曲线_曲线插值_贝塞尔曲线

    本篇文章将深入探讨两个关键概念:三次样条插值和贝塞尔曲线,以及它们在VC++环境中的实现。我们将通过分析标题和描述提供的信息,结合标签中的关键词,来详细阐述这两个概念及其在实际编程中的应用。 首先,我们来...

    BezierCurve 贝塞尔曲线计算 c++源码

    一阶贝塞尔曲线就是简单的线段,二阶贝塞尔曲线则类似于一个平滑的三次方曲线,以此类推。 本项目提供的源码是基于VS2013的工程,因此它兼容Microsoft的C++编译器,并且应该可以直接在Visual Studio环境中打开和...

    贝塞尔曲线原理及其算法实现

    3. **统一方法**:贝塞尔曲线的表示方式可以统一处理不同类型的曲线,如直线、二次曲线(抛物线、椭圆部分)和三次曲线。这意味着,无论曲线的复杂程度如何,处理和编辑的方法保持一致,减少了学习曲线,并提高了...

    Qt 中实现任意阶贝塞尔曲线绘制 & 动态调节

    Qt 中有相当方便的绘制接口 ( 由 QPainter 提供 ) 。 例如贝塞尔曲线的 API: QPainterPath 的 quadTo() 和 ...因此,我想到利用贝塞尔的公式生成曲线点,然后用直线来连接,即可实现「 N阶贝塞尔曲线绘制 」。

    三次贝塞尔曲线 鼠标控制

    三次贝塞尔曲线是一种在计算机图形学中广泛应用的数学模型,用于创建平滑的曲线路径。它的名字来源于法国工程师皮埃尔·贝塞尔(Pierre Bézier),他在20世纪60年代初发展了这种曲线。三次贝塞尔曲线由四个控制点...

    EXCELVBA贝塞尔曲线及插值_贝塞尔平滑_EXCELVBA贝塞尔曲线及插值_excelvba插值_

    最常见的是一阶贝塞尔曲线(线段),二阶贝塞尔曲线(三次方贝塞尔曲线)和三阶贝塞尔曲线(四次方贝塞尔曲线)。在VBA中,可以通过数学公式来计算曲线上的任意点位置。 二阶贝塞尔曲线的公式如下: B(t) = (1 - t)...

    C++三次贝塞尔曲线绘制源代码

    C++实现的三次贝塞尔曲线绘制,可拖动控制点修改曲线形状,包含源代码和可执行文件,VS2008的工程。 C++实现的三次贝塞尔曲线绘制,可拖动控制点修改曲线形状,包含源代码和可执行文件,VS2008的工程。

    使用delphi演示贝塞尔曲线的绘制

    根据控制点的数量,贝塞尔曲线可以分为线性贝塞尔曲线(两个控制点)、二次贝塞尔曲线(三个控制点)和三次贝塞尔曲线(四个控制点)。更复杂的曲线可以通过连接多个贝塞尔曲线段来实现。 在Delphi中,使用...

    c# 贝塞尔曲线, 只有几行代码就可以实现,非常简单,可以在游戏中使用

    贝塞尔曲线的基本形式是线性贝塞尔曲线,之后扩展到二次和三次贝塞尔曲线,更复杂的曲线可以通过组合这些基本形式来实现。线性贝塞尔曲线由两个控制点定义,二次贝塞尔曲线需要三个控制点,而三次贝塞尔曲线需要四个...

Global site tag (gtag.js) - Google Analytics