HDU6206 几何 + 高精度

简略题意:给出4个点的坐标,问第4个点是不是在前3个点组成的三角形的外接圆外。

先求出外接圆,然后判断第4个点和圆心的距离即可,唯一的问题是精度不够,需要上java。

import java.io.PrintWriter;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;
/**
 *
 * @author meopass
 */
public class Main {
    static Scanner cin = new Scanner(System.in);
    static PrintWriter cout = new PrintWriter(System.out, true);
//        init();
        static BigDecimal p2(BigDecimal x1) {
            return x1.multiply(x1);
        }
        static  BigDecimal dis2(BigDecimal x1, BigDecimal y1,BigDecimal x2,BigDecimal y2) {
            BigDecimal tmp = BigDecimal.valueOf(0);
            tmp = tmp.add(x1.subtract(x2).multiply(x1.subtract(x2)));
            tmp = tmp.add(y1.subtract(y2).multiply(y1.subtract(y2)));
            return tmp;
        }
    public static void main(String[] args)
    {
        int t;
                t = cin.nextInt();
        for(int i = 0; i < t; i++) {
                    BigDecimal x1, y1, x2, y2, x3, y3, x4, y4;
                    x1 = cin.nextBigDecimal();
                    y1 = cin.nextBigDecimal();
                    x2 = cin.nextBigDecimal();
                    y2 = cin.nextBigDecimal();
                    x3 = cin.nextBigDecimal();
                    y3 = cin.nextBigDecimal();
                    x4 = cin.nextBigDecimal();
                    y4 = cin.nextBigDecimal();
                    BigDecimal bx = x2.subtract(x1);
                    BigDecimal by = y2.subtract(y1);
                    BigDecimal cx = x3.subtract(x1);
                    BigDecimal cy = y3.subtract(y1);
                    BigDecimal d = BigDecimal.valueOf(2).multiply(bx.multiply(cy).subtract(by.multiply(cx)));
                    BigDecimal x = ((cy.multiply(p2(bx).add(p2(by)))).subtract(by.multiply(p2(cx).add(p2(cy))))).divide(d).add(x1);
                    BigDecimal y = ((bx.multiply(p2(cx).add(p2(cy)))).subtract(cx.multiply(p2(bx).add(p2(by))))).divide(d).add(y1);
                    BigDecimal r = dis2(x1, y1, x, y);
                    BigDecimal rr = dis2(x, y, x4, y4);
                    if(r.compareTo(rr)>=0) cout.println("Rejected");
                    else cout.println("Accepted");
                }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值