角度計算について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
クールアイス
記事: 34
登録日時: 12年前

角度計算について

#1

投稿記事 by クールアイス » 12年前

こんばんは。今日は私がとっても苦手な角度計算について質問させてください。

まず、私は現在C++とDXライブラリでシューティングゲームの基礎を勉強しています。

そんな中、勉強がてらキャラクターの移動制御にsin,cosを使ってみようと考え以下のプログラムを組んでみました。

コード:

//	キーフラグ
keyFlag = 0;
		
if(CKey::KeyState(KEY_INPUT_LEFT) != 0)	{keyFlag += 1;}		//	左
if(CKey::KeyState(KEY_INPUT_RIGHT) != 0){keyFlag += 10;}	//	右
if(CKey::KeyState(KEY_INPUT_UP) != 0)	{keyFlag += 100;}	//	上
if(CKey::KeyState(KEY_INPUT_DOWN) != 0)	{keyFlag += 1000;}	//	下

switch(keyFlag)
{
    case 1:	    keyAng = (180 * PI / 180);	break;	//	左
	case 10:	keyAng = (  0 * PI / 180);	break;	//	右
	case 100:	keyAng = (270 * PI / 180);	break;	//	上
	case 1000:	keyAng = ( 90 * PI / 180);	break;	//	下

	case 101:	keyAng = (235 * PI / 180);	break;	//	左上
	case 1001:	keyAng = (135 * PI / 180);	break;	//	左下
	case 110:	keyAng = (315 * PI / 180);	break;	//	右上
	case 1010:	keyAng = ( 45 * PI / 180);	break;	//	右下

	default:	keyFlag = 999;			    break;	//	例外
}

if(keyFlag != 999)
{
	x += cos(keyAng) * speed;
	y += sin(keyAng) * speed;
}
結果は見事に動いたのですが、case文の中の(角度 * PI / 180)というところがなぜこの数字で正しいのか分かりません。
数学をまともに勉強してこなかったせいで、sin cosはおろか角度全般の知識が抜けているため、「何でPI使うの?」「しかも180で割るとか・・・」という状態です。

そこで、
1.どうしてこの計算で正しく動くのか
2.ついでにプログラミングに役立つ数学を教えてくれるサイト

を教えていだたきたいです。

nil
記事: 428
登録日時: 13年前

Re: 角度計算について

#2

投稿記事 by nil » 12年前

1.プログラミングにおける角度は通常、日常生活で使う度数(0°~360°)を使うのではなく、
ラジアン値(0~2*PI)を使います。
ラジアン値における0は真右を指し、PI/2は0より90°時計回りの方角、つまりは真下を指します。
同様にして、PIは真左、PI*3/2は真上、PI*2は一周回って真左を指します。

これより、ラジアン値2*PIは360°なので、PI/180は度数では1°です。
つまり、n*PI/180はn°となります。

sin,cosは教科書を読みこみましょう。
実際プログラムに使用していくことにより、より理解を深めることができます。

2.niconicoで魯鈍ジョンさんというプログラマの方がプログラミングの解説実況をなさっています。
言語自体はHSPというもので、C++とは違うのですが、基本は同じなので十分に応用は可能です。

クールアイス
記事: 34
登録日時: 12年前

Re: 角度計算について

#3

投稿記事 by クールアイス » 12年前

>>涼雅さん

分かりやすい説明をありがとうございます。
なるほど、普段の度数と同じに考えてたからダメだったんですね。
教科書は何とか引っ張り出してみます。

動画のほうはよく参考にさせていただきます。

ご回答ありがとうございました。

box
記事: 2002
登録日時: 14年前

Re: 角度計算について

#4

投稿記事 by box » 12年前

今回使っていらっしゃる座標系では、90°が真下を指すようになっている、
ということであって、どんな座標系でもそうだ、というわけではないことを補足しておきます。

数学の教科書や参考書に載っている座標系は、90°が真上を指す(反時計回り)ようになっています。
ところで、
クールアイス さんが書きました:

コード:

	case 101:	keyAng = (235 * PI / 180);	break;	//	左上
ここだけ、角度が45の倍数になっていないようです。本当は225ではないでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

クールアイス
記事: 34
登録日時: 12年前

Re: 角度計算について

#5

投稿記事 by クールアイス » 12年前

>>box さん

それではいろいろなパターンの勉強が必要ですね・・・。頑張ります。

移動のところは書き間違えてましたので修正しました。ありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る