{\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],}

^n\mathbf{C}_i = {n \choose i} = \frac{n!}{i!(n-i)!}.


위키미디아 에 나와있는 베지어 공식입니다.

위 식을 액션스크립트 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 ;
  }
 }
}

이것을 활용한 예제를 보시려면 이곳으로 가세요.
Posted by 웹눈