public Distance distanceTo(Point second) {
		double dx, dy, difference;

		dx = x - second.x;
		dy = y - second.y;
		difference = Math.sqrt(dx * dx + dy * dy);

		return new Distance(difference, unit);
	}
}

/*
 * Klasse voor een lijn. Bevat een twee punten en een meeteenheid
 * Deze klasse erft alles van vorm
 * Deze klasse bevat methode voor omtrek, die dezelfde methode in vorm klasse vervangt
 * Deze klasse bevat een toString methode die de default versie vervangt
 */
class Line extends Shape {
	double x2, y2;

	Line(Point p0, Point p1) {
		x = p0.x;
		y = p0.y;
		x2 = p1.x;
		y2 = p1.y;
		unit = p0.unit;
	}

	public Distance perimeter() {
		double dx, dy, length;

		dx = x - x2;
		dy = y - y2;

		length = Math.sqrt(dx * dx + dy * dy);

		return new Distance(length, unit);
	}

	public String toString() {
		return("Line[p0: (" + x + " " + unit + "; " + y + " " + unit + ");"
			+ " P1: (" + x2 + " " + unit + "; " + y2 + " " + unit + ")]");
	}
}

/*
 * Klasse voor een rechthoek. Bevat een middelpunt(x,y), lengte, breedte en meeteenheid
 * Deze klasse erft alles van vorm
 * Deze klasse bevat methode voor omtrek, die dezelfde methode in vorm klasse vervangt
 * Deze klasse bevat methode voor oppervlakte, die dezelfde methode in vorm klasse vervangt
 * Deze klasse bevat een toString methode die de default versie vervangt
 */
class Rectangle extends Shape {
	double xCenter, yCenter;

	Rectangle(Point p0, Distance a, Distance b) {
		super(a,b);
		xCenter = p0.x;
		yCenter = p0.y;
	}
	
	public Distance perimeter() {
		double result;
		
		result = x + x + y + y;

		return new Distance(result, unit);
	}

	public double area() {
		return x * y;
	}

	public String toString() {
		return("Rectangle[center: (" + xCenter + " " + unit + "; " + yCenter + " " + unit
			+ "); width: " + x + " " + unit + "; length: " + y + " " + unit + "]");
	}
}

/*
 * Klasse voor een cirkel. Bevat een middelpunt(x,y), radius en meeteenheid
 * Deze klasse erft alles van vorm
 * Deze klasse bevat methode voor omtrek, die dezelfde methode in vorm klasse vervangt
 * Deze klasse bevat methode voor oppervlakte, die dezelfde methode in vorm klasse vervangt
 * Deze klasse bevat een toString methode die de default versie vervangt
 */
class Circle extends Shape {
	double xCenter, yCenter, radius;

	Circle(Point p0, Distance a) {
		xCenter = p0.x;
		yCenter = p0.y;
		radius = a.number;
		unit = a.unit;
	}

	public Distance perimeter() {
		double result;
		
		result = 2 * Math.PI * radius;

		return new Distance(result, unit);
	}

	public double area() {
		return Math.PI * radius * radius;
	}
	
	public String toString() {
		return("Circle[radius:" + radius + " " + unit + "; center: (" + xCenter + " "
			+ unit + "; " + yCenter + " " + unit + ")]");
	}