ラベル タートルグラフィックス の投稿を表示しています。 すべての投稿を表示
ラベル タートルグラフィックス の投稿を表示しています。 すべての投稿を表示
このページの記事一覧
● 2013年3月4日月曜日 - [ドリトル] 三角関数で謎な図形
● 2013年3月3日日曜日 - [ドリトル] 直線延長
● 2012年8月29日水曜日 - [ドリトル] ドリトルのマウス
● 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日月曜日 - [ドリトル] 跳ね返り (円)
● 2012年7月15日日曜日 - [ドリトル] 跳ね返り
● 2012年7月14日土曜日 - [ドリトル] 回転するカメ その2
● 2012年7月12日木曜日 - [ドリトル] 回転するカメ
● 2012年7月11日水曜日 - [ドリトル] Timerを使う

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月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.

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

2012年7月15日日曜日

[ドリトル] 跳ね返り

Turtle には bounce (跳ね返る)命令があり、跳ね返り動作を簡単に記述することができる。 面白そうなので早速使ってみよう。

t1 = Turtle ! create.

// ターゲット作成
t1 ! penup -200 100 moveto pendown 45 rightturn.
t1 ! (100 * sqrt(2)) forward 90 rightturn (100 * sqrt(2)) forward.
t1 ! penup 0 direction movetocenter.
shape1 = t1 ! makefigure.

// Collision 動作を bounce動作に置き換える。
t1:collision = t1:bounce. 

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

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

2012年7月14日土曜日

[ドリトル] 回転するカメ その2


前回の続き。 自転しながら動くタートルを作る。

前回は独自の「進行方向」プロパティを用意して、forward する際に、角度と移動距離から三角関数で移動後の位置を求めた。
いまいちタートルグラフィックスぽくないので別のやり方でやってみる。三角関数禁止。

基本戦略。
  • 進行方向を向くタートル(非可視)と回転するタートルの2匹組にする。
  • 片方のタートルが外から使える外部タートルでもう一匹は内部タートル
いくつかのオプションがあるので比較検討する。
多きくわけて、「外部/内部どちらが回転するか」、「外部/内部どちらが描画するか」の組み合わせて設計が分かれそう。

2012年7月12日木曜日

[ドリトル] 回転するカメ


前回の記事で タイマーが使えるようになったので使ってみる。
自転しならが円を書く Turtle を作ってみよう。

プロトタイプとしてして作って、使うときにはなるべく自然に Turtle として使えるようにする。

基本戦略。
  • 自身で回転専用の Timer を保持し、一定の速度で自身を回転させる。
  • 実際に進む向きは、専用のプロパティとして保持する。
  • forward をオーバーライドして、実際に進む向きから自身の移動位置を算出する。
  • right/leftturn をオーバーライドして、実際に進む向きのプロパティ値の更新をする。
こんな感じ。create 時に回転速度を引数として与えるようにしてある。

2012年7月11日水曜日

[ドリトル] Timerを使う

タイマーを使ってみよう。
タイマーで定期的な実行ができる。動きが見えるようにゆっくり動かす時に使う。
aTimer ! [ブロック] execute. であらかじめ指定したインターバルで指定回数(または指定時間)実行を繰り返すことができる。

周回する Turtle の速さを Slider で変えてみよう。
Slider を動かすとそれで周回する Turtle の速さを変える。

t1 = Turtle ! create penup 150 back pendown.
slider1 = Slider ! create.
label1 = Label ! (slider1!value?) create.
timer1 = Timer ! create.

slider1:action = [ 
  label1 ! ( self ! value?) set. 
  timer1 ! (0.1 * ( self ! value?) / 50) interval.
].

timer1 ! 0.1 interval 360 times.
timer1 ! [
  t1 ! 10 leftturn 15 forward.] execute.