![{\mathbf{B}(t)=\sum_{i=0}^n {n\choose i}(1-t)^{n-i}t^i\mathbf{P}_i =(1-t)^n\mathbf{P}_0+{n\choose 1}(1-t)^{n-1}t\mathbf{P}_1+\cdots
+{n\choose n-1}(1-t)t^{n-1}\mathbf{P}_{n-1}+t^n\mathbf{P}_n,\quad t \in [0,1],}](http://upload.wikimedia.org/math/8/0/5/8057cd4e32ac493d87b1a725422e7aaa.png)

위키미디아 에 나와있는 베지어 공식입니다.
위 식을 액션스크립트 3 코드로 짜보았습니다.
package sk_engine.math {
/**
* @author Lee Seul - ki
* http://webnoon.net
*/
public class Bezier {
public function Bezier():void
{
}
/*
* 매개변수 t는 분활되는 정도. 값이 클수록 비용이 크다.
*/
public static function getPath(t:uint,pt:Vector.<Number>):Vector.<Number>
{
var n : uint = pt.length*.5 - 1 ;
var path : Vector.<Number> = new Vector.<Number>() ;
var dist : Number = 1 / t ;
var tv : Number = 0 ;
for (var j : Number = 0; j <= t; j++) {
var x : Number = 0 ;
var y : Number = 0 ;
for (var i : int = 0; i <= n; i++) {
x += cn(n,i)*Math.pow((1-tv),n-i)*Math.pow(tv, i)*pt[i*2] ;
y += cn(n,i)*Math.pow((1-tv),n-i)*Math.pow(tv, i)*pt[i*2+1] ;
}
path.push(x);
path.push(y);
tv += dist ;
}
return path ;
}
/*
* (n i) 연산
*/
private static function cn(n : uint, i : uint):Number
{
return factorial(n)/(factorial(i)*factorial(n-i)) ;
}
/*
* 팩토리얼 연산
*/
private static function factorial(val:int):uint
{
var cr : uint = 1 ;
for (var i : int = val; i > 1; i--) {
cr *= i ;
}
return cr ;
}
}
}
* @author Lee Seul - ki
* http://webnoon.net
*/
public class Bezier {
public function Bezier():void
{
}
/*
* 매개변수 t는 분활되는 정도. 값이 클수록 비용이 크다.
*/
public static function getPath(t:uint,pt:Vector.<Number>):Vector.<Number>
{
var n : uint = pt.length*.5 - 1 ;
var path : Vector.<Number> = new Vector.<Number>() ;
var dist : Number = 1 / t ;
var tv : Number = 0 ;
for (var j : Number = 0; j <= t; j++) {
var x : Number = 0 ;
var y : Number = 0 ;
for (var i : int = 0; i <= n; i++) {
x += cn(n,i)*Math.pow((1-tv),n-i)*Math.pow(tv, i)*pt[i*2] ;
y += cn(n,i)*Math.pow((1-tv),n-i)*Math.pow(tv, i)*pt[i*2+1] ;
}
path.push(x);
path.push(y);
tv += dist ;
}
return path ;
}
/*
* (n i) 연산
*/
private static function cn(n : uint, i : uint):Number
{
return factorial(n)/(factorial(i)*factorial(n-i)) ;
}
/*
* 팩토리얼 연산
*/
private static function factorial(val:int):uint
{
var cr : uint = 1 ;
for (var i : int = val; i > 1; i--) {
cr *= i ;
}
return cr ;
}
}
}
이것을 활용한 예제를 보시려면 이곳으로 가세요.
'프로그래밍 > Actionscript3.0' 카테고리의 다른 글
| Flash Actionscript Media Art - Line (0) | 2010/01/21 |
|---|---|
| 액션스크립트와 수학 - Bezier(베지어) 곡선 소스 source (0) | 2010/01/11 |
| 액션스크립트 3 . 전구줄 효과 (0) | 2010/01/11 |
| 액션스크립트 3 - 확률 구하는 알고리즘 (0) | 2010/01/02 |



