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