- ベストアンサー
プログラミングの変数の使い方について
プログラミングについておききしたいのですが、 ライントレースで左右のカーブを曲がる際に 変数を使って、「さっきは右に曲がったので次は右から曲がる」や 「さっきは左に曲がったから左から曲がる」といったプログラムは どのようにつくったらいいのでしょうか? まだ初心者なので変数をうまく使えなくて悩んでいます。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ライントレースというのが、具体的にどんなものを想定しているかよくわかりませんが。 if 「さっき左に曲った」then 右に曲がる というプログラムにしたいのなら「さっき左に曲がった」ということを「記憶」しておく必要があります。 それが「変数」の役目です。 どんな変数にするかは、何を覚えさせたいか、によります。 直前の分岐だけが対象なら、「最後に曲がった方向」変数を用意して sub 右に曲がる { 進行方向=右 ; 最後に曲がった方向:=右 } sub 左に曲がる { 進行方向=左 ; 最後に曲がった方向:=左 } if 最後に曲がった方向=左 then Call 右に曲がる みたいになるだろうし、「交差点」をさっきどちらへ曲がった、ということなら、 sub 左に曲がる(交差点番号) { 進行方向=左 ; 最後に曲がった方向[交差点番号]:=左 } if 最後に曲がった方向[交差点番号]=左 then Call 右に曲がる[交差点番号] みたいに、交差点毎に記憶させる必要があるでしょう。
その他の回答 (1)
- Willyt
- ベストアンサー率25% (2858/11131)
コンピュ-タは幾何的な情報を扱うのは大変難しいのです。左カーブ、右カーブを表現するのは高度なテクニックが必要です。曲がったかどうかは座標の二回微分がゼロであるかどうかで分るのですが、そのプラスマイナスをどう決めるかは座標系の採り方で変わって来るのです。通常はZ軸を上にとる場合、X→Y への変化は反時計回りですが、これを時計回りにすると、符号が逆になります。これに留意し、データの二回差分の符号を判定して行けばいいのです。ただ、二回差分をとるにはデータは2個では不足で、3個必要になることはわかりますよね。ちなみにどういうわけか、地図データは左手系、つまりX→Yが時計回りになる座標系を使います。地図データを扱う場合、これを誤認すると大変なことになりますよ。
補足
ご回答くださってありがとうございます! 今のところ下記のような感じにできているのですが 修正点や加えた方がいい点、省略できる点はありますでしょうか? よろしくお願いします。 mainの上は省略させて頂きました。 int main(void) { int R = 0; while(1) { if(GetTouch(CH_2) == 1){//タッチスイッチでのON/OFFスイッチです while(GetTouch(CH_2) == 0); MotorPower(CH_B|CH_C, 0); while(GetTouch(CH_2) == 1); while(GetTouch(CH_2) == 0); MotorPower(CH_B|CH_C, 40); while(GetTouch(CH_2) == 1); }else{ //ここからライントレースの内容です clock_t start,end; clock_t start2,end2; if (GetSensor(CH_3) > kuro && R == 0) { start = clock(); migi(CH_B|CH_C); while(GetSensor(CH_3) > kuro){ end = clock(); start2 = clock(); if(((double)(end - start)/CLOCKS_PER_SEC)>0.2){ hidari(CH_B|CH_C); while(GetSensor(CH_3) > kuro); end2 = clock(); MotorPower(CH_B|CH_C,40); R = 1; break; } while( R == 1 ){ if(GetSensor(CH_3) > kuro){ hidari(CH_B|CH_C); while(GetSensor(CH_3) > kuro); MotorPower(CH_B|CH_C,40); R = 0; break; }else { if(((double)(end2 - start2)/CLOCKS_PER_SEC)>0.2){ migi(CH_B|CH_C); while(GetSensor(CH_3) > kuro); MotorPower(CH_B|CH_C,40); }//ifのカッコ }//whileのカッコ }//elseのカッコ }//whileのカッコ }//ifのカッコ }//elseのカッコ }//whileのカッコ }//mainのカッコ