折れ線で曲線を近似する

では、円弧を描く命令を定義してみます。その前に、曲線を描く基本的な考え方を確認しておきます:

  1. 適当な分割数を設定
  2. 分割数で曲線を区間分割して、(分割数+1)個の端点の列を作る
  3. その点列を結ぶ折れ線を引く

ここで、分割数は多ければ多いほど曲線を滑らかに近似できることに注意してください。曲線が複雑だと、十分に分割数を多くとらないと近似が粗くなってしまうので、柔軟に対応できるように分割数は(グローバル)変数にしておきます。ちなみに、これから扱う曲線ぐらいなら、分割数はせいぜい20でも十分です。

次に、区間分割ですが、描きたい曲線をパラメータ(媒介変数)表示できる場合、与えるパラメータを(分割数+1)段階に変化させて点列に記録するだけです。

あとは、点列を前節で作った「折れ線」関数に渡してやるだけです。

円弧

描く円弧のパラメータ表示には普通に三角関数を使いましょう。「円弧」命令の引数の渡した方は何通りか考えられますが、円弧の中心点と、線を引く始点、そして弧の円周角を与えることにします。

分割数とは整数=32

●偏角(X,Yの)
 もしXが0ならば
  もしY>0ならば
   HALF_PIを戻す
  違えば # もしY≦0ならば
   -HALF_PIを戻す
 違えば、もしX>0ならば
  ARCTAN(Y/X)を戻す
 違えば # もしX<0ならば
  ARCTAN(Y/X)+PIを戻す

●極座標変換(X,Yを{参照渡し}R,{参照渡し}θへ|θに)
 R=HYPOT(X,Y)
 θ=X,Yの偏角

●折れ線({グループ=?母艦}OBJの{配列}Sへ|OBJにSで)
 (Sの要素数-1)回
  OBJのS[回数-1][0],S[回数-1][1]からS[回数][0],S[回数][1]へ線

# 「母艦の100,100と200,200からPI/3だけ円弧」のように使う
●円弧({グループ=?母艦}OBJのX0,Y0とX1,Y1からαだけ|OBJにY0でY1よりαまで)
 Rとは数値。θとは数値。
 (X1-X0),(Y1-Y0)をR,θへ極座標変換
 Δθとは数値=α/分割数
 点列とは配列。
 点列[0][0]=X1。点列[0][1]=Y1
 (分割数)回
  θにΔθを直接足す
  点列[回数][0]=X0+R*COS(θ)
  点列[回数][1]=Y0+R*SIN(θ)
 OBJに点列で折れ線

引数が多くなってしまったので、助詞の指定が少し分かりにくくなってしまったかもしれません。

引数のつけ方は、他にもいくつか考えられます。例えば、半径、中心点と、円弧の始動径と終動径を与える、などです。描くのが円弧なだけに、ある程度は極表示で指定することもできる訳ですね。