# ブレゼンハムアルゴリズムによる円弧描画関数 !Ωとは数値=2*PI !E8Vとは配列="1,1{~}-1,1{~}-1,-1{~}1,-1"をCSV取得 !IDXとはハッシュ=「10=0{~}11=0{~}01=1{~}-11=1{~}-10=2{~}-1-1=2{~}0-1=3{~}1-1=3」をハッシュ変換 # 「孤」命令の円弧座標。イベント変数との都合上グローバル扱い。 XXとは整数。YYとは整数 /* ※用例 0,0と300,10から2/5*PIの弧 200,150と300,200からPIの弧 300,250と150,300から-4*PI/3の弧 線色は赤色 線太さは1 0,0から300,10へ線 200,150から300,200へ線 300,250から150,300へ線 # */ # 中心点(X0,Y0)、半径Rの円の右下四分の一部分を描画する ●右下四分円({グループ=?母艦}OBJの{整数}X0,{整数}Y0から{整数}Rで)  Xとは整数。Yとは整数=R  Dとは整数=3-2*R。COLとは整数=線色  # R*256 / √2*256 で √2/256=362.0… の近似を使う。  # 普通にSQRT(2)を使ってもいい気はするが徹底してみた。  Xeとは整数=INT((R<<8)/362)  Xを0からXeまで繰り返す   OBJの(X+X0),(Y+Y0)へCOLを点描画   OBJの(Y+X0),(X+Y0)へCOLを点描画   もしD<0ならば    Dに6+4*Xを直接足す   違えば    Dに10+4*X-4*Yを直接足す    Yに-1を直接足す # 中心点(X0,Y0)、始点(X1,Y1)からθ[rad](時計回りが正)の円弧を描画する ●弧({グループ=?母艦}OBJへ{整数}X0,{整数}Y0と{整数}X1,{整数}Y1から{数値}θの)  # 引数から与えられたデータの整理  Rとは整数=CEIL(HYPOT(X0-X1,Y0-Y1))  XX=X1-X0。YY=Y1-Y0  COLとは整数=線色  αとは数値。βとは数値  α=XX,YYの方向  もしABS(θ)>Ωならばθ=Ω  もしθ>0ならば   β=α+θ  違えば   β=α。αにθを直接足す   もしα<-PIならばβにΩを直接足す   XX=R*COS(α)。YY=R*SIN(α)  XX=TOINT(XX)。YY=TOINT(YY)  # ブレゼンハムアルゴリズム用データ初期化  Nとは整数=ABS(INT(2*θ/PI))  Dとは整数。D0とは整数=2-2*R  Iとは整数。Jとは整数。Kとは整数  I=IDX@(XX,YYの方位縮約)。# I:基準方向  D=2#*(1+E8V[I][0]*XX+E8V[I][1]*YY)  I=(I+1)%4。# I:直進方向  J=(I+1)%4。# J:回転方向  内積とは配列。# 普通にベクトル内積計算してたら無駄が大きいので  内積[0]=~_=XX  内積[1]=~_=YY  内積[2]=~_=-XX  内積[3]=~_=-YY  漸化式処理とは配列。# 同上  漸化式処理[0]=~_=1+2*(XXに1を直接足す)  漸化式処理[1]=~_=1+2*(YYに1を直接足す)  漸化式処理[2]=~_=1-2*(XXから1を直接引く)  漸化式処理[3]=~_=1-2*(YYから1を直接引く)  # ブレゼンハムアルゴリズム  必要な 間   OBJのXX+X0,YY+Y0へCOLを点描画   もしD>内積[J]ならば    Dに漸化式処理[J]を直接足す   もしD≦内積[I]ならば    Dに漸化式処理[I]を直接足す   もし(XX==0)||(YY==0)ならば    Nから1を直接引く    I=J。J=(J+1)%4    もしXX<0ならば     βからΩを直接引く    D=D0   もしN≦0ならば    もしXX,YYの方向≧βならば戻る # R^2 ∋ (x,y) → arg(x+iy) ∈ [-π,π) ●方向({数値}X,{数値}Yの)  sgnYとは整数=2*(Y>0)-1  もしXが0ならば   PI*sgnY/2を戻す。# Y>0:π/2 Y≦0:-π/2  違えば   θとは数値。θ=ARCTAN(Y/X)   もしX>0ならばθを戻す   θ+PI*sgnYを戻す # R^2 → IDXハッシュキー ●方位縮約({整数}X,{整数}Yの)  SGN(X)&SGN(Y)を戻す # 符号関数 R → {-1,0,1} ●SGN({整数}N)  もしN>0ならば1を戻す  違えばもしNが0ならば0を戻す  違えば-1を戻す  # (2*(N>0)-1)*(N!=0)を戻す /* ※実験用の関数とグループ # : (-∞,∞)→[-π,π) ※ただし精度の問題上、PI→-PIでなくPI→(精度の悪い)PIと変換される ●ラジアン区間中央化({数値}θを|θの)  θ=θ-Ω*INT(θ/Ω)  もしABS(θ)>PIならば   θから2*(2*(θ>0)-1)*PIを直接引く  θを戻す ■計測器  ・{整数}開始時間  ・{イベント}計測対象  ・所要時間計測〜   開始時間=システム時間   計測対象。   _=システム時間-開始時間 # */