atan2

2010-03-28追記

atan2のLua実装 - 永字八法も参照してください。
atan2 - 永字八法の焼き直し。
指摘を受けて作り直した。バグも取った。

define節

numalias atan2_dig
numalias atan2_dis
numalias atan2_x
numalias atan2_y
numalias atan2_xy
numalias atan2_absx
numalias atan2_absy
numalias atan2_sin

game以下、*startラベル以上

*atan2
	getparam i%atan2_dig,i%atan2_dis,%atan2_x,%atan2_y ; 引数の取得
	; ショートカット群
	if %atan2_x=0 && %atan2_y=0 mov %%atan2_dig,0:mov %%atan2_dis,0:return ; 原点
	if %atan2_x=0 && %atan2_y>0 mov %%atan2_dig,0:mov %%atan2_dis,%atan2_y:return ; 真上
	if %atan2_x=0 && %atan2_y<0 mov %%atan2_dig,180:abs2 %%atan2_dis,%atan2_y:return ; 真下
	if %atan2_x>0 && %atan2_y=0 mov %%atan2_dig,90:mov %%atan2_dis,%atan2_x:return ; 右
	if %atan2_x<0 && %atan2_y=0 mov %%atan2_dig,2700:abs2 %%atan2_dis,%atan2_x:return ; 左

	; 絶対値化処理
	mov %atan2_absx,%atan2_x:if %atan2_absx<0 mul %atan2_absx,-1
	mov %atan2_absy,%atan2_y:if %atan2_absy<0 mul %atan2_absy,-1

	; ここからが肝
	mov %atan2_xy,1000*%atan2_absx/%atan2_absy ; 傾きを計算
	if %atan2_absx<%atan2_absy mov %atan2_xy,1000*%atan2_absy/%atan2_absx
	goto*atan2_000to045 ; 計算する。

*atan2_end
	if %atan2_absx>%atan2_absy mov %%atan2_dig,90-%%atan2_dig ; 表裏
	if %atan2_x>0 && %atan2_y<0 mov %%atan2_dig,180-%%atan2_dig ; 第二象限
	if %atan2_x<0 && %atan2_y<0 add %%atan2_dig,180 ; 第三象限
	if %atan2_x<0 && %atan2_y>0 mov %%atan2_dig,360-%%atan2_dig ; 第二象限
	sin %atan2_sin,%%atan2_dig
	if %atan2_sin=0 mov %%atan2_dis,%atan2_absy:return
	mov %%atan2_dis,1000*%atan2_x/%atan2_sin
return

; atan2の実際
*atan2_000to001
if %atan2_xy>114588 mov %%atan2_dig,0:goto*atan2_end
mov %%atan2_dig,1:goto*atan2_end
*atan2_000to002
if %atan2_xy>38188 goto*atan2_000to001
mov %%atan2_dig,2:goto*atan2_end
*atan2_000to005
if %atan2_xy>22903 goto*atan2_000to002
goto*atan2_003to005
*atan2_000to011
if %atan2_xy>10385 goto*atan2_000to005
goto*atan2_006to011
*atan2_000to022
if %atan2_xy>4915 goto*atan2_000to011
goto*atan2_012to022
*atan2_000to045
if %atan2_xy>2414 goto*atan2_000to022
goto*atan2_023to045
*atan2_003to004
if %atan2_xy>16349 mov %%atan2_dig,3:goto*atan2_end
mov %%atan2_dig,4:goto*atan2_end
*atan2_003to005
if %atan2_xy>12706 goto*atan2_003to004
mov %%atan2_dig,5:goto*atan2_end
*atan2_006to007
if %atan2_xy>8776 mov %%atan2_dig,6:goto*atan2_end
mov %%atan2_dig,7:goto*atan2_end
*atan2_006to008
if %atan2_xy>7595 goto*atan2_006to007
mov %%atan2_dig,8:goto*atan2_end
*atan2_006to011
if %atan2_xy>6691 goto*atan2_006to008
goto*atan2_009to011
*atan2_009to010
if %atan2_xy>5975 mov %%atan2_dig,9:goto*atan2_end
mov %%atan2_dig,10:goto*atan2_end
*atan2_009to011
if %atan2_xy>5395 goto*atan2_009to010
mov %%atan2_dig,11:goto*atan2_end
*atan2_012to013
if %atan2_xy>4510 mov %%atan2_dig,12:goto*atan2_end
mov %%atan2_dig,13:goto*atan2_end
*atan2_012to014
if %atan2_xy>4165 goto*atan2_012to013
mov %%atan2_dig,14:goto*atan2_end
*atan2_012to017
if %atan2_xy>3866 goto*atan2_012to014
goto*atan2_015to017
*atan2_012to022
if %atan2_xy>3171 goto*atan2_012to017
goto*atan2_018to022
*atan2_015to016
if %atan2_xy>3605 mov %%atan2_dig,15:goto*atan2_end
mov %%atan2_dig,16:goto*atan2_end
*atan2_015to017
if %atan2_xy>3375 goto*atan2_015to016
mov %%atan2_dig,17:goto*atan2_end
*atan2_018to019
if %atan2_xy>2988 mov %%atan2_dig,18:goto*atan2_end
mov %%atan2_dig,19:goto*atan2_end
*atan2_018to020
if %atan2_xy>2823 goto*atan2_018to019
mov %%atan2_dig,20:goto*atan2_end
*atan2_018to022
if %atan2_xy>2674 goto*atan2_018to020
goto*atan2_021to022
*atan2_021to022
if %atan2_xy>2538 mov %%atan2_dig,21:goto*atan2_end
mov %%atan2_dig,22:goto*atan2_end
*atan2_023to024
if %atan2_xy>2299 mov %%atan2_dig,23:goto*atan2_end
mov %%atan2_dig,24:goto*atan2_end
*atan2_023to025
if %atan2_xy>2194 goto*atan2_023to024
mov %%atan2_dig,25:goto*atan2_end
*atan2_023to028
if %atan2_xy>2096 goto*atan2_023to025
goto*atan2_026to028
*atan2_023to034
if %atan2_xy>1841 goto*atan2_023to028
goto*atan2_029to034
*atan2_023to045
if %atan2_xy>1455 goto*atan2_023to034
goto*atan2_035to045
*atan2_026to027
if %atan2_xy>2005 mov %%atan2_dig,26:goto*atan2_end
mov %%atan2_dig,27:goto*atan2_end
*atan2_026to028
if %atan2_xy>1920 goto*atan2_026to027
mov %%atan2_dig,28:goto*atan2_end
*atan2_029to030
if %atan2_xy>1767 mov %%atan2_dig,29:goto*atan2_end
mov %%atan2_dig,30:goto*atan2_end
*atan2_029to031
if %atan2_xy>1697 goto*atan2_029to030
mov %%atan2_dig,31:goto*atan2_end
*atan2_029to034
if %atan2_xy>1631 goto*atan2_029to031
goto*atan2_032to034
*atan2_032to033
if %atan2_xy>1569 mov %%atan2_dig,32:goto*atan2_end
mov %%atan2_dig,33:goto*atan2_end
*atan2_032to034
if %atan2_xy>1510 goto*atan2_032to033
mov %%atan2_dig,34:goto*atan2_end
*atan2_035to036
if %atan2_xy>1401 mov %%atan2_dig,35:goto*atan2_end
mov %%atan2_dig,36:goto*atan2_end
*atan2_035to037
if %atan2_xy>1351 goto*atan2_035to036
mov %%atan2_dig,37:goto*atan2_end
*atan2_035to040
if %atan2_xy>1303 goto*atan2_035to037
goto*atan2_038to040
*atan2_035to045
if %atan2_xy>1170 goto*atan2_035to040
goto*atan2_041to045
*atan2_038to039
if %atan2_xy>1257 mov %%atan2_dig,38:goto*atan2_end
mov %%atan2_dig,39:goto*atan2_end
*atan2_038to040
if %atan2_xy>1213 goto*atan2_038to039
mov %%atan2_dig,40:goto*atan2_end
*atan2_041to042
if %atan2_xy>1130 mov %%atan2_dig,41:goto*atan2_end
mov %%atan2_dig,42:goto*atan2_end
*atan2_041to043
if %atan2_xy>1091 goto*atan2_041to042
mov %%atan2_dig,43:goto*atan2_end
*atan2_041to045
if %atan2_xy>1053 goto*atan2_041to043
goto*atan2_044to045
*atan2_044to045
if %atan2_xy>1017 mov %%atan2_dig,44:goto*atan2_end
mov %%atan2_dig,45:goto*atan2_end