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