メーターの描画

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

メーターの描画

#1

投稿記事 by 33tree » 13年前

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;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: メーターの描画

#2

投稿記事 by softya(ソフト屋) » 13年前

とりあえず前回の質問が放置されていますので、返答をお願いします。
「時計の秒針について • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=11118
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: メーターの描画

#3

投稿記事 by softya(ソフト屋) » 13年前

sikaku関数内のBUNKATUの役目が良くわかりません。
meter_graphを見る限りではメーター目盛りの分解能である様に見受けられます。
あとsikakuとは、針を書く関数ではないのでしょうか?
ここにメーター目盛りの分解能が必要な理由を教えて下さい。

sikakuだけ形状を表していて役目の意味を持っていません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

33tree

Re: メーターの描画

#4

投稿記事 by 33tree » 13年前

>sikaku関数内のBUNKATUの役目が良くわかりません。
>meter_graphを見る限りではメーター目盛りの分解能である様に見受けられます。

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

33tree

Re: メーターの描画

#5

投稿記事 by 33tree » 13年前

目盛りの四角形が潰れてしまいます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: メーターの描画

#6

投稿記事 by softya(ソフト屋) » 13年前

33tree さんが書きました:>sikaku関数内のBUNKATUの役目が良くわかりません。
>meter_graphを見る限りではメーター目盛りの分解能である様に見受けられます。

メーター目盛りを書こうとしています。
http://dixq.net/forum/viewtopic.php?f=3 ... 917#p89917
ここでのメモリを作ろうとしています。
失礼しました。前の質問と混じって針を書くことと勘違いしましたね。
もっと楽に書けると思いますので少々お待ち下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: メーターの描画

#7

投稿記事 by softya(ソフト屋) » 13年前

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段階でどうでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

33tree

Re: メーターの描画

#8

投稿記事 by 33tree » 13年前

少しずらしたのですがこれ以上角度を同じにしていくと変になっていきます。
どうすればいいですか?

コード:


#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;
}

33tree

Re: メーターの描画

#9

投稿記事 by 33tree » 13年前

何を考えていたのだろう?


33tree

Re: メーターの描画

#11

投稿記事 by 33tree » 13年前

できましたけど、もう少し細くしてみます。

コード:

#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;
}


33tree

Re: メーターの描画

#12

投稿記事 by 33tree » 13年前

こんなかんじかな

コード:

#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;
}

閉鎖

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