next up previous contents
Next: 3.4.1.0.2 問題1: Up: 3.4.1 変数関数のグラフ Previous: 3.4.1 変数関数のグラフ

3.4.1.0.1 例題1:

$ y=\sin x+\sin 3x+\sin 5x$ のグラフを描きなさい。
Fortran の場合
    

* reidai1.f -- サブルーチン呼び出しによるグラフ描き
      program reidai1
*      変数の宣言
*      a: 区間の左端の座標, b: 区間の右端の座標, margin: 余白の大きさ
      real Pi,a,b,margin
      integer N,i
      real h,x,f
      external f
*
      Pi = 4.0 * atan(1.0)
      a = 0.0
      b = 2.0 * Pi
      margin = (b - a) / 20
*      x 軸の分割の仕方の決定
      write(*,*) ' x軸の区間の分割数を入力して下さい'
      read(*,*) N
      h = (b - a) / N
*      グラフィックスの初期化
      call openpl
      call fspace2(a - margin, -3.0, b + margin, 3.0)
*       始点のセット
      call fmove(a, f(a))
*       グラフ上の点を順に結ぶ
      do i = 1, N
        x = a + i * h
        call fcont(x, f(x))
      end do
*       図形を記録する
      call mkplot("reidai1.plot")
*       グラフィックスの後始末
      call closepl
      end
*************************************************
      real function f(x)
      real x
      f = sin(x) + sin(3.0 * x) + sin(5.0 * x)
      end
C の場合
    

/*
 * reidai1.c -- サブルーチン呼び出しによるグラフ描き
 *   How to compile: ccx reidai1.c
 */

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

int main()
{
    /* 変数の宣言
     *  a: 区間の左端の座標, b: 区間の右端の座標, margin: 余白の大きさ
     */
    double Pi, a, b, margin;
    int N, i;
    double h, x, f(double);

    Pi = M_PI;
    a = 0.0;
    b = 2.0 * Pi;
    margin = (b - a) / 20;
    /* x 軸の分割の仕方の決定 */
    printf("x軸の区間の分割数を入力して下さい: ");
    scanf("%d", &N);
    h = (b - a) / N;
    /* グラフィックスの初期化 */
    openpl();
    fspace2(a - margin, -3.0, b + margin, 3.0);
    /* 始点のセット */
    fmove(a, f(a));
    /* グラフ上の点を順に結ぶ */
    for (i = 1; i <= N; i++) {
        x = a + i * h;
        fcont(x, f(x));
    }
    /* 図形を記録する */
    mkplot("reidai1.plot");
    /* グラフィックスの後始末 */
    closepl();
    return 0;
}

double f(double x)
{
    return sin(x) + sin(3.0 * x) + sin(5.0 * x);
}

全体が、主プログラム (Fortran では、program reidai1, C では関 数 main()) と関数副プログラム f の 2 つの部分からなっている。 主プログラムの中で呼び出している openpl, fspace2, fmove, fcont, closepl が fplot の命令である。

openpl() は他のすべてのグラフィックス命令に先立って呼び出す。これ によって図を描くためのウィンドウがオープンされる。

fspace2() はウィンドウに座標を割り振るために用いる。


		 Fortran の場合 		 call fspace2(x0,y0,x1,y1)

C の場合 fspace2(x0,y0,x1,y1);
とするとウィンドウの左下隅が (x0, y0)、右上隅が (x1,y1) に なる (当然 x0$ <$x1, y0$ <$y1 でなければならない)。扱う問題に応じて適当 な値を見い出して呼び出す必要がある。 次の fmove(), fcont() は後回しにして、最後の closepl() を先に解説しよう。これは openpl() と対になる命令で、 図形描画を終了させて後始末をするものである。実行がここに到達すると、プ ログラムは利用者がマウスでウィンドウをクリックするのを待つ状態になる。

ここまで解説した openpl(), fspace2(), closepl() は 実際には画面に何も描かないが、何時でも必要である。つまりプログラムは必 ず

Fortranの場合
 ..........
 call openpl
 ..........
 call fspace2(x0,y0,x1,y1)
 ..........
 実際の描画命令の列
 ..........
 call closepl
 ..........
Cの場合
 ..........
 openpl();
 ..........
 fspace2(x0,y0,x1,y1);
 ..........
 実際の描画命令の列
 ..........
 closepl();
 ..........
という形になる。

fmove() は「ペンを移動する(=move)」, fcont() は「線を引 きながら (つなぎながら=continue) ペンを動かす」という命令である。つま り、これらの命令では仮想のペンを考えて、それを移動することにより図形を 描画する3.5。 ではコンパイルしてから実行してみよう。
Fortran の場合

oyabun% f77x reidai1.f

reidai1.f:
MAIN reidai1:
f:
oyabun% reidai1
x軸の区間の分割数を入力して下さい
100
oyabun%
Cの場合

oyabun% ccx reidai1.c

oyabun% reidai1
x軸の区間の分割数を入力して下さい: 100
oyabun%


next up previous contents
Next: 3.4.1.0.2 問題1: Up: 3.4.1 変数関数のグラフ Previous: 3.4.1 変数関数のグラフ
Masashi Katsurada
平成18年4月28日