円形座標を使う



円形座標を扱うには三角比を用いますが、その三角比を求めるには拡張DLL、hspext.dll等を使わなければなりません。
おそらく求める計算式があるのだとは思いますが、かなりの数学の技術が無ければ出来ないと思います。
私はそんな方法全くわかりませんので、別の方法で行きます。
もっとも高速な方法としてはサインコサインのテーブル、つまり配列を作っておく事です。
hspext.dllのemcosやemsinで取得した値をテーブルとして保存しておくのもいいですが、 hspext.dllの角度は256度しかないという所が私は嫌いなので、自力で配列作りました。 HSPでは完全な実数は扱えないので、10000倍とかして整数の状態で格納しておき、 計算の最後に10000で割るという使い方になってしまいますが、ちゃんと機能します。
まずサンプルですが、これはソース内に直接配列を書きこんでいるのであまり効率的ではありません。
本来はテーブルを別ファイルに保存しておき、それを読みこんで使用するのがいいと思います。
また、このサンプルでは上方向が0°で時計回りに角度が増えます。
ちなみにこの配列は高校の教科書より自分で記述しました。

	dim sin,360
	dim cos,360
	cos.0=0,175,349,523,698,872,1045,1219,1392,1564
	cos.10=1736,1908,2079,2250,2419,2588,2756,2924,3090,3256
	cos.20=3420,3584,3746,3907,4067,4226,4384,4540,4695,4848
	cos.30=5000,5150,5299,5446,5592,5736,5878,6018,6157,6293
	cos.40=6428,6561,6691,6820,6947,7071,7193,7314,7431,7547
	cos.50=7660,7771,7880,7986,8090,8192,8290,8387,8480,8572
	cos.60=8660,8746,8829,8910,8988,9063,9135,9205,9272,9336
	cos.70=9397,9455,9511,9563,9613,9659,9703,9744,9781,9816
	cos.80=9848,9877,9903,9925,9945,9962,9976,9986,9994,9998,10000
	repeat 90
		c=90-cnt
		sin.cnt=-cos.c	;第一象限サイン
	loop
	repeat 90,90
		c=cnt-90
		sin.cnt=cos.c	;第四象限サイン
		cos.cnt=-sin.c	;第四象限コサイン
	loop
	repeat 180,180
		c=cnt-180
		sin.cnt=-sin.c	;第二、第三象限サイン
		cos.cnt=-cos.c	;第二、第三象限コサイン
	loop

	r=100	;円形の半径
	repeat 360
		pos r*cos.cnt/10000+r,r*sin.cnt/10000+r
		mes "●"
		await 5
	loop
	stop

かなり正確に出来ます。
これで円形座標を扱えるようになりますが、なんだか配列分が無駄な感じがします。
コンパイルしたときのサイズを見てみると1000バイトぐらいになっています。少しでもサイズを押さえたいときにこの分は無駄です。
そこで、擬似的にサインコサインテーブルを作成するスクリプトを組んで見ましょう。
とりあえずソースを先に…。

	r=1000	;円形の半径(精度)
	dim px,r*2+1	;座標格納用配列(なぜかこれでジャスト)
	fy=r
	repeat r+1
		x=cnt
		y2=r*r-(x*x)	;三平方の定理
		i=y2 : s=i
		repeat	;平方根計算ループ
			if i=0 : y=0 : break
			e=s : s=i/s+s>>1
			if s>=e : y=s : break
		loop
		repeat fy-y+1
			px.count=x
			count++	;格納座標の個数のカウント
		loop
		fy=y
	loop
	dim sin,360
	dim cos,360
	repeat 90,1	;cos.0は0でいいのでとばす
		c=count*cnt/90-1
		cos.cnt=px.c*10000/r	;第一象限コサイン
	loop
	repeat 90
		c=90-cnt
		sin.cnt=-cos.c	;第一象限サイン
	loop
	repeat 90,90
		c=cnt-90
		sin.cnt=cos.c	;第四象限サイン
		cos.cnt=-sin.c	;第四象限コサイン
	loop
	repeat 180,180
		c=cnt-180
		sin.cnt=-sin.c	;第二、第三象限サイン
		cos.cnt=-cos.c	;第二、第三象限コサイン
	loop

	r=100	;円形の半径
	repeat 360
		pos r*cos.cnt/10000+r,r*sin.cnt/10000+r
		mes "●"
		await 5
	loop
	stop

このスクリプトで作成する事が出来るのは近似値です。
完全なテーブルにはなりませんが、十分に出来ると思います
作成方法についてですが、この方法ではまず三平方の定理によって円形の第一象限だけを作成し、(三平方の定理だけでも円を書く事は出来ます) その作成した部分の座標を1ドット1ドット全てを変数に格納します。
その配列を90等分した要素を取得すればコサインテーブルの一部が出来あがります。
更にその作成されたコサインテーブルの一部から残りの配列を作成し、完成です。
少し作成に時間がかかってしまうのが難点ですが、そこは使い方を考えてください。

大体精度は90<r<10000ぐらいですね。あまり大きくすると扱える正の整数の範囲を超えてマイナスになってしまい、エラーになるので…。
10000ぐらいで大丈夫だと思います。



戻る 次へ