ラベル ドリトル の投稿を表示しています。 すべての投稿を表示
ラベル ドリトル の投稿を表示しています。 すべての投稿を表示
このページの記事一覧
● 2013年3月11日月曜日 - [ドリトル] 包絡線 -アステロイド-
● 2013年3月10日日曜日 - [ドリトル] 包絡線 -放物線- その2
● 2013年3月5日火曜日 - [ドリトル] 包絡線 -放物線-
● 2013年3月4日月曜日 - [ドリトル] 三角関数で謎な図形
● 2013年3月3日日曜日 - [ドリトル] 直線延長
● 2012年8月29日水曜日 - [ドリトル] ドリトルのマウス
● 2012年8月22日水曜日 - [ドリトル] プロパティや命令の探索
● 2012年8月16日木曜日 - [ドリトル] サイクロイド曲線
● 2012年8月15日水曜日 - [ドリトル] 放物線の反射
● 2012年8月14日火曜日 - [ドリトル] 花火
● 2012年7月31日火曜日 - [ドリトル] センサー
● 2012年7月30日月曜日 - [ドリトル] 平方数を求める
● 2012年7月29日日曜日 - [ドリトル] 円周率を求める
● 2012年7月26日木曜日 - [ドリトル] リサージュ図形を描く(三角関数禁止)
● 2012年7月24日火曜日 - [ドリトル] キーボード操作でドリフト亀
● 2012年7月22日日曜日 - [ドリトル] self
● 2012年7月20日金曜日 - [ドリトル] 図形の回転
● 2012年7月18日水曜日 - [ドリトル] QIX
● 2012年7月17日火曜日 - [ドリトル] 跳ね返り (四角形)
● 2012年7月16日月曜日 - [ドリトル] 跳ね返り (円)

2013年3月11日月曜日

[ドリトル] 包絡線 -アステロイド-

この間は、包絡線で放物線を作ってみたので今度は「アステロイド曲線(星芒形(せいぼうけい))」を描いてみる。

アステロイド

アステロイド(astroid)の語義はギリシア語: aster(星の)+ -oid(ようなもの)であり、星芒形(せいぼうけい)、星形とも呼ばれる。アステロイドは四つの尖点を持つ内サイクロイド(四尖点内擺線)であり、四尖点形 (tetracuspid) の名称も古くから用いられている
- Wikipedia

アステロイド曲線は、X軸Y軸との交点間の距離が等しい直線群によって構成される包絡線になる。
つまり、ある長さの棒を壁に立てかけたときに滑って倒れるときに、その棒が描く包絡線がアステロイド曲線になる。

2013年3月10日日曜日

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

前回の記事では、2直線上を等速で動く点間の直線群が描く包絡線が放物線になるのをやってみた。
放物線を包絡線で描くにはもう一つほかの方法がある。
「直線 L 上の任意の点 Q と L 上にない点 P の間の直線 PQ と、
直線 L上で交わる直線群」の包絡線は放物線になる。


2013年3月5日火曜日

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

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

包絡線

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

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

2013年3月4日月曜日

[ドリトル] 三角関数で謎な図形

無限ブログの記事で面白いのを見つけた。


aTurtle =Turtle ! create (blue) linecolor 1 linewidth。
aTurtle ! penup 200 200 moveto pendown.
[ | i |
 aTurtle ! 5 forward (90 * sin(i)) rightturn.
] ! 3000 repeat.



なんだこれは???

2013年3月3日日曜日

[ドリトル] 直線延長

指定した2点を通る直線を引く。
  • 2点の前後に延長する長さを指定する。
  • 描画開始点と終了点のX座標を指定する。

2012年8月29日水曜日

[ドリトル] ドリトルのマウス

ドリトルでマウスの現在座標は Screen オブジェクトに対する xPosition?yPoistion? で取得する。
mouseMoved のようなマウスが動いたときに発生するイベントのようなものはないので、基本的には タイマーやほかのオブジェクトのイベント実行時に、その時点でのマウス座標を取得するという形式で利用する。

// create axes
t1 = Turtle ! create.
t1 ! 1 linewidth (red) linecolor.
t1 ! penup -1000 -1000 moveto pendown.
xLine = t1 ! 1000 -1000 moveto makeFigure.
t1 ! penup -1000 -1000 moveto pendown.
yLine = t1 ! -1000 1000 moveto makeFigure. 
t1 ! hide.

// create value fields
txtField1 = TextField ! create.
txtField2 = TextField ! create.

timer1 = Timer ! create.
timer1 ! 0.01 interval 600 duration.

timer1 ! [
  txtField1 ! ( Screen ! xPosition? ) set.
  txtField2 ! ( Screen ! yPosition? ) set.
  xLine ! -1000 (Screen ! yPosition?) moveto.
  yLine ! (Screen ! xPosition?) -1000 moveto.
] execute.

2012年8月22日水曜日

[ドリトル] プロパティや命令の探索

以前、self の記事でも調べたがもう少し調べておこう。 オブジェクトのメソッド(命令)の中でプロパティを参照する際には以下の順序で探索される。
  • 起点指定なし
    ローカル変数 → 自オブジェクトのプロパティ → プロトタイプのプロパティ → ・・・
    → ルートオブジェクトのプロパティ
  • self 起点
    自オブジェクトのプロパティ → プロトタイプのプロパティ → ・・・
    → ルートオブジェクトのプロパティ
  • 特定オブジェクト 起点
    指定オブジェクトのプロパティ → プロトタイプのプロパティ → ・・・→
    ルートオブジェクトのプロパティ

t1 = Turtle ! create.
t1:value = "T1".

t1:test = [ | ; value |
  value = "local".
  TextField ! (value) create.
  TextField ! (self:value) create. ].
t1 ! test.

local T1

「value」で指定した場合はローカル変数の値、「self!value」で指定した場合には t1 オブジェクトのプロパティ値が参照されている。

2012年8月16日木曜日

[ドリトル] サイクロイド曲線

サイクロイド (cycloid) とは、円がある規則にしたがって回転するときの円上の定点が描く軌跡として得られる平面曲線の総称である。

-- by ウィキペディア

ということなのだが、見方を変えると周回する点にX方向のオフセットを与えたものと見なすこともできる。
これならドリトルで簡単に描けそうなのでやってみよう。
forward による周回移動と水平移動の2段階移動になるため、移動後位置算出用の不可視タートルと描画用のタートルの2つ組を用意する。

2012年8月15日水曜日

[ドリトル] 放物線の反射

放物線を描いてみよう。y=x

VALUE_RANGE = 5.  // x = -5 to + 5
RESOLUTION = 100.
DRAW_SCALE = 200.
OFFSET_Y = -200.

t1 = Turtle ! create.
t1 ! 1 linewidth (blue) linecolor.
t1 ! penup.
[ | n ; x y |
  x = (n - RESOLUTION / 2) / RESOLUTION * VALUE_RANGE. 
  y = x * x.
  t1 ! (DRAW_SCALE * x) (DRAW_SCALE * y + OFFSET_Y) moveto.
  t1 ! pendown.
  t1 ! makeFigure.
] ! (RESOLUTION) repeat.

放物線に平行線を反射させると焦点に集まる。
ということでタートルを反射させてみる。

2012年8月14日火曜日

[ドリトル] 花火

季節がら、花火的なものを一つ作ってみる。
  • 重力を考慮する環境で1つタートルを打ち上げる。
  • 一定時間後、子タートルを放射状に展開し自身は消える。
  • 所定の世代数を消化するまで繰り返し。

2012年7月31日火曜日

[ドリトル] センサー

センサー付きのタートルを作ってみよう。
  • 自身から伸びるアンテナ(ヒゲ?)を持つ
  • アンテナは周期的に自身の周りを回転する。
  • 何かがアンテナに触れるとタートルはその時のアンテナの方を向く。
周りにエサを配置してアンテナがそれに触れたらそちらに向かう感じで。

2012年7月30日月曜日

[ドリトル] 平方数を求める

前回、円周率を算出してみたので今度は平方数を求めてみよう。
当たり前だが、sqrt 使用禁止。
√2、√3は簡単。
√2 は隣辺長1の直角2等辺三角形の底辺が √2 になる。

SCALE = 100.
t1 = Turtle ! create.
t1 ! 45 leftturn (SCALE) forward 90 rightturn (SCALE) forward.
Label ! ((t1 ! xPosition?) / (SCALE)) create.

2012年7月29日日曜日

[ドリトル] 円周率を求める

ふと思いついたのでやってよう。
タートルを使って円周率を求めてみる。
forward と rightturn で円を描けば周長がわかるので、「周長=直径×PI」より半円を描いた時の座標から円周率がわかる。

SCALE = 1.
APEX = 360.

t1 = Turtle!create hide.
[t1 ! (SCALE) forward (360.0/APEX) leftturn ] ! (APEX/2) repeat.

TextField ! (SCALE*APEX) create.
TextField ! (t1 ! yPosition?) create nextline.
TextField ! ((SCALE*APEX) / (t1 ! yPosition?)) create nextline.

「円周率=3.1416725」。おお、それなりの値が。

2012年7月26日木曜日

[ドリトル] リサージュ図形を描く(三角関数禁止)

ドリトルのサンプルにリサージュ図形 を描くものがある。
これはこれで楽しいのだが、三角関数は子供に説明できないので三角関数を使わずに書いてみることにしよう。
forward 命令と leftturn 命令でタートルに円運動をさせてそこから X 座標と Y 座標を取得するようにする。

2012年7月24日火曜日

[ドリトル] キーボード操作でドリフト亀

ドリトルでキーボードイベントを拾ってみた。

button1 = Button ! "button" "UP" create.
button1:action = [self! "hoge" set].

GUIオブジェクトを作成する際に第 2 引数でキーと関連付けておけば、 キー押下時に当該オブジェクトの action 命令が呼び出される。うーん、シンプル。

label1 = Label ! "label" create.
button1 = Button ! "button" "UP" create hide.
button1:action = [label1! "hoge" set].

こんな感じにイベントを受け取るオブジェクトが hide されていてもちゃんと action は発生する。

2012年7月22日日曜日

[ドリトル] self

self(自分)の使い方を確認しておこう。

lblResult = Label ! "result" create.
lblResult2 = Label ! "result2" create nextline.

t1 = Turtle ! create.
t1Child = t1 ! create.
t1:value = 1.

t1Child:test1 = [ lblResult ! (value) set ].
t1Child:test2 = [ lblResult2 ! (self:value) set ].

t1Child!test1.
t1Child!test2.

結果はいずれも 「1」になる。self 指定も無指定も検索起点は 自オブジェクトで、自オブジェクトにプロパティ値が設定されていないので親のプロパティ値が取得される。
ちなみに、「 :value 」を指定すると起点がルートになるので、「 undef 」になる。

2012年7月20日金曜日

[ドリトル] 図形の回転

少し思うところがあったので、図形を回転させる際の中心について確認しておこう。
まずはシンプルに ( 0, 0 ) に円を描いて回転させる。

t1 = Turtle ! create.
t1 ! 50 circle.
shape1 = t1 ! makefigure.

// mark initial position
shapeOrg = shape1 ! create (blue) paint.  

// rotate shape.
[ shape1 ! create.
  shape1 ! 60 rightturn.
] ! 6 repeat.
t1 ! penup movetocenter.

2012年7月18日水曜日

[ドリトル] QIX

跳ね返り命令を使ってみよう。
昔あったQIXという陣取りゲームに出てくるあの南京玉すだれみたいなやつを書いてみることにする。
例によって基本方針。

  • 2匹のタートルをエリアの壁に反射させながら動かす。
  • 3匹目が両タートルの間に線を描画する。
  • 一本ごとに図形化し配列に格納する。古くなった線は消していく。

こんな感じでそれっぽくなるだろうか。

2012年7月17日火曜日

[ドリトル] 跳ね返り (四角形)

前の記事で 「反射する方向は、入射角と最初に引いた線の角度で決まって、その線上のどちら側に反射するかだけが実際に反射する面との相互作用で決まる」と書いた。
ところで、反射後の角度は、反射面の角度の2倍で効くので90度の場合は180度方向が変わるわけで、反射方向はドリトルが補正するから正しい角度に反射しそうな気がする。
そうなら、polygon命令で描いた矩形でも(forward×4も)正しく反射するはず。

t1 = Turtle ! create.

t1 ! penup -100 100 moveto pendown.
t1 ! 100 4 polygon.
shape1 = t1 ! makefigure.
t1:collision = t1:bounce. 

t1:go = [ | length | 
  [ ! 1 forward ] ! (length) repeat ].

t1 ! (red) linecolor.
t1 ! penup 0 200 moveto -120 direction pendown 300 go.
t1 ! penup 100 200 moveto -120 direction pendown 300 go.
t1 ! penup -100 -100 moveto 60 direction pendown 300 go.
t1 ! penup -200 -100 moveto 60 direction pendown 300 go.

4方向から当ててみたがやはり四角形はうまく反射するようだ。
内側から当ててみよう。

2012年7月16日月曜日

[ドリトル] 跳ね返り (円)

前の記事で跳ね返りをやったので、もう少し続けてみる。 今度は円。

t1 = Turtle ! create.

// ターゲット作成
t1 ! penup -100 100 moveto pendown.
t1 ! 100 circle.
t1 ! penup 0 direction movetocenter.
shape1 = t1 ! makefigure.
t1:collision = t1:bounce. 

// 一歩づつ進める。
t1:go = [ | length | 
  [ ! 1 forward ] ! (length) repeat.
].

// 初期位置を下にずらしながらターゲットに当てる。
// (100, -100) - ( 100, 100)
t1 ! 1 linewidth (red) linecolor.
[ | count | 
  y = 100 - (count * 10).
  t1 ! penup 150 (y) moveto 180 direction pendown.
  t1 ! 600 go.
] ! 20 repeat.

あれ、全部まっすぐ跳ね返ってきた。
円を少し回転させてみる。ついでにタートルのサイズも少し小さくしてみよう。