class Circle : Shape { public double r = 50.0; // radius public Circle(double radius) {r=radius;} public double area_of() { return Math.PI * r * r; } public override double area_of_overlap(Circle other) { double distance_squared; double chord_area; double h; if (equals(other)) return area_of(); distance_squared = Math.Pow(x - other.x, 2.0) + Math.Pow(y - other.y, 2.0); if (distance_squared >= 4 * r * r) return 0.0; else { h = (2.0 * r - Math.Sqrt(distance_squared)) / 2.0; chord_area = (r * r * Math.Acos((r - h) / r)) - (r - h) * Math.Sqrt(2 * r * h - h * h); return 2 * chord_area; } } public Object Clone() { Circle copyOfMe = new Circle(); copyOfMe.move(x, y); copyOfMe.niche_count = niche_count; return copyOfMe; } }