/*
 * File: GFace.java
 * ----------------
 * This file defines a compound GFace class.
 */

import acm.graphics.*;

/**
 * This class defines a new GObject subclass called GFace, which is
 * a compound consisting of an outline, two eyes, a nose, and a mouth.
 * The origin point for the face is the center of the figure.
 */
public class GFace extends GCompound {

/** Construct a new GFace object with the specified dimensions */
	public GFace(double width, double height) {
		head = new GOval(width, height);
		leftEye = new GEye(EYE_WIDTH * width, EYE_HEIGHT * height);
		rightEye = new GEye(EYE_WIDTH * width, EYE_HEIGHT * height);
		nose = createNose(NOSE_WIDTH * width, NOSE_HEIGHT * height);
		mouth = new GRect(MOUTH_WIDTH * width, MOUTH_HEIGHT * height);
		add(head, -width / 2, -height / 2);
		add(leftEye, -0.25 * width, -0.25 * height);
		add(rightEye, 0.25 * width, -0.25 * height);
		add(nose, 0, 0);
		add(mouth, -MOUTH_WIDTH * width / 2,
		           0.25 * height - MOUTH_HEIGHT * height / 2);
	}

/* Creates a triangle for the nose */
	private GPolygon createNose(double width, double height) {
		GPolygon poly = new GPolygon();
		poly.addVertex(0, -height / 2);
		poly.addVertex(width / 2, height / 2);
		poly.addVertex(-width / 2, height / 2);
		return poly;
	}

/** Adjusts the eyes so they look at the point (x, y) */
	public void lookAt(double x, double y) {
		leftEye.lookAt(x, y);
		rightEye.lookAt(x, y);
	}

/* Constants specifying feature size as a fraction of the head size */
	private static final double EYE_WIDTH    = 0.15;
	private static final double EYE_HEIGHT   = 0.15;
	private static final double NOSE_WIDTH   = 0.15;
	private static final double NOSE_HEIGHT  = 0.10;
	private static final double MOUTH_WIDTH  = 0.50;
	private static final double MOUTH_HEIGHT = 0.03;

/* Private instance variables */
	private GOval head;
	private GEye leftEye, rightEye;
	private GPolygon nose;
	private GRect mouth;
}
