http://acm.split.hdu.edu.cn/showproblem.php?pid=6206
題意:給出四個點,判斷地四個點是否在其他三個點確定的圓內。
題解:確定圓心和半徑。double有精度損失,所以用java的BigDecimal類。
設圓心(x,y),三個點(x1,y1),(x2,y2),(x3,y3).
有方程組:
(x1-x)^2+(y1-y)^2=(x2-x)^2+(y2-y)^2
(x3-x)^2+(y3-y)^2=(x2-x)^2+(y2-y)^2
化簡得:
2*(x2-x1)*x+2*(y2-y1)*y=x2^2+y2^2-x1^2-y1^2
2*(x3-x2)*x+2*(y3-y2)*y=x3^2+y3^2-x2^2-y2^2
令
a1=2*(x2-x1),b1=2*(y2-y1),c1=x2^2+y2^2-x1^2-y1^2
a1=2*(x3-x2),b1=2*(y3-y2),c1=x3^2+y3^2-x2^2-y2^2
即:
a1*x+b1*y=c1
a2*x+b2*y=c2
所以有:
x=(c1*b2-c2*b1)/(a1*b2-a2*b1)
y=(a1*c2-a2*c1)/(a1*b2-a2*b1)
代碼:
import java.util.*;
import java.math.BigDecimal;
public class Main {
public static void main(String[] argv) {
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
while (n != 0) {
n--;
BigDecimal[] x = new BigDecimal[5];
BigDecimal[] y = new BigDecimal[5];
//輸入
for (int i = 1; i <= 4; i++) {
x[i] = cin.nextBigDecimal();
y[i] = cin.nextBigDecimal();
}
BigDecimal two = new BigDecimal(2);
BigDecimal a1,b1,c1,a2,b2,c2;
BigDecimal xx,yy,r,dis;
//計算a1,b1,c1,a2,b2,c2
a1=two.multiply(x[2].subtract(x[1]));
b1=two.multiply(y[2].subtract(y[1]));
c1=x[2].multiply(x[2]).add(y[2].multiply(y[2])).subtract(x[1].multiply(x[1]).add(y[1].multiply(y[1])));
a2=two.multiply(x[3].subtract(x[2]));
b2=two.multiply(y[3].subtract(y[2]));
c2=x[3].multiply(x[3]).add(y[3].multiply(y[3])).subtract(x[2].multiply(x[2]).add(y[2].multiply(y[2])));
//圓心及半徑
xx=(c1.multiply(b2).subtract(c2.multiply(b1))).divide(a1.multiply(b2).subtract(a2.multiply(b1)));
yy=(a1.multiply(c2).subtract(a2.multiply(c1))).divide(a1.multiply(b2).subtract(a2.multiply(b1)));
r=(xx.subtract(x[1]).multiply(xx.subtract(x[1]))).add(yy.subtract(y[1]).multiply(yy.subtract(y[1])));
//第四點距圓心的距離
dis=(xx.subtract(x[4]).multiply(xx.subtract(x[4]))).add(yy.subtract(y[4]).multiply(yy.subtract(y[4])));
if(dis.compareTo(r)==1) {
System.out.println("Accepted");
}
else {
System.out.println("Rejected");
}
}
}
}