このWikiは古くなりました:新しいWikiへ移動


//#kaisou

 [[Tonyu基礎練習]]-[[練習:数学と物理とゲーム]] - 三角関数(sin,cos)の応用 - ''坂とオブジェクトの接点''

**坂とオブジェクトの接点
 次のような場合について考えてみましょう。

&ref(exampleSloop.png);

 このような場合、どこでオブジェクトが坂と接しているのかわかりにくいと思います。傾斜が22.5度とわかっているのでしたら、それも何とか求められそうですが、それにしても不便です。

 sin関数とcos関数に関しては、 [[三角関数とは?]]のところで少し学んだと思います。ここで、少し応用してみましょう。

&ref(sincos.png);

 これはsin(s)とcos(s)がどの部分の長さを示しているのかを現してあります。

&ref(exampleSloop2.png);

 求めたいのは接している点です。上の図の通り、オブジェクトの中心から半径とsin関数cos関数で接点を求めることが出来そうです。

円の中心(x,y)、半径が10の円の場合、22.5℃の坂に対する接点(xx,yy)は
<pre>
xx=x+10*sin(22.5);
yy=y+10*cos(22.5);
</pre>
となり、
<pre>
if ($map.getAt(x+10*sin(22.5),y+10*cos(22.5))!=$pat_Test+1) {
  x+=2*sin(360-22.5);
  y+=2*cos(360-22.5);
}
</pre>
のように設定してあげれば、スムーズに動きそうです。坂から降りる場合も考えて、通常はこれでよいと思います。

&ref(exampleSloop3.png);

 しかし、いつもオブジェクトが円形とは限りません。長方形や正方形の形をしていることの方が多いと思います。また、そのような場合には、坂を昇るときに坂に減り込んでしまうことを防ぐために右側下方の接点も求めたいと言う人もいるかもしれません。&br;
 しかし、これも円形同様に考えれば答えが出そうです。&br;
 赤い線は円形の時と同じです。&br;
 緑色の線を新たに足してあげれば前方の点における接点が求められそうです。

オブジェクトの中心が(x,y)、横の長さが20、縦の長さが10の画像の場合、22.5℃の坂に対する右側下方の接点(a,b)は
<pre>
a=x+5*sin(22.5)+10*cos(360-22.5);
b=y+5*cos(22.5)+10*sin(360-22.5);
</pre>

 このようにして、ゲームに応用してゆけば、
<pre>
if ($map.getAt(x+5*sin(22.5)+10*cos(22.5),y+5*cos(22.5)+10*sin(22.5))!=$pat_Test+1) {
  x+=2*sin(360-22.5);
  y+=2*cos(360-22.5);
}
</pre>
 のように坂の上をオブジェクトがスムーズに移動するようになります。

**発展
<table bgcolor=#ffddee><tr><td>
''練習問題''
<blockquote>上の例で左側下方の接点を求め、判定を2点にしなさい。

sNieQW1EJqEFhAT7SDFs2l9kvcXofsK1151591112Rseov9df81r3m2nF59e8v784jw5kfdr 
 sNieQW1EJqEFhAT7SDFs2l9kvcXofsK1151591110Rseov9df81r3m2nF59e8v784jw5kfdr
 sNieQW1EJqEFhAT7SDFs2l9kvcXofsK1151591111Rseov9df81r3m2nF59e8v784jw5kfdr
sNieQW1EJqEFhAT7SDFs2l9kvcXofsK1151591113Rseov9df81r3m2nF59e8v784jw5kfdr

</blockquote>
</td></tr></table>
 [[答え>坂とオブジェクトの接点解答1]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS