ページ 1 / 1
無題
Posted: 2008年1月24日(木) 17:11
by TK
はじめまして初心者です。
車のスピードメーターを表示したいんですが、常に変化する変数などに対応してメーターも変化させるには、
どういった関数を使い、どういったプログラムの流れにしていけばいいですか?
Re:無題
Posted: 2008年1月24日(木) 18:45
by たかぎ
制御方法はスピードメーターの仕様によります。
> どういった関数を使い、
普通は既存の関数ではなく、自分でハードウェアを制御することになると思います。
別の担当者が制御部分のモジュールを作っているのであれば、どんな関数を呼べばよいかはその担当者に聞いてください。
Re:無題
Posted: 2008年1月24日(木) 18:47
by やそ
メータの針をスピードに対応した角度で表示してあげればいいでしょう。
Cの関数と言うよりもアルゴリズム構築の段階の質問のような気がします。
角度はラジアンで計算するといいんじゃないかな?
まずは最高速(REDZONE)を決めて、そこは角度的には何度に設定するか。
最低速度(0MPH)の時の針の角度も決めておいたほうがいいでしょう。
それで必然的に速度:角度が決まると思います。
重要なのは、いつ、どのように速度が決まるのか。じゃないでしょうか?
アクセルやブレーキ、クラッチに相当するキーがあって、アクセルベタ踏み(押しっぱなし)だと速度が上がるとかだと楽しそうですね。
がんばってください。
Re:無題
Posted: 2008年1月24日(木) 18:50
by やそ
え、本当にホンモノのメーターを測定するのでしょうか?
それだと全く話は違いそうですね^^;
Re:無題
Posted: 2008年1月24日(木) 19:39
by たかぎ
> え、本当にホンモノのメーターを測定するのでしょうか?
質問の文面からはそうとしか読み取れませんね。
Re:無題
Posted: 2008年1月24日(木) 19:54
by 管理人
表示したいと言うからにはDXライブラリか何かを使ってメーター表示をしたいのでしょうけど・・。
例えば、PIを円周率とするとき、
double p;
p=PI/2;
を0kmとし、スピードメーターは200キロまであり、角度PI*3/2まである物とするとき
double speed;
に現在のスピードが入っているならば
#define MAX_SPEED 200.0
p=PI/2 + PI*3/2 * speed/MAX_SPEED;
これで角度求まると思いますよ。後はこの角度に従ってメーターの針を表示すればいいと思います。
無題
Posted: 2008年1月24日(木) 20:13
by 通りすがり
とやかくいう筋合い無いですが、いつもそのように書かれる傾向があるのでお書きしますが、
わざと質問者の意図ではない意地悪な受け取り方をした記述をするのは、質問者のみならず、周りの者からも見ていて気持ちいい物じゃないので、やめた方がいいのではないかと思いますよ。
今回、「変化する変数に従ってメーターを表示したい」と書いているのですから、どう考えたってハードウェアの話じゃないし、そんな話ここでするわけがないですしね。
質問者の言い方を直させたいなら「○○を補足してください。」と書いた方が見ている方も気分がいいです。
Re:無題
Posted: 2008年1月24日(木) 22:58
by たかぎ
> とやかくいう筋合い無いですが、いつもそのように書かれる傾向があるのでお書きしますが、
> わざと質問者の意図ではない意地悪な受け取り方をした記述をするのは、質問者のみならず、周りの者からも> 見ていて気持ちいい物じゃないので、やめた方がいいのではないかと思いますよ。
そう受け取られたのなら謝ります。
決して意地悪をしているわけではなく、極力言葉通りに理解しようと努めています。
> 今回、「変化する変数に従ってメーターを表示したい」と書いているのですから、どう考えたってハードウェアの話じゃないし、そんな話ここでするわけがないですしね。
スピードメーターは何もアナログで針が動くものばかりではありません。
あまり良い例が見当たらなかったのですが、例えば
http://www.nagaidenshi.co.jp/MONITOR/4010.shtml
であれば、明らかに「表示」しています。
Re:無題
Posted: 2008年1月24日(木) 23:15
by たかぎ
一点書き忘れました。
> そんな話ここでするわけがないですしね。
先ほどの
http://www.nagaidenshi.co.jp/MONITOR/4010.shtml
のページに掲載されている基本配線図にある「エンジンコンピュータ」のプログラムはC言語で記述することが多いでしょうから、ここで話をしたとしても何の不思議もありません。
Re:無題
Posted: 2008年1月25日(金) 00:03
by やそ
たとえば、メモリ使用率とかをタコメーター風に表示するアクセサリとかあるじゃないですか。
私はあんな感じを想像していました^^
Re:無題
Posted: 2008年1月25日(金) 00:08
by たかぎ
真意は質問者さんが現れないと分かりませんね。
コンパイラもOSも全く分かりませんし、プラットフォームを推測する手がかりは「車の」という部分だけですから。
Re:無題
Posted: 2008年1月25日(金) 13:35
by 管理人
スピードメーターと言えば・・。
バイクが好きなんで、バイクの話ですが、
R1といい1000RRといい、最近のスーパースポーツバイクのメーターはほとんどデジタルです。
私はデジタルは好きじゃないんですが・・、そういう人の為に両方装備されてる奴もあります。
http://blog.goo-net.com/ts-prime/img/90/1400gtr-1.jpg
見慣れているので、デジタルのスピードメーターには全く違和感が無いんですが、
やっぱ一般的にはまだまだアナログですよね。
タコメーターまでデジタルの奴はほんと見難いんで、全部アナログでいいと思うんですが・・。
まぁ質問者さんに補足してもらわないとですね。
Re:無題
Posted: 2008年1月25日(金) 14:47
by やそ
へー、最近はデジタルメーターも増えてきてるんですね^^
私はデジタルメーターと言えば『ナイトライダー』のイメージしか無かった(笑)
Re:無題
Posted: 2008年1月25日(金) 20:56
by 管理人
最近はデジタル多いですよぉ。ネイキッドやアメリカンはアナログが多いと思いますけど。
理由あるんでしょうねぇ・・知りません;
先生も帰ってしまったし・・、帰る前に遊びで作ってみました。
メーターは欧州300km規制が入った隼辺りをイメージして・・。
若干リアリティ出すために余計なことしてるんで、ショウモナイとこ読みにくくなってますが、こんな感じでしょうか?
角度からスピード出してるんで、本来反対なんですけど、まぁイメージとして・・。
#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;
}