import
java.util.ArrayList;
public
class
Main {
private
static
final
double
INF = 1e18;
static
class
Point {
double
X, Y;
Point(
double
X,
double
Y) {
this
.X = X;
this
.Y = Y;
}
}
static
class
Circle {
Point C;
double
R;
Circle(Point C,
double
R) {
this
.C = C;
this
.R = R;
}
}
private
static
double
dist(Point a, Point b) {
return
Math.sqrt(Math.pow(a.X - b.X,
2
) + Math.pow(a.Y - b.Y,
2
));
}
private
static
boolean
isInside(Circle c, Point p) {
return
dist(c.C, p) <= c.R;
}
private
static
Point getCircleCenter(
double
bx,
double
by,
double
cx,
double
cy) {
double
B = bx * bx + by * by;
double
C = cx * cx + cy * cy;
double
D = bx * cy - by * cx;
return
new
Point((cy * B - by * C) / (
2
* D), (bx * C - cx * B) / (
2
* D));
}
private
static
Circle circleFrom(Point A, Point B, Point C) {
Point I = getCircleCenter(B.X - A.X, B.Y - A.Y, C.X - A.X, C.Y - A.Y);
I.X += A.X;
I.Y += A.Y;
return
new
Circle(I, dist(I, A));
}
private
static
Circle circleFrom(Point A, Point B) {
Point C =
new
Point((A.X + B.X) /
2.0
, (A.Y + B.Y) /
2.0
);
return
new
Circle(C, dist(A, B) /
2.0
);
}
private
static
boolean
isValidCircle(Circle c, ArrayList<Point> P) {
for
(Point p : P) {
if
(!isInside(c, p)) {
return
false
;
}
}
return
true
;
}
private
static
Circle minimumEnclosingCircle(ArrayList<Point> P) {
int
n = P.size();
if
(n ==
0
) {
return
new
Circle(
new
Point(
0
,
0
),
0
);
}
if
(n ==
1
) {
return
new
Circle(P.get(
0
),
0
);
}
Circle mec =
new
Circle(
new
Point(
0
,
0
), INF);
for
(
int
i =
0
; i < n; i++) {
for
(
int
j = i +
1
; j < n; j++) {
Circle tmp = circleFrom(P.get(i), P.get(j));
if
(tmp.R < mec.R && isValidCircle(tmp, P)) {
mec = tmp;
}
}
}
for
(
int
i =
0
; i < n; i++) {
for
(
int
j = i +
1
; j < n; j++) {
for
(
int
k = j +
1
; k < n; k++) {
Circle tmp = circleFrom(P.get(i), P.get(j), P.get(k));
if
(tmp.R < mec.R && isValidCircle(tmp, P)) {
mec = tmp;
}
}
}
}
return
mec;
}
public
static
void
main(String[] args) {
ArrayList<Point> points1 =
new
ArrayList<>();
points1.add(
new
Point(
0
,
0
));
points1.add(
new
Point(
0
,
1
));
points1.add(
new
Point(
1
,
0
));
Circle mec1 = minimumEnclosingCircle(points1);
System.out.print(
"Center = { "
+ mec1.C.X +
", "
+ mec1.C.Y);
System.out.printf(
" } Radius = %.6f%n"
, mec1.R);
ArrayList<Point> points2 =
new
ArrayList<>();
points2.add(
new
Point(
5
, -
2
));
points2.add(
new
Point(-
3
, -
2
));
points2.add(
new
Point(-
2
,
5
));
points2.add(
new
Point(
1
,
6
));
points2.add(
new
Point(
0
,
2
));
Circle mec2 = minimumEnclosingCircle(points2);
System.out.print(
"Center = { "
+ mec2.C.X +
", "
+ mec2.C.Y);
System.out.printf(
" } Radius = %.0f%n"
, mec2.R);
}
}