import acm.graphics.*;
import java.awt.*;
public class Person extends GRect{
private static final int HEAD_RADIUS = 36;
private static final int BODY_LENGTH = 144;
private static final int ARM_OFFSET_FROM_HEAD = 28;
private static final int UPPER_ARM_LENGTH = 72;
private static final int LOWER_ARM_LENGTH = 44;
private static final int HIP_WIDTH = 36;
private static final int LEG_LENGTH = 108;
private static final int FOOT_LENGTH = 28;
private static final int MAX_PARTS = 8;
private int numVisibleParts;
private int offsetX, offsetY;
private int move, move2;
private point headPoint, leftUpperArm, leftLowerArm, rightUpperArm, rightLowerArm, armBodyPoint,
leftUpperLeg, leftLowerLeg, leftFoot, rightUpperLeg, rightLowerLeg, rightFoot, bodyStart, bodyEnd;
public Person(int x, int y) {
super(0,0);
offsetX = x;
offsetY = y;
numVisibleParts = -1;
loadPoints();
move = 0;
move2 = 0;
}
public void loadPoints() {
headPoint = new point(offsetX,offsetY+HEAD_RADIUS);
leftUpperArm = new point(offsetX-UPPER_ARM_LENGTH,offsetY+HEAD_RADIUS*2+ARM_OFFSET_FROM_HEAD);
leftLowerArm = new point(offsetX-UPPER_ARM_LENGTH,offsetY+HEAD_RADIUS*2+ARM_OFFSET_FROM_HEAD+LOWER_ARM_LENGTH);
rightUpperArm = new point(offsetX+UPPER_ARM_LENGTH,offsetY+HEAD_RADIUS*2+ARM_OFFSET_FROM_HEAD);
rightLowerArm = new point(offsetX+UPPER_ARM_LENGTH,offsetY+HEAD_RADIUS*2+ARM_OFFSET_FROM_HEAD+LOWER_ARM_LENGTH);
armBodyPoint = new point(offsetX,offsetY+HEAD_RADIUS*2+ARM_OFFSET_FROM_HEAD);
leftUpperLeg = new point(offsetX-HIP_WIDTH,offsetY+HEAD_RADIUS*2+BODY_LENGTH);
leftLowerLeg = new point(offsetX-HIP_WIDTH,offsetY+HEAD_RADIUS*2+BODY_LENGTH+LEG_LENGTH);
rightUpperLeg = new point(offsetX+HIP_WIDTH,offsetY+HEAD_RADIUS*2+BODY_LENGTH);
rightLowerLeg = new point(offsetX+HIP_WIDTH,offsetY+HEAD_RADIUS*2+BODY_LENGTH+LEG_LENGTH);
leftFoot = new point(offsetX-HIP_WIDTH-FOOT_LENGTH,offsetY+HEAD_RADIUS*2+BODY_LENGTH+LEG_LENGTH);
rightFoot = new point(offsetX+HIP_WIDTH+FOOT_LENGTH,offsetY+HEAD_RADIUS*2+BODY_LENGTH+LEG_LENGTH);
bodyStart = new point(offsetX,offsetY+HEAD_RADIUS*2);
bodyEnd = new point(offsetX,offsetY+HEAD_RADIUS*2+BODY_LENGTH);
}
public void addLimb() {
numVisibleParts++;
}
public void paint(Graphics g) {
drawPart(numVisibleParts,g);
}
public void drawPart(int part ,Graphics g) {
switch(part) {
case 8:
case 7:
g.drawLine(rightFoot.getX(),rightFoot.getY(),rightLowerLeg.getX(),rightLowerLeg.getY());
case 6:
g.drawLine(leftFoot.getX(),leftFoot.getY(),leftLowerLeg.getX(),leftLowerLeg.getY());
case 5:
g.drawLine(rightUpperLeg.getX(),rightUpperLeg.getY(),bodyEnd.getX(),bodyEnd.getY());
g.drawLine(rightLowerLeg.getX(),rightLowerLeg.getY(),rightUpperLeg.getX(),rightUpperLeg.getY());
case 4:
g.drawLine(leftUpperLeg.getX(),leftUpperLeg.getY(),bodyEnd.getX(),bodyEnd.getY());
g.drawLine(leftLowerLeg.getX(),leftLowerLeg.getY(),leftUpperLeg.getX(),leftUpperLeg.getY());
case 3:
g.drawLine(rightUpperArm.getX(),rightUpperArm.getY(),armBodyPoint.getX(),armBodyPoint.getY());
g.drawLine(rightLowerArm.getX(),rightLowerArm.getY(),rightUpperArm.getX(),rightUpperArm.getY());
case 2:
g.drawLine(leftUpperArm.getX(),leftUpperArm.getY(),armBodyPoint.getX(),armBodyPoint.getY());
g.drawLine(leftLowerArm.getX(),leftLowerArm.getY(),leftUpperArm.getX(),leftUpperArm.getY());
case 1:
g.drawLine(bodyStart.getX(),bodyStart.getY(),bodyEnd.getX(),bodyEnd.getY());
case 0:
g.setColor(Color.white);
g.fillOval(headPoint.getX()-HEAD_RADIUS, headPoint.getY()-HEAD_RADIUS, HEAD_RADIUS*2, HEAD_RADIUS*2);
g.setColor(Color.black);
g.drawOval(headPoint.getX()-HEAD_RADIUS, headPoint.getY()-HEAD_RADIUS, HEAD_RADIUS*2, HEAD_RADIUS*2);
break;
default: break;
}
if(numVisibleParts == 8) {
g.drawString("X", headPoint.getX()-10, headPoint.getY()-5);
g.drawString("X", headPoint.getX()+10, headPoint.getY()+10);
}
}
public void moveLimb() {
leftUpperArm.translate(armBodyPoint,UPPER_ARM_LENGTH,move,-1);
rightUpperArm.translate(armBodyPoint,UPPER_ARM_LENGTH,move,1);
leftLowerArm.translate(leftUpperArm, LOWER_ARM_LENGTH, 90, -1);
rightLowerArm.translate(rightUpperArm, LOWER_ARM_LENGTH, 90, 1);
leftUpperLeg.translate(bodyEnd, HIP_WIDTH, move, -1);
rightUpperLeg.translate(bodyEnd, HIP_WIDTH, move, 1);
leftLowerLeg.translate(leftUpperLeg, LEG_LENGTH, 90, -1);
rightLowerLeg.translate(rightUpperLeg, LEG_LENGTH, 90, 1);
leftFoot.translate(leftLowerLeg, FOOT_LENGTH, move, -1);
rightFoot.translate(rightLowerLeg, FOOT_LENGTH, move, 1);
move+=2;
}
public void moveHead() {
headPoint.translate(bodyStart,HEAD_RADIUS,move2-90,1);
move2+=2;
}
}
class point {
private int defaultX;
private int defaultY;
double x, y;
public point(int x, int y) {
defaultX = x;
defaultY = y;
this.x = x;
this.y = y;
}
public void translate(point pt, int length, double angle, int sign) {
x = pt.x+sign*length*Math.cos(Math.toRadians(angle));
y = pt.y+length*Math.sin(Math.toRadians(angle));
}
public int getX() {
return (int) x;
}
public int getY() {
return (int) y;
}
}