/** A 2d point with double coords */ class Point2d { double x; double y; Point2d(double x, double y) { this.x = x; this.y = y; } public Point2d scale(double k) { return new Point2d(k*x, k*y); } public Point2d add(Point2d a) { return new Point2d(x+a.x, y+a.y); } public Point2d subtract(Point2d a) { return new Point2d(x-a.x, y-a.y); } public double length() { return Math.sqrt(x*x+y*y); } public Point2d normalize() { return scale(1/length()); } public double length2() { return x*x+y*y; } public double angle() { return Math.atan2(y,x); } public static Point2d fromPolar(double r, double theta) { return new Point2d(r*Math.cos(theta), r*Math.sin(theta)); } public Point2d circleCentre(Point2d a, Point2d b) { double d1 = length2(); double d2 = a.length2(); double d3 = b.length2(); double divisor = 2*(y*(b.x-a.x) + a.y*(x-b.x) + b.y*(a.x-x)); return new Point2d((y*(d3-d2) + a.y*(d1-d3) + b.y*(d2-d1))/divisor, -(x*(d3-d2) + a.x*(d1-d3) + b.x*(d2-d1))/divisor); } public String toString() { return "("+Double.toString(x)+","+Double.toString(y)+")"; } }