トップページ > 過去ログ > 記事閲覧
このスピードメータのプログラムの意味がわかりません。
名前:ゆみ 日時: 2012/01/21 16:15

#include "DxLib.h" #include <math.h> #define PI 3.141592 #define MIN_ANGLE (PI/3*2) #define MAX_ANGLE (PI/3*7) #define ADD_SPEED (PI/220) #define SUB_SPEED (PI/180) double angle; char Key[256]; void calc_angle(){ if(Key[KEY_INPUT_Z]!=0){ if(angle<MAX_ANGLE){ angle+=ADD_SPEED-ADD_SPEED*(0.97*(angle-MIN_ANGLE)/(MAX_ANGLE-MIN_ANGLE)); if(angle>=MAX_ANGLE) angle-=ADD_SPEED*3; } } else{ if(angle>MIN_ANGLE){ angle-=SUB_SPEED; if(angle<MIN_ANGLE) angle=MIN_ANGLE; } } } #define BUNKATU 30 void meter_graph(){ int i; double ang=MIN_ANGLE; for(i=0;i<=BUNKATU;i++){ DrawLine(320+210*cos(ang),280+210*sin(ang),320+180*cos(ang),280+180*sin(ang),GetColor(255,0,0)); ang+=(MAX_ANGLE-MIN_ANGLE)/BUNKATU; } } void graph(){ DrawLine(320,280,320+200*cos(angle),280+200*sin(angle),GetColor(255,255,255)); DrawFormatString(300-70,380,GetColor(0,255,255),"%5.1fkm/h",(angle-MIN_ANGLE)*57.6); } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ angle=MIN_ANGLE; if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; SetDrawScreen( DX_SCREEN_BACK ); SetFontSize(36); while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && Key[KEY_INPUT_ESCAPE]==0){ calc_angle(); meter_graph(); graph(); ScreenFlip(); } DxLib_End(); return 0; } 私は高校でC言語をちょっぴりかじっている程度の初心者です! このプログラムの行すべての意味をこ初心者でもわかりやすく教えてくれませんか? ちなみにこのプログラムは サンプルプログラミングの館で見つけました。

Page: 1 |

Re: このスピードメータのプログラムの意味がわかりません。 ( No.1 )
名前:ゆみ 日時:2012/01/21 17:32

同じ質問の相互リンク→ttp://dixq.net/forum/viewtopic.php?f=3&t=10053
Re: このスピードメータのプログラムの意味がわかりません。 ( No.2 )
名前:いっち 日時:2012/01/21 19:38

C言語やウィンドウズプログラムやDXライブラリの不明点については、 それぞれ書籍やリファレンスをご覧になるのが宜しいかと思います。 アルゴリズムについてはポイントになりそうな部分だけ説明させていただきます。 このプログラムでは速度を angle の値で管理しています。 値は MIN_ANGLE 〜 MAX_ANGLE の間で変化し、0を基準に速度のように見立てると 0 〜 (MAX_ANGLE - MIN_ANGLE) になります。 Zキーが押されていた場合は加速、押されていなければ減速となります。 加速は以下の行で行われます。 @> angle+=ADD_SPEED-ADD_SPEED*(0.97*(angle-MIN_ANGLE)/(MAX_ANGLE-MIN_ANGLE));  > if(angle>=MAX_ANGLE) A> angle-=ADD_SPEED*3; @の「ADD_SPEED*(0.97*(angle-MIN_ANGLE)/(MAX_ANGLE-MIN_ANGLE))」の部分は angle の大きさにより 0 〜 (ADD_SPEED * 0.97) の間で変化します。 結果として、angle の角度(速度)が大きければ大きいほど加速しにくくなります。 Aは angle が最大値を超えていた場合、大きく減速しています。 結果として、Zキーを押しっぱなしにしていたりすると、 メーターの最大端付近で針が繰り返しはじかれるよな感じになります。 減速は angle が MIN_ANGLE 以下にならないように一定値を引いているだけです。 以下の処理はアナログメーターのメモリを描画しています。  > for(i=0;i<=BUNKATU;i++){ B> DrawLine(320+210*cos(ang),280+210*sin(ang),320+180*cos(ang),280+180*sin(ang),GetColor(255,0,0));  > ang+=(MAX_ANGLE-MIN_ANGLE)/BUNKATU;  > } メモリは (BUNKATU+1) 本の線で表されます。 Bの 320 と 280 という値はメーターの中心座標を表します。 210 という値は中心からメモリの線の外側までの距離を現します。 180 という値は中心からメモリの線の内側までの距離を現します。つまりメモリの線のサイズは(210-180)です。 それらの値にそれぞれ三角関数をかけることでメモリの線の角度を少しずつずらして描画しています。 以下の処理で、現在の速度を表す針と速度を描画しています。 C> DrawLine(320,280,320+200*cos(angle),280+200*sin(angle),GetColor(255,255,255)); D> DrawFormatString(300-70,380,GetColor(0,255,255),"%5.1fkm/h",(angle-MIN_ANGLE)*57.6); CはBとほぼ同じです。線のサイズが (200-0) となり長くなっただけです。 Dの 57.6 という値は angle を時速っぽい値に換算するための係数ですが、57.6 で無ければならない理由はありません。 ほぼ作った人の気まぐれです。
Re: このスピードメータのプログラムの意味がわかりません。 ( No.3 )
名前:ゆみ 日時:2012/01/21 22:47

私のためにこんなに書いて教えてくれて ありがとうございますつД`)・゚・。・゚゚・*:.。 この文のおかげで構造がなんなのか見えてきました!
Re: このスピードメータのプログラムの意味がわかりません。 ( No.4 )
名前:ゆみ 日時:2012/01/26 13:41

解決しました!

Page: 1 |