前回の続きで、衝突判定でもう少し遊んでみよう。
今度は、360度全周囲から突入してみる。
基本方針は以下の通り。
- 中心にターゲットを配置する。
- 一度ずつ角度を変えて中心から一定距離進み、pendown して衝突するまで戻る。
t1 = Turtle ! create. // create target. TARGETSIZE = 100. HALFSIZE = targetSize / 2. t1 ! penup (HALFSIZE) back pendown 1 linewidth. t1 ! 90 leftturn (HALFSIZE) forward 90 rightturn (TARGETSIZE) forward. t1 ! 90 rightturn (TARGETSIZE) forward 90 rightturn (TARGETSIZE) forward. t1 ! 90 rightturn (HALFSIZE) forward 90 leftturn. t1 ! makefigure (blue) paint. t1 ! penup movetocenter. collisioned = false. t1:backUntilCollision = [ |; count | collisioned = false. count = 0. [ (collisioned ! not) ! (count < 200) allTrue ] ! while [ self ! 1 back. count = count + 1. ] execute. self ! penup movetocenter. ]. t1:collision = [ collisioned = true. ]. // try to collision inCollision = false. [ | y | t1 ! penup movetocenter. t1 ! 1 rightturn 200 forward. t1 ! pendown. t1 ! backUntilCollision. ] ! 360 repeat.おお。いい感じで衝突判定されている。
次は形を変えてみる。
正五角形でいってみよう。
... TARGETSIZE = 100. HALFSIZE = (TARGETSIZE/2) * sqrt(5+2*sqrt(5)) / 2. t1 ! penup (HALFSIZE) back pendown 1 linewidth. t1 ! 54 leftturn (TARGETSIZE) forward 72 rightturn (TARGETSIZE) forward. t1 ! 72 rightturn (TARGETSIZE) forward 72 rightturn (TARGETSIZE) forward. t1 ! 72 rightturn (TARGETSIZE) forward 126 rightturn. t1 ! makefigure (blue) paint. ...ちゃんと五角形に追随している。
ちなみに、
HALFSIZE = (TARGETSIZE/2) * sqrt(5+2*sqrt(5)) / 2.
の部分は正五角形の高さ(の半分)。中心に正五角形を書くため高さの半分バックしている。
次は星形多角形に挑戦。
... TARGETSIZE = 150. HALFSIZE = TARGETSIZE * cos(18) / 2. t1 ! penup (HALFSIZE) back pendown 1 linewidth. t1 ! 18 leftturn (TARGETSIZE) forward 144 rightturn (TARGETSIZE) forward. t1 ! 144 rightturn (TARGETSIZE) forward 144 rightturn (TARGETSIZE) forward. t1 ! 144 rightturn (TARGETSIZE) forward 162 rightturn. t1 ! makefigure (blue) paint. ...おおお。
タートル自体の形を見てみよう。
衝突ターゲットとしてタートルを生成する一方、タートル自体の形を正確にみるために、 衝突しに行くタートルはサイズを小さくしておく。
t1 = Turtle ! create. t1 ! 0.1 scale 1 linewidth. // create target. target = Turtle ! create. collisioned = false. ...長方形だった。
ターゲットを四角にしていた時、衝突限界がきれいに四角になっていないのは、四角の形をした Turtle が角度を変えながら突入していたせいのようだ。
ターゲットのサイズを大きくする。
... // create target. target = Turtle ! create. target ! 5 scale. collisioned = false. ...大きくなった。画像を変えてみよう。
... // create target. target = Turtle ! create. target ! "rocket.png" setShape. collisioned = false.
0 件のコメント:
コメントを投稿