- 629 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 19:47:13 ]
- 上の方でatan2が無いって困ってる人(俺も困った)がいたんでコード書いてみた
//tanを格納しているテーブル。配列のサイズを変えれば解像度が変わる private static double[] tanTanble = new double[360]; static{ for (int i = 0; i < tanTanble.length; i++){ //tanテーブルの初期化(範囲は90度) double tan = Math.tan(((0.5f / tanTanble.length) * i) * Math.PI); tanTanble[i] = tan; }} public static double atan2(double x, double y){ double absX = Math.abs(x);//90度で計算するので絶対値に変換 double absY = Math.abs(y); int angle = tanTanble.length;//角度 if (absX == 0)angle = tanTanble.length;//90度の場合 else if (absY == 0)angle = 0;//0度の場合 else{ double tan = (double) (absY / absX);//タンジェントを求める for (int i = 0; i < tanTanble.length - 1; i++){ if (tan >= tanTanble[i] && tan <= tanTanble[i + 1]){//角度テーブルの指定範囲内に収まっていたら angle = i;//角度決定 break;}}} if (y >= 0 && x >= 0)angle += 0;//0~90//座標変換 else if (y >= 0 && x <= 0)angle = (tanTanble.length - angle) + (tanTanble.length * 1);//90~180 else if (y <= 0 && x <= 0)angle += (tanTanble.length * 2);//180^270 else if (y <= 0 && x >= 0)angle = (tanTanble.length - angle) + (tanTanble.length * 3);//270~360 double result;//ラジアンに変換 result = (double) (angle) / (double) (tanTanble.length * 4); result = result * (2 * Math.PI); return result;} 疑似atanだから、多分本物のatanよりも早いよ。精度は悪いけど。
|

|