2012年7月10日火曜日

[ドリトル] 衝突判定 集中砲火版


前回の続きで、衝突判定でもう少し遊んでみよう。
今度は、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 件のコメント:

コメントを投稿