4.2 プログラム例1: 1変数関数のグラフ

これは以前書いた 「GLSCの紹介」4節 のプログラムを書き直したもの。

ターミナルで入手&コンパイル&実行
curl -O https://m-katsurada.sakura.ne.jp/misc/20171202/draw-graph-GLSC3D.c
ccg draw-graph-GLSC3D.c
./draw-graph-GLSC3D


/*
 * draw-graph-GLSC3D.c -- 1変数関数のグラフを描く
 *   コンパイル:  ccg draw-grap-GLSC3D.c
 */

#include <stdio.h>
#include <math.h>

#ifdef OLD
#define G_DOUBLE
#include <glsc.h>
#else
#include <glsc3d_3.h>
#endif

double pi;

int main()
{
  int i, n;
  double a, b, c, d;
  double h, x;
  double f(double);
#ifdef OLD
  char title[100];
#endif
  double win_width, win_height, w_margin, h_margin;

  pi = 4 * atan(1.0);

  /* 表示する範囲 [a,b]×[c,d] を決定 */
  a = - 10 * pi; b = 10 * pi; c = - 2.0; d = 2.0;

  /* 区間の分割数 n */
  n = 200;

  /* GLSC の開始
     メタファイル名、ウィンドウ・サイズの決定 */
#ifdef OLD
  win_width = 200.0; win_height = 200.0; w_margin = 10.0; h_margin = 10.0;
#else
  win_width = 600.0; win_height = 600.0; w_margin = 30.0; h_margin = 30.0;
#endif
  g_init("GRAPH", win_width  + 2 * w_margin, win_height + 2 * h_margin);

#ifdef OLD
  /* 出力デバイスの決定 */
  g_device(G_BOTH);
#endif

  /* 座標系の定義: [a,b]×[c,d] という閉領域を表示する */
#ifdef OLD
  g_def_scale(0,
              a, b, c, d,
              w_margin, h_margin, win_width, win_height);
#else
  g_def_scale_2D(0,
		 a, b, c, d,
		 w_margin, h_margin, win_width, win_height);
  g_cls(); // ないとマズイ?
#endif

  /* 線を二種類用意する */
#ifdef OLD
  g_def_line(0, G_BLACK, 2, G_LINE_SOLID);
  g_def_line(1, G_RED,   0, G_LINE_SOLID);
#else
  // 線のtypeは用意されていない
#define G_LINE_SOLID (0)
  g_def_line(0, 0, 0, 0, 1, 2, G_LINE_SOLID);
  g_def_line(1, 1, 0, 0, 1, 2, G_LINE_SOLID);// 太くしないと点線のように見える
#endif
  /* 表示するための文字列の属性を定義する */
#ifdef OLD
  g_def_text(0, G_BLACK, 3);
#else
  g_def_text(0, 0, 0, 0, 1, 24); // 文字のサイズの単位が全然違う
#endif
  /* 定義したものを選択する */
  g_sel_scale(0); g_sel_line(0); g_sel_text(0);

  /* 座標軸を描く */
#ifdef OLD
  g_move(a, 0.0); g_plot(b, 0.0);
  g_move(0.0, c); g_plot(0.0, d);
#else
  g_move_2D(a, 0.0); g_plot_2D(b, 0.0);
  g_move_2D(0.0, c); g_plot_2D(0.0, d);
#endif
  /* タイトルを表示する */
#ifdef OLD
  sprintf(title, "Bessel function J0(x)  (%g<=x<=%g)", a, b);
  g_text(20.0, 10.0, title);
#else
  g_text_standard(60.0, 30.0, "Bessel function J0(x)  (%f<=x<=%f)", a, b);
#endif
  /* 刻み幅 */
  h = (b - a) / n;
  /* グラフを描くための線種の選択 */
  g_sel_line(1);
  /* 折れ線でグラフを描く */
#ifdef OLD
  g_move(a, f(a));
#else
  g_move_2D(a, f(a));
#endif
  for (i = 1; i <= n; i++) {
    x = a + i * h;
#ifdef OLD
    g_plot(x, f(x));
#else
    g_plot_2D(x, f(x));
#endif
  }
#ifndef OLD
  g_finish();
#endif

  /* ユーザーのマウス入力を待つ */
  printf("終りました。X の場合はウィンドウをクリックして下さい。\n");
  g_sleep(-1.0);
  /* ウィンドウを閉じる */
#ifdef OLD
  g_term();
#endif
  return 0;
}

double f(double x)
{
  /* 0 次 Bessel 関数 */
  return j0(x);
}



桂田 祐史