1. 程式人生 > >hdu6206 Apple java,三點找外接圓

hdu6206 Apple java,三點找外接圓

ring exc text ext .com acm java ann play

hdu6206

題意:給出 4 個點,問第4個點是否在前三個點形成的外接圓外。

tags: 會有精度問題,上 java 。。

1】公式

已知三點坐標,求外接圓圓心坐標與半徑。

//已知三點坐標,求外接圓圓心坐標與半徑。
x=((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)));
y=((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)*(y1-b);

技術分享
//package project1;

import java.util.*;
import java.math.*;
import java.util.Scanner;

public class Main { 
    //Test2 {
    public static void main(String[] argv) throws Exception
    {
        Scanner sc = new
Scanner(System.in); MathContext mc = new MathContext(7, RoundingMode.HALF_DOWN); int T = sc.nextInt(); for(int cas=1; cas<=T; ++cas) { BigDecimal x1=sc.nextBigDecimal(), y1=sc.nextBigDecimal(), x2=sc.nextBigDecimal(), y2=sc.nextBigDecimal(); BigDecimal x3
=sc.nextBigDecimal(), y3=sc.nextBigDecimal(), x4=sc.nextBigDecimal(), y4=sc.nextBigDecimal(); BigDecimal x, y, r; BigDecimal a1=y2.subtract(y1), a2=y3.multiply(y3), a3=y1.multiply(y1), a4=x3.multiply(x3), a5=x1.multiply(x1); BigDecimal a6 = (y2.subtract(y1)).multiply(y3.pow(2).subtract(y1.pow(2)).add(x3.pow(2)).subtract(x1.pow(2))); BigDecimal a7 = (y3.subtract(y1)).multiply(y2.pow(2).subtract(y1.pow(2)).add(x2.pow(2)).subtract((x1.pow(2)))); a1=BigDecimal.valueOf(2); a2=x3.subtract(x1); a3=y2.subtract(y1); a4=x2.subtract(x1); a5=y3.subtract(y1); BigDecimal a8 = a1.multiply((a2).multiply(a3).subtract(a4.multiply(a5))); x = a6.subtract(a7).divide(a8); a6 = (x2.subtract(x1)).multiply(x3.pow(2).subtract(x1.pow(2)).add(y3.pow(2)).subtract(y1.pow(2))); a7 = (x3.subtract(x1)).multiply(x2.pow(2).subtract(x1.pow(2)).add(y2.pow(2)).subtract((y1.pow(2)))); a1=BigDecimal.valueOf(2); a2=y3.subtract(y1); a3=x2.subtract(x1); a4=y2.subtract(y1); a5=x3.subtract(x1); a8 = a1.multiply(a2.multiply(a3).subtract(a4.multiply(a5))); y = a6.subtract(a7).divide(a8); a1 = (x1.subtract(x).pow(2)); a2 = (y1.subtract(y).pow(2)); r = a1.add(a2); a1 = (x.subtract(x4).pow(2)); a2 = (y.subtract(y4).pow(2)); BigDecimal dis = a1.add(a2); //System.out.println(x+" "+y+" "+r+" "+dis+"-----"); if(dis.compareTo(r) > 0) System.out.println("Accepted"); else System.out.println("Rejected"); } } } /* 已知三點坐標,求外接圓圓心坐標與半徑。 x=((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))); y=((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)*(y1-b); */
View Code

2】函數

//三點找一圓
Circle findCircle2(P p1, P p2, P p3)
{
    double A1, A2, B1, B2, C1, C2, temp;
    A1 = p1.x - p2.x;
    B1 = p1.y - p2.y;
    C1 = (p1.x*p1.x - p2.x*p2.x + p1.y*p1.y - p2.y*p2.y) / 2;
    A2 = p3.x - p2.x;
    B2 = p3.y - p2.y;
    C2 = (p3.x*p3.x - p2.x*p2.x + p3.y*p3.y - p2.y*p2.y) / 2;
    temp = A1*B2 - A2*B1;
    Circle CD;
    CD.center.x = (C1*B2 - C2*B1) / temp;
    CD.center.y = (A1*C2 - A2*C1) / temp;
    CD.radius = sqrtf((CD.center.x - p1.x)*(CD.center.x - p1.x) + (CD.center.y - p1.y)*(CD.center.y - p1.y));
    return CD;
}

hdu6206 Apple java,三點找外接圓