Source (JDK1.0.2)


// --------------------------------------------
// Walkin' Panko :)
//
//     Written by panko       panko@anet.ne.jp
//
// --------------------------------------------
import java.applet.Applet;
import java.awt.*;
import java.util.Vector;

public class Walker extends Applet implements Runnable {
	
	Thread t;
	int interval;
	
	Vector ps;
	Vector ls;
	
	double dx;
	double dy;
	double dz;
	
	double r; //Degrees between Panko's leg and a vertical line.
	double m; //Increment or decrement of "r".
	
	int mx;
	int my;
	
	Canvas dc;
	Panel control;
	Scrollbar scx;
	Scrollbar scy;
	Scrollbar scz;
	
	public void init() {
		
		String s;
		s=getParameter("dx");
		if(s != null) {
			dx=Double.valueOf(s).doubleValue();
		} else {
			dx=20;
		}
		s=getParameter("dy");
		if(s != null) {
			dy=Double.valueOf(s).doubleValue();
		} else {
			dy=40;
		}
		s=getParameter("dz");
		if(s != null) {
			dz=Double.valueOf(s).doubleValue();
		} else {
			dz=20;
		}
		s=getParameter("interval");
		if(s != null) {
			interval=Integer.parseInt(s);
		} else {
			interval=30;
		}
		s=getParameter("speed");
		if(s != null) {
			m=Double.valueOf(s).doubleValue();
		} else {
			m=10;
		}
		r=0;
		
		setBackground(Color.white);
		
		scx=new Scrollbar(Scrollbar.HORIZONTAL, (int)dx, 60, 0, 360);
		scy=new Scrollbar(Scrollbar.HORIZONTAL, (int)dy, 60, 0, 360);
		scz=new Scrollbar(Scrollbar.HORIZONTAL, (int)dz, 60, 0, 360);
		control=new Panel();
		control.setLayout(new GridLayout(3,1));
		control.add(scx);
		control.add(scy);
		control.add(scz);
		setLayout(new BorderLayout());
		add("South",control);
		ps=new Vector();
		ls=new Vector();
		
		//Point Data
		ps.addElement(new PointData(7,-50,0));
		ps.addElement(new PointData(23,-50,0));
		ps.addElement(new PointData(7,-20,0));
		ps.addElement(new PointData(23,-20,0));
		ps.addElement(new PointData(7,-40,0));
		ps.addElement(new PointData(0,-25,20));
		ps.addElement(new PointData(23,-40,0));
		ps.addElement(new PointData(30,-25,-20));
		ps.addElement(new PointData(7,0,-20));
		ps.addElement(new PointData(23,0,20));
		
		//Line Data
		ls.addElement(new LineData(0,1));
		ls.addElement(new LineData(1,3));
		ls.addElement(new LineData(3,2));
		ls.addElement(new LineData(2,0));
		ls.addElement(new LineData(4,5));
		ls.addElement(new LineData(6,7));
		ls.addElement(new LineData(2,8));
		ls.addElement(new LineData(3,9));
	}
	
	
	
	public void start() {
		ke();
		repaint();
		t=new Thread(this);
		t.start();
	}
	
	
	
	public void stop() {
		if(t!=null) {
			t.stop();
		}
	}
	
	
	
	public void run() {
		double sr;
		while(true) {
			try {
				Thread.sleep(interval);
			} catch (InterruptedException e) {
				break;
			}
			sr=rad(r);
			((PointData)(ps.elementAt(0))).y = -50 + 20 * (1 - Math.cos(sr));
			((PointData)(ps.elementAt(1))).y = -50 + 20 * (1 - Math.cos(sr));
			((PointData)(ps.elementAt(2))).y = -20 + 20 * (1 - Math.cos(sr));
			((PointData)(ps.elementAt(3))).y = -20 + 20 * (1 - Math.cos(sr));
			((PointData)(ps.elementAt(4))).y = -40 + 20 * (1 - Math.cos(sr));
			((PointData)(ps.elementAt(5))).z = 20 * Math.sin(sr);
			((PointData)(ps.elementAt(6))).y = -40 + 20 * (1 - Math.cos(sr));
			((PointData)(ps.elementAt(7))).z = -20 * Math.sin(sr);
			((PointData)(ps.elementAt(8))).z = -20 * Math.sin(sr);
			((PointData)(ps.elementAt(9))).z = 20 * Math.sin(sr);
			ke();
			repaint();
			if(30<r || r<-30) {
				m*=-1;
			}
			r+=m;
		}
	}
	
	
	
	void ke() {
		PointData pd;
		
		for(int i=0;i<ps.size();i++) {
			pd=(PointData)(ps.elementAt(i));
			
			pd.nx = Math.cos(rad(dz)) * pd.x - Math.sin(rad(dz)) * pd.y;
			pd.ny = Math.sin(rad(dz)) * pd.x + Math.cos(rad(dz)) * pd.y;
			
			pd.nz = Math.cos(rad(dx)) * pd.z - Math.sin(rad(dx)) * pd.ny;
			pd.ny = Math.sin(rad(dx)) * pd.z + Math.cos(rad(dx)) * pd.ny;
			
			pd.nx = Math.cos(rad(dy)) * pd.nx - Math.sin(rad(dy)) * pd.nz;
			pd.nz = Math.sin(rad(dy)) * pd.nx + Math.cos(rad(dy)) * pd.nz;
			
			pd.nx = pd.nx * (1 - pd.nz / 10000);
			pd.ny = pd.ny * (1 - pd.nz / 10000);
		}
	}
	
	
	
	public boolean handleEvent(Event e) {
		if(e.target instanceof Scrollbar) {
			dx=(double)(scx.getValue());
			dy=(double)(scy.getValue());
			dz=(double)(scz.getValue());
			return true;
		}
		return false;
	}
	
	
	
	public void paint(Graphics g) {
		int i;
		LineData l;
		PointData p;
		
		//Draw new frame
		for(i=0;i<ls.size();i++) {
			l=(LineData)(ls.elementAt(i));
			g.drawLine( (int)((PointData)(ps.elementAt( l.b ))).nx + size().width/2, 
			            (int)((PointData)(ps.elementAt( l.b ))).ny + size().height/2,
			            (int)((PointData)(ps.elementAt( l.e ))).nx + size().width/2, 
			            (int)((PointData)(ps.elementAt( l.e ))).ny + size().height/2 );
		}
	}
	
	
	
	double rad(double d) {
		return d*Math.PI/180;
	}
	
}



class PointData {
	
	public double x;
	public double y;
	public double z;
	
	public double nx;
	public double ny;
	public double nz;
	
	//Constructor
	PointData(double xx, double yy, double zz) {
		x=xx;
		y=yy;
		z=zz;
	}
	
}



class LineData {
	
	public int b; //Begin of line
	public int e; //End of line
	
	//Constructor
	LineData(int bb, int ee) {
		b=bb;
		e=ee;
	}
	
}


Back