Problem Description
Apple is Taotao's favourite fruit. In his backyard, there are three apple trees with coordinates of the new tree. Could you tell him if it is outside the circle or not?
Input
The first line contains an integer
, as described above.
The absolute values of integers in input are less than or equal to .
It is guaranteed that, any three of the four positions do not lie on a straight line.
The absolute values of integers in input are less than or equal to .
It is guaranteed that, any three of the four positions do not lie on a straight line.
Output
For each case, output "Accepted" if the position is outside the circle, or "Rejected" if the position is on or inside the circle.
Sample Input
3
-2 0 0 -2 2 0 2 -2
-2 0 0 -2 2 0 0 2
-2 0 0 -2 2 0 1 1
Sample Output
Accepted
Rejected
Rejected
Source
【题意】:给出四个点,问你第四个点是否在前三个点构成的圆内,若在圆外输出"Accepted",否则输出"Rejected",题目保证前三个点不在一条直线上。
【分析】:就是求出三个点外接圆的圆心和半径判断下。精度问题需要用Java大数。已知三点坐标,求外接圆圆心坐标与半径。三点构圆的圆心和半径是能够推导出公式的圆弧方向判断方法和三点确定一个圆的计算方法 高精度问题也只用BigInteger解决即可。
【彩蛋】:
实际上有更简便的方法,直接能用更直接的公式算出圆心 (x0, y0) 和半径的平方 r^2
x0 = ((y2-y1)*(y3*y3-y1*y1+x3*x3-x1*x1)-(y3-y1)*(y2*y2-y1*y1+x2*x2-x1*x1))/(2.0*((x3-x1)*(y2-y1)-(x2-x1)*(y3-y1)));
y0 = ((x2-x1)*(x3*x3-x1*x1+y3*y3-y1*y1)-(x3-x1)*(x2*x2-x1*x1+y2*y2-y1*y1))/(2.0*((y3-y1)*(x2-x1)-(y2-y1)*(x3-x1)));
r^2= (x1-x0)*(x1-x0)+(y1-y0)*(y1-y0);
里面涉及除法,那就用BigDecimal就能解决了,参考http://blog.csdn.net/cillyb/article/details/78012069
import java.math.*; import java.util.*; import java.io.*; public class Main{ public static void main(String[] args){ Scanner cin=new Scanner(System.in); int t=cin.nextInt(); while(t-->0) { BigDecimal px1, px2, px3, py1, py2, py3, px, py; px1=cin.nextBigDecimal(); py1=cin.nextBigDecimal(); px2=cin.nextBigDecimal(); py2=cin.nextBigDecimal(); px3=cin.nextBigDecimal(); py3=cin.nextBigDecimal(); px=cin.nextBigDecimal(); py=cin.nextBigDecimal(); BigDecimal a, b, c, d, e, f, px0, py0, r,dis; a=px1.subtract(px2); b=py1.subtract(py2); c=px1.subtract(px3); d=py1.subtract(py3); e=px1.multiply(px1).subtract(px2.multiply(px2)).multiply(BigDecimal.valueOf(0.5)).subtract(py2.multiply(py2).subtract(py1.multiply(py1)).multiply(BigDecimal.valueOf(0.5))); f=px1.multiply(px1).subtract(px3.multiply(px3)).multiply(BigDecimal.valueOf(0.5)).subtract(py3.multiply(py3).subtract(py1.multiply(py1)).multiply(BigDecimal.valueOf(0.5))); px0=b.multiply(f).subtract(d.multiply(e)).divide(b.multiply(c).subtract(a.multiply(d)),30,BigDecimal.ROUND_HALF_UP); py0=c.multiply(e).subtract(a.multiply(f)).divide(b.multiply(c).subtract(a.multiply(d)),30,BigDecimal.ROUND_HALF_UP); r=px1.subtract(px0).multiply(px1.subtract(px0)).add(py1.subtract(py0).multiply(py1.subtract(py0))); dis=px.subtract(px0).multiply(px.subtract(px0)).add(py.subtract(py0).multiply(py.subtract(py0))); if(dis.compareTo(r)==1) System.out.println("Accepted"); else System.out.println("Rejected"); } } }