ページ 11

メーターの描画

Posted: 2012年7月27日(金) 22:11
by 33tree
dxライブラリでメーターを書こうと思いました。
線で書いてあったのはサンプルであったのですが太さを調節したく四角形で書くことにしました。
しかし描画した時四角形の形が歪になってしまうのですが式が良く出来ていないみたいです。

コード:

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

#define PI 3.14159265
#define MIN_ANGLE (PI/3*3)
#define MAX_ANGLE (PI/3*6)

//#define BUNKATU 10
void meter_graph(int BUNKATU){
        int i;
        double ang=MIN_ANGLE;
        for(i=0;i<=BUNKATU;i++){
                DrawLine(300+100*cos(ang),260+100*sin(ang),300+80*cos(ang),260+80*sin(ang),GetColor(255,0,0));
                ang+=(MAX_ANGLE-MIN_ANGLE)/BUNKATU;
        }
}

void sikaku(int BUNKATU){
	int i;
	double ang=MIN_ANGLE;
	int x=70, y=70;
	int cx=70, cy=150;
	int Color=GetColor(255,0,0);
	for(i=0;i<=BUNKATU;i++){
		int x1=(int)(cos(ang)*(x-cx)+sin(ang)*(cy-y)+cx);
		int y1=(int)(cos(ang)*(y-cy)+sin(ang)*(x-cx)+cy);
		int x2=(int)(cos(ang)*(x-cx-5)+sin(ang)*(cy-y)+cx);
		int y2=(int)(cos(ang)*(y-cy)+sin(ang)*(x-cx-5)+cy);
		int x3=(int)(cos(ang)*(x-cx-5)+sin(ang)*(cy-y-10)+cx);
		int y3=(int)(cos(ang)*(y-cy-10)+sin(ang)*(x-cx-5)+cy);
		int x4=(int)(cos(ang)*(x-cx)+sin(ang)*(cy-y-10)+cx);
		int y4=(int)(cos(ang)*(y-cy-10)+sin(ang)*(x-cx)+cy);
		DrawQuadrangle(
			x1, y1,
			x2, y2,
			x3, y3,
			x4, y4,
			Color,
			true
			); 
		ang+=(MAX_ANGLE-MIN_ANGLE)/BUNKATU;
	}

}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    if(ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;// 
    SetDrawScreen( DX_SCREEN_BACK );
    SetFontSize(36);
    while(!ProcessMessage() && !ClearDrawScreen()){
            meter_graph(10); 
			sikaku(10);
            ScreenFlip();
    }
    DxLib_End();
    return 0;
}

Re: メーターの描画

Posted: 2012年7月27日(金) 22:36
by softya(ソフト屋)
とりあえず前回の質問が放置されていますので、返答をお願いします。
「時計の秒針について • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=11118

Re: メーターの描画

Posted: 2012年7月27日(金) 22:55
by softya(ソフト屋)
sikaku関数内のBUNKATUの役目が良くわかりません。
meter_graphを見る限りではメーター目盛りの分解能である様に見受けられます。
あとsikakuとは、針を書く関数ではないのでしょうか?
ここにメーター目盛りの分解能が必要な理由を教えて下さい。

sikakuだけ形状を表していて役目の意味を持っていません。

Re: メーターの描画

Posted: 2012年7月27日(金) 22:59
by 33tree
>sikaku関数内のBUNKATUの役目が良くわかりません。
>meter_graphを見る限りではメーター目盛りの分解能である様に見受けられます。

メーター目盛りを書こうとしています。
http://dixq.net/forum/viewtopic.php?f=3 ... 917#p89917
ここでのメモリを作ろうとしています。

Re: メーターの描画

Posted: 2012年7月27日(金) 23:02
by 33tree
目盛りの四角形が潰れてしまいます。

Re: メーターの描画

Posted: 2012年7月27日(金) 23:08
by softya(ソフト屋)
33tree さんが書きました:>sikaku関数内のBUNKATUの役目が良くわかりません。
>meter_graphを見る限りではメーター目盛りの分解能である様に見受けられます。

メーター目盛りを書こうとしています。
http://dixq.net/forum/viewtopic.php?f=3 ... 917#p89917
ここでのメモリを作ろうとしています。
失礼しました。前の質問と混じって針を書くことと勘違いしましたね。
もっと楽に書けると思いますので少々お待ち下さい。

Re: メーターの描画

Posted: 2012年7月27日(金) 23:29
by softya(ソフト屋)
softya(ソフト屋) さんが書きました:
33tree さんが書きました:>sikaku関数内のBUNKATUの役目が良くわかりません。
>meter_graphを見る限りではメーター目盛りの分解能である様に見受けられます。

メーター目盛りを書こうとしています。
http://dixq.net/forum/viewtopic.php?f=3 ... 917#p89917
ここでのメモリを作ろうとしています。
失礼しました。前の質問と混じって針を書くことと勘違いしましたね。
もっと楽に書けると思いますので少々お待ち下さい。
分かりました。
meter_graphの目盛りを書いている計算式とsikakuの太い目盛りを書く計算式が全然違います。
手順として次のようにしてみたらどうでしょうか?
(1) meter_graphの式を移植して微妙に角度と長さ変えて違う色でlineを描画する。
(2) (1)のline対して更に少し角度を変えて太い目盛りの幅分ずれたlineを描画する。
(3) (1)と(2)の頂点で四角形を描画するように改造する。
の3段階でどうでしょうか?

Re: メーターの描画

Posted: 2012年7月28日(土) 07:54
by 33tree
少しずらしたのですがこれ以上角度を同じにしていくと変になっていきます。
どうすればいいですか?

コード:


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

#define PI 3.14159265
//#define MIN_ANGLE (PI/3*3)
//#define MAX_ANGLE (PI/3*6)

//#define BUNKATU 10
void meter_graph(int BUNKATU){
        int i;
        double ang=0;
		double bang=-PI/7;
        for(i=0;i<=BUNKATU;i++){
                DrawLine(300+100*cos(ang),260+100*sin(ang),300+80*cos(ang),260+80*sin(ang),GetColor(255,0,0));
				DrawLine(300+100*cos(bang),260+100*sin(bang),300+80*cos(bang),260+80*sin(bang),GetColor(255,0,0));
                ang+=(MAX_ANGLE-MIN_ANGLE)/BUNKATU;
				bang+=(PI/7*8-PI/7)/BUNKATU;;
        }
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    if(ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;// 
    SetDrawScreen( DX_SCREEN_BACK );
    SetFontSize(36);
    while(!ProcessMessage() && !ClearDrawScreen()){
            meter_graph(10); 
            ScreenFlip();
    }
    DxLib_End();
    return 0;
}

Re: メーターの描画

Posted: 2012年7月28日(土) 07:57
by 33tree
何を考えていたのだろう?

Re: メーターの描画

Posted: 2012年7月28日(土) 07:58
by 33tree
できた

Re: メーターの描画

Posted: 2012年7月28日(土) 08:05
by 33tree
できましたけど、もう少し細くしてみます。

コード:

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

#define PI 3.14159265
//#define MIN_ANGLE (PI/3*3)
//#define MAX_ANGLE (PI/3*6)

//#define BUNKATU 10
void meter_graph(int BUNKATU){
        int i;
        double ang=PI/48;
		double bang=-PI/48;
        for(i=0;i<=BUNKATU;i++){
                //DrawLine(300+100*cos(ang),260+100*sin(ang),300+80*cos(ang),260+80*sin(ang),GetColor(255,0,0));
				//DrawLine(300+100*cos(bang),260+100*sin(bang),300+80*cos(bang),260+80*sin(bang),GetColor(255,0,0));
				        DrawQuadrangle(
            300+100*cos(ang), 260+100*sin(ang),
            300+100*cos(bang),260+100*sin(bang),
            300+80*cos(bang),260+80*sin(bang),
            300+80*cos(ang), 260+80*sin(ang),
            GetColor(255,0,0),
            true
            ); 
                ang+=(PI)/BUNKATU;
				bang+=(PI)/BUNKATU;;
        }
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    if(ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;// 
    SetDrawScreen( DX_SCREEN_BACK );
    SetFontSize(36);
    while(!ProcessMessage() && !ClearDrawScreen()){
            meter_graph(10); 
            ScreenFlip();
    }
    DxLib_End();
    return 0;
}


Re: メーターの描画

Posted: 2012年7月28日(土) 08:10
by 33tree
こんなかんじかな

コード:

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

#define PI 3.14159265
//#define MIN_ANGLE (PI/3*3)
//#define MAX_ANGLE (PI/3*6)

//#define BUNKATU 10
void meter_graph(int BUNKATU){
        int i;
        double ang=PI/200;
		double bang=-PI/200;
        for(i=0;i<=BUNKATU;i++){
                //DrawLine(300+100*cos(ang),260+100*sin(ang),300+80*cos(ang),260+80*sin(ang),GetColor(255,0,0));
				//DrawLine(300+100*cos(bang),260+100*sin(bang),300+80*cos(bang),260+80*sin(bang),GetColor(255,0,0));
			
			DrawQuadrangle(
				300+100*cos(ang), 260+100*sin(ang),
				300+100*cos(bang),260+100*sin(bang),
				300+80*cos(bang),260+80*sin(bang),
				300+80*cos(ang), 260+80*sin(ang),
				GetColor(255,0,0),
				true
				); 
			
			ang+=(PI)/BUNKATU;
			bang+=(PI)/BUNKATU;;
		}
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    if(ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;// 
    SetDrawScreen( DX_SCREEN_BACK );
    SetFontSize(36);
    while(!ProcessMessage() && !ClearDrawScreen()){
            meter_graph(10); 
            ScreenFlip();
    }
    DxLib_End();
    return 0;
}