49103


dxライブラリを使ったゲーム数学なのですが、30度の方向に動かかすプログラムなのですがこれは正しいのでしょうか？ 質問なのですが  
1,プログラム上の角度０度は右で時計回りに角度が増えていく、でよろしいのでしょうか？  
2,特定の角度で玉が飛んでいくといったプログラムを作る際に sin(PI / 6)といった組み方をしていますが0.0174533(1度のラジアン) * 30
といった書き方は違うのでしょうか？

作品を作ってるわけではないので具体例が知りたいです。

[code]

                int pos_x = (640 / 2) - (48 / 2);
            int pos_y = 380;
            int WINAPI WinMain(HINSTANCE hInstanve, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
            {
                ChangeWindowMode(true), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);
                color = GetColor(0, 255, 0);
                hResource = LoadGraph("Resource.png");
                hBall = LoadGraph("Ball.png");
                hCharacter[16] = { 0 };
                int hBlock = LoadGraph("Block.png");
                LoadDivGraph("char.png", 16, 4, 4, 32, 32, hCharacter);
                int color = GetColor(255,255,255);
    
                x = pos_x;
                y = pos_y;
                int xx = pos_x;
                int yy = pos_y;
    
                double angle = PI * 2 / 8;
                while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0) {
    
                    DrawGraph(x,y,hBlock,TRUE);
    
    
            //      DrawGraph(xx, yy, hBlock, TRUE);
    
            */
    
                    DrawGraph(pos_x, pos_y, hBlock, TRUE);//ここです
                    pos_x += 2 * cos(PI / 6);//ここです。
                    pos_y -= 2 * sin(PI / 6);//ここです
    
                //  xx += 2 * cos(PI / 8);
                //  yy -= 2 * sin(PI / 8);
    
    
    
    
                    DrawFormatString(0,0,color,"pos_x:%d",pos_x);
                    DrawFormatString(0,15, color,"pos_y:%d", pos_y);
                //  WaitTimer(20);
    
                    if (CheckHitKey(KEY_INPUT_ESCAPE) == 1 || CheckHitKey(KEY_INPUT_RETURN) == 1) {
                        return -1;
                    }
                    //Graphic_Draw();       
                }
    
                WaitKey();
                return 0;
            }
    
[/code]


CC BY-SA 4.0
2018-10-09T08:22:54.750
49097
2018-10-09T10:48:09.870
2018-10-09T10:46:34.747
question
c++
三角関数を使って任意の角度に画像を移動させるプログラムが正しいのか知りたい


> 1,プログラム上の角度０度は右で時計回りに角度が増えていく、でよろしいのでしょうか？

DirectXであれば左手座標系のはずです。  
左手を出して、親指を立てた状態で、手を何かを握るような形にしてみてください。  
親指の指す方向が回転軸の正方向として、その軸を中心とした回転の＋方向は指の指す方向になります。  
なので、時計回りで正しいです。  
<https://msdn.microsoft.com/ja-jp/library/cc324592.aspx>

> 2,特定の角度で玉が飛んでいくといったプログラムを作る際に sin(PI / 6)といった組み方をしていますが0.0174533(1度のラジアン) *
> 30 といった書き方は違うのでしょうか？
[code]

    sin(PI / 6);
    
[/code]

と

[code]

    sin(0.0174533 * 30);
    
[/code]

は結果がほぼ同じになるはずなので、両方正しいといえるでしょう。  
ただ、可読性という意味では前者の方が望ましいでしょう。


CC BY-SA 4.0
2018-10-09T08:50:38.220
49100
2018-10-09T08:50:38.220
17014
49097
answer


**_1,プログラム上の角度０度は右で時計回りに角度が増えていく、でよろしいのでしょうか？_**

使用する座標系によります。数学での座標系なら、こんな感じでしょう。

[code]

    y↑
     |
     |
     |
     |
     +----------→x
    O
    
[/code]

この場合x軸の正の向き(あなたの言う「右」)を0°として反時計回りに角度が増えていきます。

ゲームでの座標系なら通常こうでしょう。

[code]

    O
     +----------→x
     |
     |
     |
     |
    y↓
    
[/code]

この場合2通りの考え方があります。

### 数学座標用の式をそのまま使う

y座標の上下がひっくり返っているので、

x軸の正の向きを0°として **時計** 回りに角度が増えていきます。

### 角度は数学と同じく反時計回りに増えていかないとなんか変な気がする

当然ながら、

x軸の正の向きを0°として **反時計** 回りに角度が増えていきます。

そのため、使う **式の方でy座標を正負反転** させてやらないといけません。

あなたが示されたコードだとy座標の計算が`-=`になっているので、もともとこちらを意図して書かれたもののように思います。

***2,特定の角度で玉が飛んでいくといったプログラムを作る際に sin(PI / 6)といった組み方をしていますが0.0174533(1度のラジアン) *
30 といった書き方は違うのでしょうか？***

πラジアン=180°と言うのはご存知でしょう。したがって1°=(π/180)ラジアン≒0.01745329251994...ラジアンと言うことになります。`0.0174533`はこの値を四捨五入したものということになるので、`0.0174533
*
30`だと少しばかり精度が低いと言うことになります。逆に言えば`PI`と同じ程度に十分な精度で`0.01745329251994...`を表す定数を用意してやれば、あとは好みの問題と言って良いでしょう。

(実際には、単精度で定数用意しても誤差が画面上に現れるほど大きくなることは滅多にないでしょうが。)

* * *

### 直接のご質問内容にはありませんが…

上記のような取り扱いをする場合、長さ`1`で角度`θ`の方向ベクトルは`(cos(θ), sin(θ))`(または`(cos(θ),
-sin(θ))`)です。(x軸方向が`cos`でy軸方向が`sin`。)これを逆にすると、0°がどっち向きかも、角度が増えていく向きも変わってしまいますので注意してください。


CC BY-SA 4.0
2018-10-09T09:13:46.553
49103
2018-10-09T10:48:09.870
2018-10-09T10:48:09.870
13972
13972
49097
answer