import java.awt.Graphics;

public class Polygon {
	private Point[] vertices;

	private Polygon(Point[] vertices) {
		this.vertices = new Point[vertices.length];

		for (int i = 0; i < vertices.length; i++) {
			this.vertices[i] = new Point(vertices[i].x, vertices[i].y);
		}
	}

	public static Polygon polygonFrom(Point[] vertices) {
		return new Polygon(vertices);
	}

	public double computePerimeter() {
		double p = 0;

		for (int i = 0; i < vertices.length; i++) {
			p += distance(vertices[i], vertices[(i+1) % vertices.length]);
		}

		return p;
	}

	private double distance(Point a, Point b) {
		double d = 0;

		// BLANK_0

		return d;
	}
	
	public void translate(double dx, double dy) {
		// BLANK_1
	}

	public double computeArea() {
		double a = 0;

		// BLANK_2
		
		return a/2;
	}
	
	public void rotate(double theta, Point p) {
		double x_prime, y_prime;
		for (int i = 0; i < vertices.length; i++) {
			x_prime = (vertices[i].x - p.x) * Math.cos(theta) - (vertices[i].y - p.y) * Math.sin(theta) + p.x;
			y_prime = (vertices[i].x - p.x) * Math.sin(theta) + (vertices[i].y - p.y) * Math.cos(theta) + p.y;

			vertices[i].x = x_prime;
			vertices[i].y = y_prime;
		}
	}

	public Point computeCenter() {
		double cx = 0;
		double cy = 0;
		for (int i = 0; i < vertices.length; i++) {
			cx += vertices[i].x;
			cy += vertices[i].y;
		}
		return new Point(cx / vertices.length, cy / vertices.length);
	}

	public void scale(double m) {
		Point c = computeCenter();
		for (int i = 0; i < vertices.length; i++) {
			vertices[i].x = (vertices[i].x - c.x) * m + c.x;
			vertices[i].y = (vertices[i].y - c.y) * m + c.y;
		}
	}

	public void draw(Graphics g) {
		// Use the drawLine() method of the Graphics object g, to draw this polygon.
		
		double p = 0;

		for (int i = 0; i < vertices.length; i++) {
			g.drawLine((int)vertices[i].x, (int)vertices[i].y, 
					   (int)vertices[(i+1) % vertices.length].x, (int)vertices[(i+1) % vertices.length].y);
		}
	}
	
	public String toString() {
		String s = "";
		for (int i = 0; i < vertices.length; i++) {
			s += vertices[i].toString() + "\n";
		}
		return s;
	}
	
	void drawString(Graphics g, int x, int y) {
		String[] lines = toString().split("\n");
	    g.drawString("Vertices: ", x, y += g.getFontMetrics().getHeight());
	    for (String line : lines)
	        g.drawString(line, x, y += g.getFontMetrics().getHeight());
	    y += g.getFontMetrics().getHeight();
	    g.drawString("Center: " + computeCenter().toString(), x, y += g.getFontMetrics().getHeight());
	    g.drawString("Perimeter: " + computePerimeter(), x, y += g.getFontMetrics().getHeight());
	    g.drawString("Area: " + computeArea(), x, y += g.getFontMetrics().getHeight());
	}
}