スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

平方根リターンズ

以前にも平方根コモンとか座標間の距離で書いてきたので何度目だよって話ですが、
それっぽい処理ができたのでご紹介。
書いておいてなんなんですが、使い道はあんまりないんですよね。
擬似3Dだと正確に計算すると魚眼レンズっぽくなっちゃうし、距離を求めるのも三角関数使えばいい話だし。
当たり判定とかも、距離として扱わないでR^2と定数^2で比べれば円形判定も出来ますからね。
さっき公式見に行ったらN乗根求めるコモンとかあったんで、
単なる平方根じゃ太刀打ち出来ないんでここでこっそり公開することにします。

それは置いておいて解説です。

■条件分岐(変数): 【1】CSelf0[元の数値] が 1以下
-◇分岐: 【1】 [ CSelf0[元の数値] が 1以下 ]の場合↓
|■変数操作: CSelf10[Xn+1] = CSelf0[元の数値] + 0
|■イベント処理中断
|■
◇分岐終了◇
■条件分岐(変数): 【1】CSelf0[元の数値] が 10000000以上 【2】CSelf0[元の数値] が 100000以上 【3】CSelf0[元の数値] が 1000以上
-◇分岐: 【1】 [ CSelf0[元の数値] が 10000000以上 ]の場合↓
|■変数操作: CSelf11[Xn] = 45000 + 0
|■
-◇分岐: 【2】 [ CSelf0[元の数値] が 100000以上 ]の場合↓
|■変数操作: CSelf11[Xn] = 3163 + 0
|■
-◇分岐: 【3】 [ CSelf0[元の数値] が 1000以上 ]の場合↓
|■変数操作: CSelf11[Xn] = 317 + 0
|■
-◇上記以外
|■条件分岐(変数): 【1】CSelf0[元の数値] が 10以上
|-◇分岐: 【1】 [ CSelf0[元の数値] が 10以上 ]の場合↓
||■変数操作: CSelf11[Xn] = 32 + 0
||■
|-◇上記以外
||■変数操作: CSelf11[Xn] = CSelf0[元の数値] / 2
||■
|◇分岐終了◇
|■
◇分岐終了◇
■ループ開始
|■変数操作: CSelf10[Xn+1] = CSelf11[Xn] + 0
|■変数操作: CSelf10[Xn+1] += CSelf0[元の数値] / CSelf11[Xn]
|■変数操作: CSelf10[Xn+1] /= 2 + 0
|■条件分岐(変数): 【1】CSelf10[Xn+1] が CSelf11[Xn]と同じ 【2】CSelf10[Xn+1] が CSelf11[Xn]以上
|-◇分岐: 【1】 [ CSelf10[Xn+1] が CSelf11[Xn]と同じ ]の場合↓
||■ループ中断
||■
|-◇分岐: 【2】 [ CSelf10[Xn+1] が CSelf11[Xn]以上 ]の場合↓
||■変数操作: CSelf10[Xn+1] = CSelf11[Xn] + 0
||■ループ中断
||■
|◇分岐終了◇
|■変数操作: CSelf11[Xn] = CSelf10[Xn+1] + 0
|■
◇ループここまで◇◇



ちょっと長く見えますが、実質は上部の条件分岐で初期値を設定して、ループ部分で近似値をニュートン法とやらで求めてるだけです。
返り値はウディタの仕様に従って、小数切り捨て。
精度が欲しければ、00なり0000なり付け加えてから計算すれば、精度は1%以内、0.1%以内になります。
20億ぐらい(解41000ぐらい)までは計算可能。
マイナスはそのままの値を返します。面倒なので。
普通2乗して足すから負の数にはならないですよね。
オーバーフローしたらなりますが、そこは気づいてください。>自分


工夫したのは初期値の与え方。
ウディタでは1~20億までの整数なので、処理が増えすぎない程度に近い値をと思いこういう妙な分岐になりました。

もうひとつ、ループ中断条件もちょっと工夫しました。
整数で計算する性質上なのかは分かりませんが、
解がぴったり整数になる値-1を与えると収束しないんですよね。(399とか、999999とか)
なので、Xn+1=Xn(標準はこっち)の他に、Xn+1>Xnのときに解をXnにしてループ中断してやると、
きっちり整数部分だけを保持してくれるように。
ここも、精度を気にしなければ「Xn+1>=Xnのときに解をXn」の分岐だけで済むので
見た目の短さにこだわれば22行、変数3つだけで実装できました。


割り算(他の計算よりちょっと計算時間が長い)を削れる方法とかもあるみたいなんですけど、
それを実施するとコマンド数が1ループにつき2~3行増えてしまうので、
結果的に処理が増えるので見送り。


計算回数を気にしなければ、初期値はざっくり削って、Xn=Cself0だけでも大丈夫です。
削った場合はコマンド数1~200回、
ここに載せた処理だと50~80回で収束します。
ここでは1~20億を想定してこの数値ですが、
よく使う数値に応じて初期値は工夫した方がいいと思います。


ファイルはこちら。
平方根コモン
あんまりコメントとかはないです。適当にどうぞ。
関連記事

Comment

Post a comment

非公開コメント

お知らせ

記事移行完了

記事をFC2からcatgames.16mb.comへ移行完了しました。

このサイトは更新されません。

カウンター

2012/09~

メールフォーム

名前:
メール:
件名:
本文:

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。