dxライブラリ 円周するコードの実装に困っています。(改良)

投稿者: user28203

提示コード最下部の if(angle >= 360)の部分なのですが書いててなんか違うなうな気がしたのですがやっぱり実装が間違て幼稚なコードになっている指摘を受けたので自分の力で修正を試みたのですが自分には実装がこれ以外おもいつかず質問してしました。
回答と解説お願いできますでしょうか。

#include "DxLib.h"
#include "math.h"
#include <string>
#define PI 3.14159265359
using namespace std;
char key[256];

//キー入力関数
int KeyBord_Get(int keycode)
{

    char tmpkey[256];
    GetHitKeyStateAll(tmpkey);
    for (int i = 0; i < 256; i++)
    {
        if (tmpkey[i] != 0)
        {
            key[i]++;
        }
        else
        {
            key[i] = 0;
        }

    }

    return key[keycode];
}

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
    ChangeWindowMode(TRUE);
    if (DxLib_Init() == -1) { return -1; }  
    int Color = GetColor(255,255,255);
    int gh = LoadGraph("resources/Player.png");
    int x = -200;
    int y = -200;

    int angle = 0;

    int r = 30;

    float t = PI / 180 * 4;


float a = cos(PI / 180 * 45);
float b = cos(45);

while (ClearDrawScreen() == 0 && SetDrawScreen(DX_SCREEN_BACK) == 0 && ProcessMessage() == 0)
{
    //x  = cos(PI / 180 * angle) * r + 200;
    //y  = sin(PI / 180 * angle) * r + 200;

    x = cos(PI / 180 * angle) * r + 200;
    y = sin(PI / 180 * angle) * r + 200;

    angle += 4;


    //Sleep(200);
    //DrawFormatString(0,50,Color," a %lf",a);
    //DrawFormatString(0, 65, Color, " b %lf", b);

    //DrawFormatString(10, 35, Color, "%d", angle);

    DrawFormatString(0,0,Color,"x: %d,Y: %d",x,y);

    DrawGraph(x,y,gh,true);
    if (angle >= 360)
    {
        angle = 1;
    }





    ScreenFlip();
    if (CheckHitKey(KEY_INPUT_ESCAPE) == 1) { break; }
}
return 0;
}

解決

結局のところ「いきすぎちゃったら範囲内に戻す」ってことになるわけですが。

359 度を 7 度進めて 366 度になったというとき 366 度は 6 度なわけです。これを求めるには剰余を使って

angle += delta_angle;
angle %= 360;

とすれば、必ず 360 度未満の数値が得られることになります(ここんところ大丈夫? これに納得できないようだと先は長い)

剰余は計算機の処理の中で最も遅い部類の演算なので、剰余演算を避けるには

if (angle>=360) angle-=360;

とすればよいことになります( 720 度より大きいとき挙動が違う。なおかつ今時は剰余コストより分岐コストのほうが高いかもしれないのでなんとも)。 angle=1; だと無条件で 1 になってしまっておかしいですよね。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *