2006/11/28(火) [n年前の日記]
#1 [iappli][prog] sin、cos、arctan
カード表示部分を作成中。円運動をさせたいが、iモード端末用のjavaには、sin(), cos() がない。ということで作成しないといけない。
◎ sin,cos。 :
まず、テーブル部分を perl で出力。
perl の sin() を使っちゃったので、精度云々は知らない…。ホントはテイラー展開なるもので求めたりするらしいけど。そのへんなにがなんだかさっぱり状態で。テイラー展開って、大学1年あたりでやってるはず、という話なのだけど。工業系の専門科目以外は軒並み赤点だった自分なので単語すら覚えてないぐらいに数学はダメダメなのです。
java のサブルーチン。
my $pai = 3.14159265358979323846264338327950288; my $c = 0; for ( my $i = 0; $i < ($pai / 2); $i += ($pai / 128) ) { print int(sin( $i ) * 0x1000), ", "; print " //\n" if ($c & 0x0f) == 0x0f; $c++; }0〜90度分のsin値のテーブルを作る。このテーブルで、90〜360度分のsin値、およびcos値も得る。
perl の sin() を使っちゃったので、精度云々は知らない…。ホントはテイラー展開なるもので求めたりするらしいけど。そのへんなにがなんだかさっぱり状態で。テイラー展開って、大学1年あたりでやってるはず、という話なのだけど。工業系の専門科目以外は軒並み赤点だった自分なので単語すら覚えてないぐらいに数学はダメダメなのです。
java のサブルーチン。
// sinテーブル (0x1000倍してる) static final short[] SIN_TBL = { 0, 100, 200, 301, 401, 501, 601, 700, 799, 897, 995, 1092, 1189, 1284, 1379, 1474, // 1567, 1659, 1751, 1841, 1930, 2018, 2105, 2191, 2275, 2358, 2439, 2519, 2598, 2675, 2750, 2824, // 2896, 2966, 3034, 3101, 3166, 3229, 3289, 3348, 3405, 3460, 3513, 3563, 3612, 3658, 3702, 3744, // 3784, 3821, 3856, 3889, 3919, 3947, 3973, 3996, 4017, 4035, 4051, 4065, 4076, 4084, 4091, 4094, // }; /** * sin値を取得 * * @param angle 角度(256 = 360度) * @return sin値 (4096 = 1.0) */ int getSin(int angle) { int result; angle &= 0x0ff; int sn = 1; if (angle >= 128) { sn = -1; angle -= 128; } if (angle < 64) { result = SIN_TBL[angle]; } else if (angle == 64) { result = 0x1000; } else { result = SIN_TBL[128 - angle]; } return result * sn; } /** * cos値を取得 * * @param angle 角度(256 = 360度) * @return sin値 (4096 = 1.0) */ int getCos(int angle) { return getSin(angle + 64); }これで合ってるのかどうかは知らない。でも、下のような処理で一応円が描けたから、たぶん合ってるんだろう。
g.setColor(Graphics.getColorOfName(Graphics.RED)); for ( int i=0; i<256; i++ ) { int x1 = (SCREEN_W/2) * FLV + (getCos(i+0) * (SCREEN_W / 3)); int y1 = (SCREEN_H/2) * FLV + (getSin(i+0) * (SCREEN_H / 3)); int x2 = (SCREEN_W/2) * FLV + (getCos(i+1) * (SCREEN_W / 3)); int y2 = (SCREEN_H/2) * FLV + (getSin(i+1) * (SCREEN_H / 3)); g.drawLine(x1/FLV, y1/FLV, x2/FLV, y2/FLV); }
◎ arctan。 :
_ゲームヘル2000
なるサイト?で解説が。ほとんどそのまま使わせてもらったり。そう頻繁に呼ばれるものでもないので、処理時間がかかってもOKだし。
昔関わったアレとかソレとかでは、 _このページでレーダー法と呼んでいる やり方だった記憶が。基礎技術研究・ライブラリ作成を専門に行う部署が送ってくれたライブラリをほとんどそのまま使ってただけだから、実はよく覚えてないんだけど…。x と y をある範囲に収まるまで小さくした後に、テーブルを参照して求めてたような気がする。精度は荒いけど速いのだろうと思う。
昔関わったアレとかソレとかでは、 _このページでレーダー法と呼んでいる やり方だった記憶が。基礎技術研究・ライブラリ作成を専門に行う部署が送ってくれたライブラリをほとんどそのまま使ってただけだから、実はよく覚えてないんだけど…。x と y をある範囲に収まるまで小さくした後に、テーブルを参照して求めてたような気がする。精度は荒いけど速いのだろうと思う。
◎ sqrt。平方根を求める。 :
_数値演算のアルゴリズム
というページのソレをそのまま使わせてもらったり…。これも、頻繁に呼ばれるものでもないので、処理時間がかかってもOKだろうと。
_ニュートン法で平方根を求める という話も気になる。
_ニュートン法で平方根を求める という話も気になる。
◎ 参考にしたページ。 :
[ ツッコむ ]
以上です。