これは以前書いた 「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);
}