端点を結ぶような曲線

前節で作った「円弧」命令は、引数に弧の端点を一つ与えましたが、そこからもう一つの端点に向けて曲線を引く、というような用途には不向きです。

そこで今度は、端点を2つ与えたらそれを結ぶような曲線を描く命令を考えてみましょう。基本的な、単純な曲線を目的の方向へ回転するという考え方で点列を算出し描きます。

放物線

まずは放物線を使ってやってみましょう。使う式は次の式です:

y=x(1-x)

これを、使いやすいように少し変えてパラメータ表示にします:

x=r*t, y=4*a*t(1-t)

但し、0≦t≦1とします。 r は端点間の直線距離を表すパラメータで、 a は曲線の曲がり具合のパラメータです。

始点 (X1, Y1) から見た終点 (X2, Y2) の位置ベクトル (X2-X1, Y2-Y1) を極座標変換して (R, θ) とします。 r は端点間の直線距離を表すので、パラメータ r = R に設定して、曲線全体をθ回転し (X1, Y1) だけ平行移動すれば、 t=0 が曲線の始点に、t=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の偏角

# 「X,YをPI/6だけ回転」のように使う
●回転({参照渡し}X,{参照渡し}Yをθだけ)
 xとは数値=X
 yとは数値=Y
 cosとは数値=COS(θ)
 sinとは数値=SIN(θ)
 X = x*cos - y*sin
 Y = x*sin + y*cos

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

# 「100,200から300,400へ-50で放物線」のように使う
●放物線({グループ=?母艦}OBJのX1,Y1からX2,Y2へAで)
 Rとは数値。θとは数値。ΔTとは数値。Tとは数値
 (X2-X1),(Y2-Y1)をR,θへ極座標変換
 ΔT=1/分割数
 点列とは配列。Xとは数値。Yとは数値
 点列[0][0]=X1。点列[0][1]=Y1
 (分割数)回
  TにΔTを直接足す
  X=R*T
  Y=4*A*T*(1-T)
  X,Yをθだけ回転
  点列[回数][0]=X1+X
  点列[回数][1]=Y1+Y
 OBJに点列で折れ線

半楕円

同じように、始点・終点・曲げ具合を引数にとって、半楕円形の曲線を引く命令を作ってみましょう。楕円のパラメータ表示は次のようになります:

x=r/2*(1-cos(t)), y=a*sin(t)

同じように、この曲線を t=0 が始点、t=π が終点に対応するように回転させます。 a が曲線の曲げ具合を指定するパラメータです。

# 「100,200から300,400へ50で半楕円曲線」のように使う
●半楕円曲線({グループ=?母艦}OBJのX1,Y1からX2,Y2へAで)
 Rとは数値。θとは数値。ΔTとは数値。Tとは数値
 (X2-X1),(Y2-Y1)をR,θへ極座標変換
 ΔT=PI/分割数
 点列とは配列。Xとは数値。Yとは数値
 点列[0][0]=X1。点列[0][1]=Y1
 (分割数)回
  TにΔTを直接足す
  X=R/2*(1-COS(T))
  Y=A*SIN(T)
  X,Yをθだけ回転
  点列[回数][0]=X1+X
  点列[回数][1]=Y1+Y
 OBJに点列で折れ線

必要な関数などは「放物線」と同じなので、省略しています。実際に使うは、さきほどのプログラムに追加して試してください。