現代では常識になっていることだが、実際に連続的に図を変化させなくても、
十分素早く図を切り変えれば「連続的に動いている」ように見える。適当な時
間間隔
を定めて、時刻
(
) に
おける
の関数
のグラフを次々に描けばよいであろう。以下
では、古いグラフを消すために erase() を用いている。
* reidai2.f -- 簡単な動画 (紙芝居?)
program rei2
* 変数の宣言
integer i,N,j,Jmax
real Pi,a,b,margin
real Time,h,dt,t,x,f
external f
* Pi=円周率, a=区間の左端, b=区間の右端, margin=余白
Pi = 4.0 * atan(1.0)
a = 0.0
b = 2.0 * Pi
margin = (b - a) / 20
* x軸の区間の分割数、追跡時間の入力
write(*,*) ' x軸上の区間の分割数='
read(*,*) N
write(*,*) ' 追跡時間='
read(*,*) Time
* 区間の刻み幅
h = (b - a) / N
* グラフィックスの初期化
call openpl
call fspace2(a - margin, -2.0, b + margin, 2.0)
* 時間間隔を決め、ループの回数を計算する
dt = 1.0 / 16.0
Jmax = Time / dt + 0.5
******** メイン・ループ ********
do j=0,Jmax
t = j * dt
call erase
call fmove(a, f(a,t))
do i = 1, N
x = a + i * h
call fcont(x, f(x,t))
end do
call xflush
end do
****** メイン・ループ終り ******
* グラフィックスの後始末
call closepl
end
******************************************
* 両端を固定された弦のある3つの固有振動の和
* 時刻 t=0 では、例題1 に現われる関数に一致する
real function f(x,t)
real x,t
f = sin(x)*cos(t)+sin(3*x)*cos(3*t)+sin(5*x)*cos(5*t)
end
/*
* reidai2.c -- 簡単な動画 (紙芝居?)
* How to compile: ccx reidai2.c
*/
#include <stdio.h>
#include <math.h>
#include <fplot.h>
int main()
{
/* 変数の宣言 */
int i, N, j, Jmax;
double Pi, a, b, margin;
double Time, h, dt, t, x, f(double, double);
/* Pi=円周率, a=区間の左端, b=区間の右端, margin=余白 */
Pi = M_PI;
a = 0.0;
b = 2.0 * Pi;
margin = (b - a) / 20;
/* x軸の区間の分割数、追跡時間の入力 */
printf("x軸上の区間の分割数=");
scanf("%d", &N);
printf("追跡時間=");
scanf("%lf", &Time);
/* 区間の刻み幅 */
h = (b - a) / N;
/* グラフィックスの初期化 */
openpl();
fspace2(a - margin, -2.0, b + margin, 2.0);
/* 時間間隔を決め、ループの回数を計算する */
dt = 1.0 / 16.0;
Jmax = Time / dt + 0.5;
/* ******* メイン・ループ ******* */
for (j = 0; j <= Jmax; j++) {
t = j * dt;
erase();
fmove(a, f(a, t));
for (i = 1; i <= N; i++) {
x = a + i * h;
fcont(x, f(x, t));
}
xflush();
}
/* ***** メイン・ループ終り ***** */
/* グラフィックスの後始末 */
closepl();
return 0;
}
/*
* 両端を固定された弦のある3つの固有振動の和
* 時刻 t=0 では、例題1 に現われる関数に一致する
*/
double f(double x, double t)
{
return sin(x) * cos(t) + sin(3 * x) * cos(3 * t) + sin(5 * x) * cos(5 * t);
}
これもコンパイルして実行してみよう。
| Fortran の場合 |
oyabun% f77x reidai2.f |
| C の場合 |
oyabun% ccx reidai2.c |
長い追跡時間を指定した場合は、停止させたくなったときに C-C (コントロー ル C) を打てば止めることができる。