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