HDU6206 几何 + 高精度

来源:互联网 发布:专业音频剪辑软件 编辑:程序博客网 时间:2024/05/21 18:34

简略题意:给出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");                }    }}