package sk_engine.math {
/**
* @author Lee
* http://webnoon.net
*/
public class CatmullRomSpline {
public function CatmullRomSpline($pc:PrivateClass):void
{
}
/*
* 각점의 포인트들을 1차 배열로 받는다.
* n번 보간 사용. 값이 클수록 세밀한 곡선.
*/
public static function curve($points:Vector.<Number>,$n:int=10):Vector.<Number>
{
var len : int = $points.length ;
if(len<4 || $n==0 || $n<0) return null ;
var returnVector : Vector.<Number> = new Vector.<Number>() ;
var s0x : Number = $points[0]*2 - $points[2] ;
var s0y : Number = $points[1]*2 - $points[3] ;
var s1x : Number = $points[len-2]*2 - $points[len-4] ;
var s1y : Number = $points[len-1]*2 - $points[len-3] ;
var fd : Number = 1/$n ;
for (var i : int = 0; i < len/2-1; i++) {
var p0x : Number = (i==0) ? s0x : $points[2*i-2] ;
var p1x : Number = $points[2*i] ;
var p2x : Number = $points[2*i+2] ;
var p3x : Number = (i==len/2-2) ? s1x : $points[2*i+4] ;
var p0y : Number = (i==0) ? s0y : $points[2*i-1] ;
var p1y : Number = $points[2*i+1] ;
var p2y : Number = $points[2*i+3] ;
var p3y : Number = (i==len/2-2) ? s1y : $points[2*i+5] ;
for (var j : int = 0; j <= $n ; j++) {
var t : Number = fd*j ;
returnVector.push(q(t,p0x,p1x,p2x,p3x)) ;
returnVector.push(q(t,p0y,p1y,p2y,p3y)) ;
}
}
return returnVector ;
}
private static function q($t:Number,p0:Number,p1:Number,p2:Number,p3:Number):Number
{
return 0.5*(2*p1 + (-p0+p2)*$t + (2*p0 - 5*p1 + 4*p2 - p3)*$t*$t + (-p0+3*p1-3*p2+p3)*$t*$t*$t) ;
}
}
}
class PrivateClass
{
public function PrivateClass()
{
}
}
사용방법은.. 곡선을 이을 포인트(x,y쌍) 배열을 매개변수로 넘긴다. $n 은 보간 정도..