チェンジセット 19

差分発生行の前後
無視リスト:
コミット日時:
2007/05/27 21:36:38 (6 年前)
コミッタ:
michi
ログメッセージ:

math関連のクラス

ファイル:

凡例:

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

    r14 r19  
    1515*/ 
    1616 
     17import flash.geom.Point; 
     18import com.seyself.util.QuadraticBezier; 
     19import com.seyself.util.CubicBezier; 
     20 
    1721/** 
    1822* com.seyself.math.GeomMath 
    1923*  
    2024* 形状に関する計算処理もろもろ 
    21 * 静的関数のみで構成されています。 
     25* static関数のみで構成されています。 
    2226*  
    2327* @author               Michiyasu Wada 
     
    2630{ 
    2731         
    28         /** 
    29         * インスタンスを作成するためにはサブクラスが必要です。 
    30         */ 
    3132        private function GeomMath(){} 
    3233         
    3334        /** 
    34         * 多角形の面積を求めます。 
     35        * 3つ以上の直線によって構成された多角形の面積を求めます。 
    3536        * 引数には x, y の数値プロパティを持つオブジェクトを3つ以上渡す必要があります。 
    3637        *  
     
    4445        * var d = { x:25 , y:80 }; 
    4546        * var e = { x:15 , y:80 }; 
    46         * trace( GeomMath.PolygonArea( a, b, c, d, e ) ); // 出力 : 650 
    47         * </code> 
    48         */ 
    49         public static function PolygonArea():Number 
     47        * trace( GeomMath.polygonArea( a, b, c, d, e ) ); // 出力 : 650 
     48        * </code> 
     49        */ 
     50        public static function polygonArea():Number 
    5051        { 
    5152                var leng = arguments.length; 
     
    6162        } 
    6263         
     64        /** 
     65        * 楕円形の面積を求めます。 
     66        * 楕円を求めるには最短の直径と最長の直径が分かっていないといけません。 
     67        *  
     68        * @param width : Number -  楕円の最短の直径 
     69        * @param height : Number -  楕円の最長の直径 
     70        * @return Number - 面積 
     71        * @usage <code> 
     72        * import com.seyself.math.GeomMath; 
     73        * trace( GeomMath.ellipseArea( 50 , 100 ) ); // 出力 : 3926.99081698724 
     74        * </code> 
     75        */ 
     76        public static function ellipseArea( width , height ):Number 
     77        { 
     78                return (width/2)*(height/2)*Math.PI; 
     79        } 
     80         
     81        /** 
     82        * 楕円形の円周の近似値を求めます。(楕円積分) 
     83        * 楕円を求めるには最短の直径と最長の直径が分かっていないといけません。 
     84        *  
     85        * @param width : Number -  楕円の最短の直径 
     86        * @param height : Number -  楕円の最長の直径 
     87        * @return Number - 円周の近似値 
     88        * @usage <code> 
     89        * import com.seyself.math.GeomMath; 
     90        * trace( GeomMath.circumference( 50 , 100 ) ); // 出力 : 3926.99081698724 
     91        * </code> 
     92        */ 
     93        public static function circumference( width , height ):Number 
     94        { 
     95                var a = Math.min( width , height ); 
     96                var b = Math.max( width , height ); 
     97                var c = (a-b)/(a+b); 
     98                return Math.PI*(a+b)*( 1+1/4*Math.pow(c,2)+1/64*Math.pow(c,4)+1/256*Math.pow(c,6)); 
     99        } 
     100         
     101         
     102        /** 
     103        * 直線AB と直線CD の交点を求めます。 
     104        * 2つの直線が平行である場合は null を返します。 
     105        *  
     106        * @param a : Point -  直線AB の点Aの座標( x, y の数値プロパティを持つオブジェクト ) 
     107        * @param b : Point -  直線AB の点Bの座標( x, y の数値プロパティを持つオブジェクト ) 
     108        * @param c : Point -  直線CD の点Cの座標( x, y の数値プロパティを持つオブジェクト ) 
     109        * @param d : Point -  直線CD の点Dの座標( x, y の数値プロパティを持つオブジェクト ) 
     110        * @return Point - 2直線の交点座標 
     111        * @usage <code> 
     112        * import com.seyself.math.GeomMath; 
     113        * var a = { x:0 , y:0 }; 
     114        * var b = { x:200 , y:200 }; 
     115        * var c = { x:100 , y:0 }; 
     116        * var d = { x:50 , y:200 }; 
     117        * trace( GeomMath.intersection( a, b, c, d ) ); // 出力 : (x=80, y=80) 
     118        * </code> 
     119        */ 
     120        public static function intersection( a:Object, b:Object, c:Object, d:Object ):Point 
     121        { 
     122                var pos1 = (b.y-a.y)/(b.x-a.x); 
     123                var pos2 = (d.y-c.y)/(d.x-c.x); 
     124                var pi = Number.POSITIVE_INFINITY; 
     125                var ni = Number.NEGATIVE_INFINITY; 
     126                 
     127                if(pos1==pos2){ 
     128                        return null; 
     129                } 
     130                if( pos1 == ni || pos1 == pi ){ 
     131                        pos1 = b.y-a.y; 
     132                } 
     133                if( pos2 == ni || pos2 == pi ){ 
     134                        pos2 = d.y-c.y; 
     135                } 
     136                 
     137                var nx = ( ( a.x*pos1 ) - a.y - ( c.x*pos2 ) + c.y )/( pos1-pos2 ); 
     138                var ny = pos1*( nx-a.x ) + a.y; 
     139                 
     140                return new Point( nx, ny ); 
     141        } 
     142         
     143        /** 
     144        * 2次ベジェ曲線を描くための座標を求めます。 
     145        * 引数には x, y の数値プロパティを持つオブジェクトを3つと中間点の数を渡す必要があります。 
     146        *  
     147        * @param a : Point -  開始点( x, y の数値プロパティを持つオブジェクト ) 
     148        * @param b : Point -  アンカー( x, y の数値プロパティを持つオブジェクト ) 
     149        * @param c : Point -  終了点( x, y の数値プロパティを持つオブジェクト ) 
     150        * @param leng : Number -  戻り値が持つ座標の数 
     151        * @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 ); 
     164        * } 
     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 ); 
     201        } 
     202         
    63203} 
  • michi/as2/src/com/seyself/math/Math2.as

    r14 r19  
    2121*  
    2222* 数値の計算もろもろ。 
    23 * 静的関数のみで構成されています。 
     23* static関数のみで構成されています。 
    2424*  
    2525* @author               Michiyasu Wada 
     
    2727class com.seyself.math.Math2 
    2828{ 
    29         /** 
    30         * インスタンスを作成するためにはサブクラスが必要です。 
    31         */ 
     29         
    3230        private function Math2(){} 
    3331