メーターの目盛について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ライ

メーターの目盛について

#1

投稿記事 by ライ » 12年前

下記のようなプログラムを作ったのですが実行してみるとすぐにわかると思いますが目盛が揺れて見えてしまいます。
この現象を解決したいのですがどうすればいいのでしょうか。
変数testには0から360までのdouble型の値が入っているとします。

コード:

#include "DxLib.h"
#include <stdio.h>
#include <math.h>
double map(double a1, double a2, double b1, double b2, double s);
void Display();
int dx = 500, dy = 50;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{

	//ウインドウサイズ設定
	SetGraphMode(dx, dy, 32);

	//ログを出力しない
	SetOutApplicationLogValidFlag(FALSE);

	// ウインドウモードで起動
	ChangeWindowMode(TRUE);

	// DXライブラリの初期化
	if (DxLib_Init() < 0) return -1;

	// 描画先を裏画面にする
	SetDrawScreen(DX_SCREEN_BACK);

	//ウインドウがアクティブではない状態でも処理を続行
	SetAlwaysRunFlag(TRUE);

	/*--------------------------------
	メインループ
	-----------------------------------*/

	while (!ProcessMessage())
	{
		ClearDrawScreen();

		//各種データの表示
		Display();

		// 裏画面の内容を表画面に反映
		ScreenFlip();

	}

	DxLib_End();
	return 0;
}

void Display(){
	static double test = 0;
	static int r;
	if (test < 0){ r = 1; }
	else if (test > 360){ r = 0; }
	if (r){ test += 0.1; }
	else{ test -= 0.1; }

	DrawFormatString(map(0, 360, 0, dx, test) - 3, 19, -1, "N");
	DrawFormatString(map(0, 360, 0, dx, fmod(test + 90, 360)) - 3, 19, -1, "W");
	DrawFormatString(map(0, 360, 0, dx, fmod(test + 180, 360)) - 3, 19, -1, "S");
	DrawFormatString(map(0, 360, 0, dx, fmod(test + 270, 360)) - 3, 19, -1, "E");
	for (int k = 0; k <= dx / 10; k++){
		DrawLine(map(0, 360, 0, dx, ((int)test + k * 10) % 360), 7, map(0, 360, 0, dx, ((int)test + k * 10) % 360), 15, -1, 2);
		if (k % 9 == 0 || k == 0){
			DrawLine(map(0, 360, 0, dx, fmod(test + k * 10, 360)), 7, map(0, 360, 0, dx, fmod(test + k * 10, 360)), 18, -1, 2);
		}
	}

}

//map()のc言語版
double map(double a1, double a2, double b1, double b2, double s)
{
	if (s<a1){//範囲外の値が入力されたら
		return 0;
	}
	else if (s>a2){
		return 0;
	}
	else{
		return b1 + (s - a1)*(b2 - b1) / (a2 - a1);
	}
}

ライ

Re: メーターの目盛について

#2

投稿記事 by ライ » 12年前

追記
fmodを使うようにすると少し軽減されるのですが完全には消えません。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: メーターの目盛について

#3

投稿記事 by h2so5 » 12年前

横幅の関係で割り切れない座標ができてしまうので、ずれが生じるのは仕方がないです。

一応この横幅なら揺れて見えません。コードが分かりにくかったので修正しました。

コード:

#include "DxLib.h"
#include <stdio.h>
#include <math.h>

double map(double a1, double a2, double b1, double b2, double s);
void Display();
int dx = 720, dy = 50;
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
 
    //ウインドウサイズ設定
    SetGraphMode(dx, dy, 32);
 
    //ログを出力しない
    SetOutApplicationLogValidFlag(FALSE);
 
    // ウインドウモードで起動
    ChangeWindowMode(TRUE);
 
    // DXライブラリの初期化
    if (DxLib_Init() < 0) return -1;
 
    // 描画先を裏画面にする
    SetDrawScreen(DX_SCREEN_BACK);
 
    //ウインドウがアクティブではない状態でも処理を続行
    SetAlwaysRunFlag(TRUE);
 
    /*--------------------------------
    メインループ
    -----------------------------------*/
 
    while (!ProcessMessage())
    {
        ClearDrawScreen();
 
        //各種データの表示
        Display();
 
        // 裏画面の内容を表画面に反映
        ScreenFlip();
 
    }
 
    DxLib_End();
    return 0;
}
 
void Display(){
    static double count = 0;
	count += 0.1;
 
    DrawFormatString(map(0, 360, 0, dx, count) - 3,                  19, -1, "N");
    DrawFormatString(map(0, 360, 0, dx, fmod(count + 90, 360)) - 3,  19, -1, "W");
    DrawFormatString(map(0, 360, 0, dx, fmod(count + 180, 360)) - 3, 19, -1, "S");
    DrawFormatString(map(0, 360, 0, dx, fmod(count + 270, 360)) - 3, 19, -1, "E");

    for (int k = 0; k <= dx / 10; k++) {
		double x = map(0, 360, 0, dx, fmod(count + k * 10, 360));
        DrawLine(x, 7, x, 15, -1, 2);
        if (k % 9 == 0){
           DrawLine(x, 7, x, 18, -1, 2);
        }
    }
}
 
//map()のc言語版
double map(double a1, double a2, double b1, double b2, double s)
{
    if (s<a1) {//範囲外の値が入力されたら
        return a1;
    }
    else if (s>a2) {
        return a2;
    }
    else {
        return b1 + (s - a1)*(b2 - b1) / (a2 - a1);
    }
}

ライ

Re: メーターの目盛について

#4

投稿記事 by ライ » 12年前

ウインドウの大きさを変更せずに解決することはできないのでしょうか。
メーターの幅などもです。

閉鎖

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