/*
  2003/07/22 小松 研吾
*/
import java.applet.*;
import java.awt.*;

public class Magline1 extends Applet {
    public void paint(Graphics g) {
	// 変数宣言
	Dimension d = getSize();
	int width = d.width;
	int height = d.height;
	int oldpltX, oldpltY, pltX, pltY;
	double h, theta, r, dr, k1, k2, k3, k4;

	// 変位量
	h = 0.01;
	// 始点
	theta = Math.PI / 12;
	r = 1;
	// 初期化
	dr = 0;
	k1 = 0; k2 = 0; k3 = 0; k4 = 0;

	g.setColor(Color.blue);
	// 表示域の周囲に四角形を描画
	g.drawRect(0, 0, width-1, height-1);
	// x軸を描画
	g.drawLine(0, height/2, width-1, height/2);
	// 惑星半径を単位とした目盛りを描画
	for(int i=2; i<=10 ; ++i)
	    g.drawLine(50*i, height/2-10, 50*i, height/2+10);
	// 惑星を描画（半径50pixelsの円）
	g.fillOval(-50, height/2-50, (int)(r/h), (int)(r/h));

	for(int j=0; j<5; ++j) { // 複数の磁力線を描画
	    // 始点を表示域の座標に変換
	    pltX = (int)(r/(2*h) * Math.sin(theta));
	    pltY = height/2 - (int)(r/(2*h) * Math.cos(theta));
	    oldpltX = pltX;
	    oldpltY = pltY;

	    // Runge-Kutta法
	    for(int i=0; i<width; i++) {
		k1 = h * f(theta, r);
		k2 = h * f(theta+h/2, r+k1/2);
		k3 = h * f(theta+h/2, r+k2/2);
		k4 = h * f(theta+h, r+k3);
		dr = (k1 + 2*k2 + 2*k3 + k4) / 6.0;
		r += dr;
		theta += h;

		// データ値を表示域の座標に変換し曲線を描画
		pltX = (int)(r/(2*h) * Math.sin(theta));
		pltY = height/2 - (int)(r/(2*h) * Math.cos(theta));
		g.setColor(Color.black);
		g.drawLine(oldpltX, oldpltY, pltX, pltY);
		oldpltX = pltX;
		oldpltY = pltY;

		// 惑星表面で線を打ち切る
		if(r<=1)
		    break;
	    }
	    // 次の磁力線の始点
	    r = 1;
	    theta = (double)(j+1) * (Math.PI/12);
	}
    }

    // 磁力線の方程式
    private double f(double theta, double r) {
	double value = 0;
	value = r * (2*Math.cos(theta) / Math.sin(theta));
	return value;
    }
}
