思路:已知三点求过三点的圆的圆心及半径即可,用java高精度实现。
设三点(x1, y1), (x2, y2), (x3, y3), 则以三点为圆心,r为半径的圆:
(x1 - x0)^2 + (y1 - y0)^2 = r^2
(x2 - x0)^2 + (y2 - y0)^2 = r^2
(x3 - x0)^2 + (y3 - y0)^2 = r^2
两两相减,化简得:
(x1 - x2)*x0 + (y1 - y2)*y0 = [(x1^2 - x2^2) - (y2^2 - y1^2)]/2
(x1 - x3)*x0 + (y1 - y3)*y0 = [(x1^2 - x3^2) - (y3^2 - y1^2)]/2
x0, y0有唯一解条件:系数行列式不为 0。
设三点(x1, y1), (x2, y2), (x3, y3), 则以三点为圆心,r为半径的圆:
(x1 - x0)^2 + (y1 - y0)^2 = r^2
(x2 - x0)^2 + (y2 - y0)^2 = r^2
(x3 - x0)^2 + (y3 - y0)^2 = r^2
两两相减,化简得:
(x1 - x2)*x0 + (y1 - y2)*y0 = [(x1^2 - x2^2) - (y2^2 - y1^2)]/2
(x1 - x3)*x0 + (y1 - y3)*y0 = [(x1^2 - x3^2) - (y3^2 - y1^2)]/2
x0, y0有唯一解条件:系数行列式不为 0。
import java.util.*;
import java.io.*;
import java.math.*;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(new BufferedInputStream(System.in));
int T = cin.nextInt();
for(int t = 0; t < T; ++t) {
BigDecimal[] ax = new BigDecimal[3], ay = new BigDecimal[3];
BigDecimal bx, by;
for(int i = 0; i < 3; ++i) {
ax[i] = cin.nextBigDecimal();
ay[i] = cin.nextBigDecimal();
}
bx = cin.nextBigDecimal();
by = cin.nextBigDecimal();
BigDecimal x1 = ax[0], x2 = ax[1], x3 = ax[2];
BigDecimal y1 = ay[0], y2 = ay[1], y3 = ay[2];
BigDecimal a = x1.subtract(x2), b = y1.subtract(y2);
BigDecimal c = x1.subtract(x3), d = y1.subtract(y3);
BigDecimal val = new BigDecimal(2.0);
BigDecimal e = x1.multiply(x1).subtract(x2.multiply(x2)).add(y1.multiply(y1).subtract(y2.multiply(y2))).divide(val);
BigDecimal f = x1.multiply(x1).subtract(x3.multiply(x3)).add(y1.multiply(y1).subtract(y3.multiply(y3))).divide(val);
BigDecimal det = b.multiply(c).subtract(a.multiply(d));
BigDecimal x0 = (d.multiply(e).subtract(b.multiply(f)).divide(det));
BigDecimal y0 = (a.multiply(f).subtract(c.multiply(e)).divide(det));
BigDecimal R = x1.add(x0).multiply(x1.add(x0)).add(y1.add(y0).multiply(y1.add(y0)));
int ok = bx.add(x0).multiply(bx.add(x0)).add(by.add(y0).multiply(by.add(y0))).compareTo(R);
if(ok > 0) System.out.println("Accepted");
else System.out.println("Rejected");
}
}
}