2013年3月5日火曜日

[ドリトル] 包絡線 -放物線-

この間の記事 で与えられた2点を通る直線を引くメソッドを作ったので、 それを使って包絡線を描いてみよう。

包絡線

包絡線(ほうらくせん、envelope)とは、与えられた曲線族と接線を共有する曲線、すなわち与えられた(一般には無限個の)全ての曲線たちに接するような曲線のことである。
- Wikipedia

以下の方法で描画する。
  • 2つの非表示タートルを用意する。
  • 各々を1ステップずつ移動しながら、両者の間に線を引く。
  • 始点はX軸上を左から右へ、終点はY軸上を上から下へ等速で動かす。


描いてみる

tt = Turtle ! create penup 1 linewidth (blue) linecolor.
tt:drawExpandedL = [ | ts te length ; x1 y1 x2 y2 angle |
   x1 = ts!xPosition?.  y1 = ts!yPosition?.
   x2 = te!xPosition?.  y2 = te!yPosition?.
   [x2 == x1] ! then [ 
      [ y2 > y1 ] ! then [ angle = 90 ] else [ angle = 270 ] execute ]
   else [
      angle = atan( (y2 - y1) / (x2 - x1)).
      [ x2 < x1 ] ! then [ angle = angle+180] execute ]
   execute. 

   self ! penup (x1) (y1) moveto (angle) direction 180 leftturn.
   self ! pendown (length) forward.
   self ! penup (x1) (y1) moveto. 
   self ! pendown (x2) (y2) moveto. 
   self ! (angle) direction (length) forward.
   self ! penup.

   self ! penup 0 direction (x1) (y1+5) moveto pendown 5 circle. 
   self ! penup 0 direction (x2) (y2+5) moveto pendown 5 circle. 
].

tx = Turtle ! create hide.
ty = Turtle ! create hide.
tx ! -300 -200 moveto.
ty ! 0 300 moveto -90 direction.

STEP = 10.
[ | i | 
  tt ! (tx) (ty) 300 drawExpandedL.
  tx ! (STEP) forward.
  ty ! (STEP) forward.
 ] ! 91 repeat.


なんか放物線ぽい包絡線ができた。


包絡線の性質を調べてみる

現れた包絡線がなんなのか調べてみよう。
t をパラメータとすると、始点P1と終点P2の座標は、
P1が (t,0)、P2が (0,1-t) になる。

P1 と P2 を通る直線群はパラメータ を使って(式1)と書けるので
これを t について整理して(式2)を得る。
包絡線外側の直線が通過する領域は、任意の(x、y)に対して
そこを通過する直線(式1)が存在するので(式2)のtに実数解を持つ。
したがって、2次方程式の解の公式(式3)の判別式 D=b2 ― 4ac
正負境界が包絡線を表していることになる。
(式2)の判別式Dは(式4)なので、整理すると(式5)になる。
ここで X=(x-y)、Y=(x+y) と変数変換をすることにより(式6)が得られる。
この結果、図に現れた包絡線が45°傾いた放物線であることが分かった。

だいたいこれであってると思うのだが、途中の変換とかは自信がないので間違ってるかもしない。
間違ってたら教えてください。



始点・終点を傾けて移動する

さっきは始点・終点をX軸、Y軸上を移動させていたが、
今度は y=x、y=-x 軸上を等速移動させる。

...
tx ! -200 -200 moveto 45 direction.
ty ! -300 300 moveto -45 direction.
// tx ! -300 -200 moveto.
// ty ! 0 300 moveto -90 direction.
...

今度はちゃんと上を向いた放物線になった。



0 件のコメント:

コメントを投稿