49235


[////]コメント部にあるように"時計回りに円を描くように正確に回る"  
プログラムを作りたいのですが画面中央から角度を指定して座標を計算して座標を算出すればいいのかな？と思うのですがspeedの部分を考えると実装の仕方がわかりません。  
教えてくれますでしょうか？。

[code]

                #include "DxLib.h"
            #include "math.h"
            //#include <iostream>
    
            const double PI = 3.14159265359;
            const double angle = PI / 180.0;
    
            int hblock;
            int color = GetColor(255, 255, 255);
    
    
    
            //double angle_r[361];//角度の座標の計算結果
    
            /*画面のサイズ 640,480*/
    
            constexpr double screenmax_x = 640;
            constexpr double screenmax_y = 480;
            constexpr double playersize_x = 64;
            constexpr double playersize_y = 64;
            constexpr double screensize_x = 640 - playersize_x;//576
            constexpr double screensize_y = 480 - playersize_y;//416
            constexpr double centerpos_x = (640 / 2) - 32;
            constexpr double centerpos_y = (480 / 2) - 32;
    
            /*座標*/
            typedef struct position_ {
                double x;
                double y;
    
            }position;
            position pos[361] = {0.0,0.0};//初期化
            double pos_x = centerpos_x;
            double pos_y = centerpos_y;
            double speed = 1.0;
            /*フラグ系*/
            bool f_screenedge = false;//画面の端に到達したかどうかのを判定するフラグ変数
            bool f = false;
            /*一時的*/
            double p = (screenmax_y / 4) - (playersize_y / 2);
    
    
            void pos_f_screenedge() {//画面の端に到達しらtrue
    
                if (pos_x >= 640  - 64  || pos_y >= 480 - 64 || pos_x <= 0 || pos_y <= 0) {
    
                    f_screenedge = true;    
                }
                else {
                    f_screenedge = false;
                }   
            }
    
            /*座標を表示する関数*/
            void Player_Log() {
    
                DrawFormatString(0, 0, color, "pos_x:%lf", pos_x);
                DrawFormatString(0, 15, color, "pos_y:%lf", pos_y);
                DrawFormatString(0, 30, color, "f_screenedge:%d", f_screenedge);
    
            }
    
            /*操作関数*/
            void Player_Control(){
                if (CheckHitKey(KEY_INPUT_UP) >= 1 ) {
                    pos_y -= speed;
                }
    
                if (CheckHitKey(KEY_INPUT_DOWN) >= 1 ) {
                    pos_y += speed;
                }
    
    
                if (CheckHitKey(KEY_INPUT_LEFT) >= 1 ) {
                    pos_x -= speed;
                }
    
                if (CheckHitKey(KEY_INPUT_RIGHT) >= 1 ) {
                    pos_x += speed;
                }
            }
    
            void pos_angle(const double &s) {//角度の座標を計算する関数
    
                for (int i = 0; i < 361; i++) {
                    pos[i].x =  s * cos(angle * i);
                    pos[i].y = s * sin(angle * i);
    
                }
            }
    
            /*初期化*/
            void Player_Initialization() {
                pos_angle(speed);//角度を計算
                hblock = LoadGraph("Block.png");
    
            }
    
            /*描画*/
            void Player_Draw() {
                DrawGraph(static_cast<int>(pos_x), static_cast<int>(pos_y), hblock, TRUE);
    
            }
    
            void outscreen() {//画面外に出たときに画面の外に出ないようにする処理
                if (pos_x > screensize_x) {
                    pos_x = screensize_x;
                }
    
                if (pos_x < 0) {
                    pos_x = 0;
                }
    
                if (pos_y > screensize_y) {
                    pos_y = screensize_y;
                }
    
                if (pos_y < 0) {
                    pos_y = 0;
                }
            }
    
            /*更新*/
            //////////////////////////////////////////////
            //double x = speed * cos(angle * 45);
            //double y = speed * sin(angle * 45);
    
    
    
    
            void Player_Update() {
                Player_Control();//操作関数
                pos_f_screenedge();//画面の判定関数
    
    
                //pos_x += pos[90].x;
                //pos_y -= pos[90].y;
    
    
            //      pos_x += pos[0].x;
            //      pos_y -= pos[0].y;
    
    
            }
            //////////////////////////////////////////////
    
            int WINAPI WinMain(HINSTANCE hInstanve, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
            {   ChangeWindowMode(true), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);
    
                Player_Initialization();//初期化
                while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
    
                    Player_Update();
    
                    outscreen();
    
    
    
    
    
                    Player_Draw();
                    Player_Log();//数値表示
    
    
                    if (CheckHitKey(KEY_INPUT_ESCAPE) == 1 || CheckHitKey(KEY_INPUT_RETURN) == 1) {
                        return -1;
                    }
                }
    
                WaitKey();
                return 0;
            }
    
[/code]


CC BY-SA 4.0
2018-10-12T11:23:19.003
49226
2018-10-13T02:58:44.870
2018-10-12T13:46:40.520
question
c++
ゲーム数学、画面を時計回りに移動するプログラムを作りたい(dxライブラリ)


`speed`は`sin()`, `cos()`の引数に掛けるべき値で、`sin()`,
`cos()`の戻り値に掛けては、中心からの距離が変わるだけではないでしょうか？  
円運動をする場合の速度とは、次に何度進むか？なので、`sin()`, `cos()`の引数への係数になるのではありませんか？

なので、円を描きたいのであれば、`pos_angle(const double &s)`を修正して、

[code]

    int pos_angle(double scale, double speed, const double &s) {//角度の座標を計算する関数
        int i = 0;
        for (double r = 0; r <= 360; r += speed) {
            double theta = PI * r / 360;
            pos[i].x =  scale * cos(theta);
            pos[i].y = scale * sin(theta);
            i++;
        }
        return i; // 配列の何番目までが意味のある数字か？を返す。
    }
    
[/code]

として、

  * 円の大きさを引数`scale`で
  * 円周上の次の点までどれ位の角度にするか（＝速度）を`speed`で

指定し

  * 何個の点を描く必要があるか？（＝配列の要素が幾つ計算されたか）

を返し、戻り値回描画しなければ円運動しなくなってしまうと思います。

ゲームと質問に書かれているので、インタラクティブなものに改造していくなら、何らかのキーや他のイベントで速度が次の描画までにリアルタイムで変化させられる様に、次の描画は現在の角度を保持しておき、次に書くべき点への角度（＝速度）をspeed＊標準移動角度（＝速度）ずつ足していき、リアルタイムに計算した方が良い気がしますが、それは今後の課題なのでしょう


CC BY-SA 4.0
2018-10-13T02:58:44.870
49235
2018-10-13T02:58:44.870
14745
49226
answer