HDU 6206 Apple(外心)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=6206
题意:三个点在一个圆上,让求一个点是否在圆外
思路:就是求外接圆圆心和半径,判断点到圆心的距离是否大于半径
圆心坐标(a,b),半径为r,点(x,y),公式为:
a = ((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)));
b = ((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-a)(x1-a) + (y1-b)(y-b);
因为数据范围最大为1e12,所以用Java的BigDecimal来写,注意运算中的括号
代码:


import java.math.BigDecimal;  
import java.util.Scanner;
public class Main {
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);  
        int T = in.nextInt();
        BigDecimal x1,x2,x3,y1,y2,y3,x,y;
        while(T-- > 0)  
        {  
            x1 = in.nextBigDecimal();
            y1 = in.nextBigDecimal();
            x2 = in.nextBigDecimal();
            y2 = in.nextBigDecimal();
            x3 = in.nextBigDecimal();
            y3 = in.nextBigDecimal();
            x = in.nextBigDecimal();
            y = in.nextBigDecimal();
            /*
             * 圆心坐标(a,b),半径为r,点(x,y)
             *  a = ((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)));
                b = ((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-a)*(x1-a) + (y1-b)*(y-b);
             */


            BigDecimal a1 = (y2.subtract(y1)).multiply(y3.multiply(y3).subtract(y1.multiply(y1)).add(x3.multiply(x3)).subtract(x1.multiply(x1)));
            BigDecimal a2 = (y3.subtract(y1)).multiply(y2.multiply(y2).subtract(y1.multiply(y1)).add(x2.multiply(x2)).subtract(x1.multiply(x1)));
            BigDecimal a3 = BigDecimal.valueOf(2.0).multiply(((x3.subtract(x1)).multiply(y2.subtract(y1))).subtract((x2.subtract(x1)).multiply(y3.subtract(y1))));
            BigDecimal a = (a1.subtract(a2)).divide(a3);

            BigDecimal b1 = (x2.subtract(x1)).multiply(x3.multiply(x3).subtract(x1.multiply(x1)).add(y3.multiply(y3)).subtract(y1.multiply(y1)));
            BigDecimal b2 = (x3.subtract(x1)).multiply(x2.multiply(x2).subtract(x1.multiply(x1)).add(y2.multiply(y2)).subtract(y1.multiply(y1)));
            BigDecimal b3 = BigDecimal.valueOf(2.0).multiply(((y3.subtract(y1)).multiply(x2.subtract(x1))).subtract((y2.subtract(y1)).multiply(x3.subtract(x1))));
            BigDecimal b = (b1.subtract(b2)).divide(b3);
            //半径
            BigDecimal r2 = (x1.subtract(a)).multiply(x1.subtract(a)).add((y1.subtract(b)).multiply(y1.subtract(b)));
            //到圆心的距离
            BigDecimal sum = (x.subtract(a)).multiply(x.subtract(a)).add((y.subtract(b)).multiply(y.subtract(b)));
            if(sum.compareTo(r2) > 0)//到圆心距离大于等于半径
                System.out.println("Accepted");
            else
                System.out.println("Rejected");
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值