linuxでc言語でのプログラミングについて
下のプログラムは入力した4つ数字を円グラフで表示するものでこのプログラムをもとに棒グラフで表示するように変換しなくてはならないのですがHgwBoxFill関数を使うらしいのですがいろいろ試行錯誤してみてもできないのでどなたか教えてくれませんか?
1: /* プログラム始め */
2: #include <stdio.h>
3: #include <math.h>
4: #include "handy.h"
5:
6: /* プロトタイプ宣言 */
7: void draw_graph(int w, double start, double val, char *str);
8:
9: int main(void)
10: {
11: int w; /* ウィンドウID */
12: int c; /* 文字入力用 */
13: double XBASE = 100.0; /* ウィンドウ設定 */
14: double YBASE = 100.0;
15: double WINSIZE = 500.0;
16: int in1, in2, in3, in4; /* グラフ表示する数値 */
17: int total; /* グラフ表示する数値の総和 */
18: double sum; /* グラフ表示する数値の累積 */
19: double d1, d2, d3, d4; /* グラフ表示する数値の割合 */
20:
21: /* グラフ表示する数値の読み込み */
22: printf("四つの正整数を入力してください >> ");
23: scanf("%d %d %d %d", &in1, &in2, &in3, &in4);
24:
25: /* 各項がグラフ内で占める割合の計算 */
26: total = in1 + in2 + in3 + in4; /* 総和の計算 */
27: d1 = (double)in1 / (double)total; /* 割合の計算 */
28: d2 = (double)in2 / (double)total;
29: d3 = (double)in3 / (double)total;
30: d4 = (double)in4 / (double)total;
31:
32: /* ウィンドウの生成 */
33: w = HgWOpen(XBASE, YBASE, WINSIZE, WINSIZE);
34:
35: /* 線の幅指定 */
36: HgWWidth(w, 3.0);
37:
38: /* グラフの表示 */
39: sum = 0.0; /* 1項目めの表示 */
40: HgWColor(w, HG_RED);
41: draw_graph(w, sum, d1, "A");
42:
43: sum += d1; /* 2項目めの表示 */
44: HgWColor(w, HG_BLUE);
45: draw_graph(w, sum, d2, "B");
46:
47: sum += d2; /* 3項目めの表示 */
48: HgWColor(w, HG_GREEN);
49: draw_graph(w, sum, d3, "C");
50:
51: sum += d3; /* 4項目めの表示 */
51: HgWColor(w, HG_ORANGE);
53: draw_graph(w, sum, d4, "D");
54:
55: /* 最後に円表示 */
56: HgWColor(w, HG_BLACK);
57: HgWCircle(w, 250.0, 250.0, 200.0); /* 外側の円 */
58:
59:
60: printf("Push Any Key ");
61: c = getchar( );
62: c = getchar( );
63:
64: printf("Goodby!\n");
65:
66: return 0;
67: }
68:
69: /* */
70: /* グラフ表示する関数 */
71: /* */
72: void draw_graph(int w, double start, double val, char *str)
73: {
74: double x, y; /* 座標 */
75: double rad; /* 角度 */
76:
77: /* グラフの表示 */
78: rad = 2.0 * M_PI * (start + val); /* 角度計算 */
79: x = sin(rad) * 200.0 + 250.0; /* 座標計算 */
80: y = cos(rad) * 200.0 + 250.0;
81: HgWLine(w, 250.0, 250.0, x, y); /* グラフ表示 */
82:
83: /* 項目名の表示 */
84: rad = 2.0 * M_PI * (start + val / 2.0); /* 角度計算 */
85: x = sin(rad) * 120.0 + 250.0; /* 座標計算 */
86: y = cos(rad) * 120.0 + 250.0;
87: HgWColor(w, HG_BLACK);
88: HgWText(w, x, y, str); /* 項目名表示 */
89:
90: return; /* void型関数なので返り値なし */
91: }
92: /* プログラム終わり */
gnome端末がデスクトップ環境です
お礼
koujikuu様: >1) ラインカメラで物体の大きさと、通過個数をカウントしていると思われますが、物体の大きさを最初の一>回しかチェックしていません、物体が通過する間の一番大きい値で比較する必要があるのでは? →下名の勝手な判断で、現状はカメラの前に棒を置きっぱなしにしてパルス幅を測定していました。 その影響か、横から(落下方向でない方向から)物体を徐々にカメラ範囲内にいれると、KOSUが「2」と検出できていたので、なにか挙動がおかしいなと思っていました。 頂いたアドバイスをもとに、プログラムを考え直します。 >2) 割り込みキャプチャにおいて、Captime_rise[Rise]=IC2BUF、Captime_down[Down]=IC1BUF、の>Rise,Downの最大値のチェックが必要では? →これは、現状配列で4つまで定義しているので(Captime_rise[4])、3までのチェックということでしょうか。 現状の想定は __|¯|____|¯¯|__ のみで、一つ目のパルスの幅のみを計測する。 というものでした。2つめ以降は破棄するという考えと、PPを用いて前のサイクルのRise状態を見るという考えの乖離が、おかしな挙動を招いているのかもしれません。 >デバッグ方法 ありがとうございます。 LCDでの表示にばかりこだわっていました。 16FシリーズでTeraTermを用いてシリアル通信でのPC表示はしたことがあるので、教えて頂きました方法でデータも見て見ます。
補足
補足: 現状でKOSU=1と判別している最中に、KOSU=2のパルス幅を検知しても、KOSUの値が変わらないことに問題がありそうです。 パルス幅100以上で2と判断するプログラムで、50位の棒をカメラの前にすると、当然KOSU=1になります。 この状態で、棒をカメラに近づけてパルス幅を大きくし(光遮る範囲が大きくなる)、100以上にしてもKOSUが変化しません。 何かループの条件が意図しない動きなのかと思うので、もう一度洗ってみます。