4.2 ソースプログラムdraw-graph.c

以下のプログラムは http://nalab.mind.meiji.ac.jp/~mk/labo/howto/glsc-progs/に置いてあります (curl -O http://nalab.mind.meiji.ac.jp/ mk/labo/howto/glsc-progs/draw-graph.c で入手可能)。


   1 /*
   2  * draw-graph.c -- 1変数関数のグラフを描く
   3  *   コンパイル:  ccmg draw-graph.c
   4  */
   5 
   6 
   7 #include <stdio.h>
   8 #include <math.h>
   9 
  10 #define G_DOUBLE
  11 #include <glsc.h>
  12 
  13 double pi;
  14 
  15 int main()
  16 {
  17   int i, n;
  18   double a, b, c, d;
  19   double h, x;
  20   double f(double);
  21   char title[100];
  22   double win_width, win_height, w_margin, h_margin;
  23 
  24   pi = 4 * atan(1.0);
  25 
  26   /* 表示する範囲 [a,b]×[c,d] を決定 */
  27   a = - 10 * pi; b = 10 * pi; c = - 2.0; d = 2.0;
  28 
  29   /* 区間の分割数 n */
  30   n = 200;
  31 
  32   /* GLSC の開始
  33      メタファイル名、ウィンドウ・サイズの決定 */
  34   win_width = 200.0; win_height = 200.0; w_margin = 10.0; h_margin = 10.0;
  35   g_init("GRAPH", win_width  + 2 * w_margin, win_height + 2 * h_margin);
  36 
  37   /* 出力デバイスの決定 */
  38   g_device(G_BOTH);
  39 
  40   /* 座標系の定義: [a,b]×[c,d] という閉領域を表示する */
  41   g_def_scale(0,
  42               a, b, c, d,
  43               w_margin, h_margin, win_width, win_height);
  44 
  45   /* 線を二種類用意する */
  46   g_def_line(0, G_BLACK, 2, G_LINE_SOLID);
  47   g_def_line(1, G_RED,   0, G_LINE_SOLID);
  48 
  49   /* 表示するための文字列の属性を定義する */
  50   g_def_text(0, G_BLACK, 3);
  51 
  52   /* 定義したものを選択する */
  53   g_sel_scale(0); g_sel_line(0); g_sel_text(0);
  54 
  55   /* 座標軸を描く */
  56   g_move(a, 0.0);  g_plot(b, 0.0);
  57   g_move(0.0, c); g_plot(0.0, d);
  58 
  59   /* タイトルを表示する */
  60   sprintf(title, "Bessel function J0(x)  (%g<=x<=%g)", a, b);
  61   g_text(20.0, 10.0, title);
  62 
  63   /* 刻み幅 */
  64   h = (b - a) / n;
  65   /* グラフを描くための線種の選択 */
  66   g_sel_line(1);
  67   /* 折れ線でグラフを描く */
  68   g_move(a, f(a));
  69   for (i = 1; i <= n; i++) {
  70     x = a + i * h;
  71     g_plot(x, f(x));
  72   }
  73 
  74   /* ユーザーのマウス入力を待つ */
  75   printf("終りました。X の場合はウィンドウをクリックして下さい。\n");
  76   g_sleep(-1.0);
  77   /* ウィンドウを閉じる */
  78   g_term();
  79   return 0;
  80 }
  81 
  82 double f(double x)
  83 {
  84   /* 0 次 Bessel 関数 */
  85   return j0(x);
  86 }



桂田 祐史