画面に直線を引けたので、今回は関数のグラフを書いてみたいと思います。方眼紙を使ってy=f(x)という任意の関数のグラフを書くには、xの値に対応するyの値を求めれば書けますね。基本的には、この単純な方法を利用します。たとえばy=X2のグラフはxがゼロのときは、yもゼロでグラフ上の座標は(0,0)ですね。xが2になるとyの値は4になるので、グラフ上の座標は(1,4)ですね。そこでグラフを書くときは(0,0)と(1,4)を直線で結べばよいわけです。もちろん本来は直線でなく曲線で結べばよいのですが、xの増加分を微少な変化にして、対応するyの値を求めて直線で結べば、見た目はほとんどなめらかな曲線に見えます。これをプログラム上で表現すればよいわけです。ただし少し厄介なのは方眼紙だと原点の座標は(0,0)ですが、プログラム上の原点は、前回の例だと(50,200)になるところです。この点だけ気をつけてグラフを各プログラムを書いてみました。
import
java.applet.Applet;
import java.awt.*;
public class test3 extends
Applet{
public void paint(Graphics g){
int x0,y0,x1,y1,bx,by,ay;
double
dx,dy;
x0=50;
y0=300;
x1=500;
y1=10;
g.drawLine(x0,y1,x0,y0);//縦軸
g.drawLine(x0,y0,x1,y0);//横軸
dx=0;
dy=0;
bx=x0;
by=y0;
for(int
i=0;i<40;i++){
dx+=1;
dy=Math.pow(dx,0.5);
ay=(int)dy;
g.drawLine(bx,by,bx+i,by-ay);
bx+=i;
by-=ay;
}
}
}
このプログラムのポイントは新たにループ文を使っていることです。java言語におけるループ文の文法は、JavaScriptとほぼ同じみたいなのでココを参照してください。
dx=0;
dy=0;
bx=x0;
by=y0;
for(int
i=0;i<40;i++){
dx+=1;
dy=Math.pow(dx,0.5);
ay=(int)dy;
g.drawLine(bx,by,bx+i,by-ay);
bx+=i;
by-=ay;
}
このループ文では、iが1づづ増加しています。これを利用して、xの値が1づつ増えた時のyの値を求めています。ただし、ループ文そのものは、整数で回っているのですが、関数のグラフを求めるなら実数で解を求める必要があります。そこで、
dx+=1;
を使って、ループ文が1回繰り返されるごとに、実数型の変数であるdxという変数を1づづ増やしています。
dy=Math.pow(dx,0.5)
の部分は、同じく実数型の変数であるdyにdxを0.5乗した数値を代入しているところです。なお、javaでは変数を使うときに必ず宣言が必要なので、double
dx,dy;のように宣言しています。ここからが面倒なのですが、実は直線を引くコマンドg.drawLineは整数しか使えないみたいです。そこでdyの値を整数に変換するためにay=(int)dy;を使用しています。
g.drawLine(bx,by,bx+i,by-ay);
の部分のツボは、bx+i,by-ayの部分です。bx,byの部分は初期値が設定されています。最初は、bx=x0;by=y0;が入力されます。この初期座標、グラフ上の原点から、bx+iで横軸方向に1単位、by-ayで縦軸方向へ1単位移動した座標の間に直線を引いています。次に
bx+=i;
by-=ay;
の部分では新たな初期座標を定義しています。これを繰り返すことでなめらかなグラフを描いているわけです。完成品のアプレットは以下のようになります。