チェンジセット 108

差分発生行の前後
無視リスト:
コミット日時:
2007/11/20 17:02:30 (6 年前)
コミッタ:
michi
ログメッセージ:

--

ファイル:

凡例:

変更無し
追加
削除
更新
コピー
移動
  • michi/as2/src/com/seyself/math/GeomMath.as

    r20 r108  
    1616 
    1717import flash.geom.Point; 
    18 import com.seyself.util.QuadraticBezier; 
    19 import com.seyself.util.CubicBezier; 
    2018 
    2119/** 
     
    142140         
    143141        /** 
    144         * 2次ベジェ曲線を描くための座標を求めます。 
    145         * 引数には x, y の数値プロパティを持つオブジェクトを3つと中間点の数を渡す必要があります。 
     142        * 2次ベジェ曲線を描くための座標を求めます. 
     143        * 引数には x, y の数値プロパティを持つオブジェクトを3つと中間点の数を渡す必要があります. 
     144        * <listing> 
     145        * import flash.display.Sprite; 
     146        * import flash.geom.Point; 
     147        * import com.seyself.math.GeomMath; 
     148        *  
     149        * var t:Number = 0; 
     150        * var a:Point = new Point( 0, 0 ); 
     151        * var b:Point = new Point( 20, 70 ); 
     152        * var c:Point = new Point( 100, 100 ); 
     153        *  
     154        * var sprite:Sprite = new Sprite(); 
     155        * this.addChild( sprite ); 
     156        * sprite.graphics.lineStyle( 1 , 0 , 1 ); 
     157        * sprite.graphics.moveTo( a.x , a.y ); 
     158        * for(t=0;t<=1;t+=0.05){ 
     159        *       var p:Point = GeomMath.quadraticBezier( a, b, c, t ); 
     160        *       sprite.graphics.lineTo( p.x , p.y ); 
     161        *       trace( p ); 
     162        * } 
     163        * </listing> 
    146164        *  
    147165        * @param a : Point -  開始点( x, y の数値プロパティを持つオブジェクト ) 
    148166        * @param b : Point -  アンカー( x, y の数値プロパティを持つオブジェクト ) 
    149167        * @param c : Point -  終了点( x, y の数値プロパティを持つオブジェクト ) 
    150         * @param leng : Number -  戻り値が持つ座標の数 
     168        * @param t : Number -  戻り値が持つ座標の数 
    151169        * @return Array - 曲線の座標 
    152         * @usage <code> 
    153         * import com.seyself.math.GeomMath; 
    154         * var a = { x:0 , y:0 }; 
    155         * var b = { x:60 , y:120 }; 
    156         * var c = { x:200 , y:200 }; 
    157         * var leng = 30; 
    158         * var path = GeomMath.quadraticBezierPath( a, b, c, leng ); 
    159         * var bexir = this.createEmptyMovieClip( "bezir" , 0 ); 
    160         * bexir.lineStyle( 1 , 0 , 100 ); 
    161         * bexir.moveTo( path[0].x , path[0].y ); 
    162         * for(var i=1;i<path.length;i++){ 
    163         *     bexir.lineTo( path[i].x , path[i].y ); 
     170        */ 
     171        public static function quadraticBezier( a:Object, b:Object, c:Object, t:Number ):Point 
     172        { 
     173                var s:Number = 1-t; 
     174                var nx:Number = s*s*a.x + 2*s*t*b.x + t*t*c.x; 
     175                var ny:Number = s*s*a.y + 2*s*t*b.y + t*t*c.y; 
     176                return new Point( nx , ny ); 
     177        } 
     178         
     179        /** 
     180        * 3次ベジェ曲線を描くための座標を求めます. 
     181        * 引数には x, y の数値プロパティを持つオブジェクトを4つと中間点の数を渡す必要があります. 
     182        * <listing> 
     183        * import flash.display.Sprite; 
     184        * import flash.geom.Point; 
     185        * import com.seyself.math.GeomMath; 
     186        *  
     187        * var t:Number = 0; 
     188        * var a:Point = new Point( 0, 0 ); 
     189        * var b:Point = new Point( 12, 60 ); 
     190        * var c:Point = new Point( 80, 20 ); 
     191        * var d:Point = new Point( 100, 100 ); 
     192        *  
     193        * var sprite:Sprite = new Sprite(); 
     194        * this.addChild( sprite ); 
     195        * sprite.graphics.lineStyle( 1 , 0 , 1 ); 
     196        * sprite.graphics.moveTo( a.x , a.y ); 
     197        * for(t=0;t<=1;t+=0.05){ 
     198        *       var p:Point = GeomMath.cubicBezier( a, b, c, d, t ); 
     199        *       sprite.graphics.lineTo( p.x , p.y ); 
     200        *       trace( p ); 
    164201        * } 
    165         * </code> 
    166         */ 
    167         public static function quadraticBezierPath( a:Object, b:Object, c:Object, leng:Number ):Array 
    168         { 
    169                 return QuadraticBezier.getPath( a , b , c , leng ); 
    170         } 
    171          
    172         /** 
    173         * 3次ベジェ曲線を描くための座標を求めます。 
    174         * 引数には x, y の数値プロパティを持つオブジェクトを4つと中間点の数を渡す必要があります。 
    175         *  
    176         * @param a : Point -  開始点( x, y の数値プロパティを持つオブジェクト ) 
    177         * @param b : Point -  点 a のアンカー( x, y の数値プロパティを持つオブジェクト ) 
    178         * @param c : Point -  点 b のアンカー( x, y の数値プロパティを持つオブジェクト ) 
    179         * @param d : Point -  終了点( x, y の数値プロパティを持つオブジェクト ) 
    180         * @param leng : Number -  戻り値が持つ座標の数 
    181         * @return Array - 曲線の座標 
    182         * @usage <code> 
    183         * import com.seyself.math.GeomMath; 
    184         * var a = { x:0 , y:0 }; 
    185         * var b = { x:120 , y:30 }; 
    186         * var c = { x:60 , y:180 }; 
    187         * var d = { x:200 , y:200 }; 
    188         * var leng = 30; 
    189         * var path = GeomMath.cubicBezierPath( a, b, c, d, leng ); 
    190         * var bexir = this.createEmptyMovieClip( "bezir" , 0 ); 
    191         * bexir.lineStyle( 1 , 0 , 100 ); 
    192         * bexir.moveTo( path[0].x , path[0].y ); 
    193         * for(var i=1;i<path.length;i++){ 
    194         *     bexir.lineTo( path[i].x , path[i].y ); 
    195         * } 
    196         * </code> 
    197         */ 
    198         public static function cubicBezierPath( a:Object, b:Object, c:Object, d:Object, leng:Number ):Array 
    199         { 
    200                 return CubicBezier.getPath( a , b , c , d , leng ); 
     202        * </listing> 
     203        *  
     204        * @param a  開始点( x, y の数値プロパティを持つオブジェクト ) 
     205        * @param b  点 a のアンカー( x, y の数値プロパティを持つオブジェクト ) 
     206        * @param c  点 b のアンカー( x, y の数値プロパティを持つオブジェクト ) 
     207        * @param d  終了点( x, y の数値プロパティを持つオブジェクト ) 
     208        * @param t  戻り値が持つ座標の数 
     209        * @return 曲線の座標 
     210        */ 
     211        public static function cubicBezier( a:Object, b:Object, c:Object, d:Object, t:Number ):Point 
     212        { 
     213                var s:Number = 1-t; 
     214                var nx:Number = s*s*s*a.x + 3*(s*s)*t*b.x + 3*s*(t*t)*c.x + t*t*t*d.x; 
     215                var ny:Number = s*s*s*a.y + 3*(s*s)*t*b.y + 3*s*(t*t)*c.y + t*t*t*d.y; 
     216                return new Point( nx , ny ); 
     217        } 
     218         
     219        public static function toRadian( degrees:Number ) 
     220        { 
     221                var r:Number = degrees % 360; 
     222                if( r<=-180 ) return ( 360+r )/ 180 * Math.PI; 
     223                if( r > 180 ) return -( 360-r )/ 180 * Math.PI; 
     224                return r / 180 * Math.PI; 
     225        } 
     226         
     227        public static function toDegrees( radian:Number ) 
     228        { 
     229                var d:Number = ( radian % ( Math.PI*2 ) ) / Math.PI * 180; 
     230                if( d<0 ) return 360+d; 
     231                return d; 
    201232        } 
    202233