Naive and Silly Muggles(判断钝角与三点共园)

题意:给出四点,前三点都在圆上或者圆内,判断第四点是否在圆上或者圆内。

链接:HDU 4720

代码:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
struct point
{
    double x, y;
} a[4];
double rr;//半径
point C, p;
double dis(point a, point b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int judge(int d1, int d2, int d3)
{
    if(d1*d1 > d2*d2+d3*d3)
    {
        C.x = (a[1].x+a[2].x)/2.0;
        C.y = (a[1].y+a[2].y)/2.0;
        rr = d1/2.0;
        return 1;
    }
    else if(d2*d2 > d1*d1+d3*d3)
    {
        C.x = (a[1].x+a[3].x)/2.0;
        C.y = (a[1].y+a[3].y)/2.0;
        rr = d2/2.0;
        return 1;
    }
    else if(d3*d3 > d1*d1+d2*d2)
    {
        C.x = (a[2].x+a[3].x)/2.0;
        C.y = (a[2].y+a[3].y)/2.0;
        rr = d3/2.0;
        return 1;
    }
    return 0;
}
int main()
{
    int t;
    int cas = 0;
    scanf("%d",&t);
    while(t--)
    {
        for(int i = 1; i <= 3; i++)
        {
            scanf("%lf%lf",&a[i].x,&a[i].y);
        }
        scanf("%lf%lf",&p.x,&p.y);
        double d1 = dis(a[1], a[2]);
        double d2 = dis(a[1], a[3]);
        double d3 = dis(a[2], a[3]);
        printf("Case #%d: ",++cas);
        if(judge(d1,d2,d3))//如果是钝角
        {
            double disl = dis(p,C);
            if(disl > rr)
            {
                printf("Safe\n");
            }
            else
            {
                printf("Danger\n");
            }
        }
        else
        {
            double x1 = a[1].x, y1 = a[1].y;
            double x2 = a[2].x, y2 = a[2].y;
            double x3 = a[3].x, y3 = a[3].y;
            C.x = ((y3-y1)*(y2*y2-y1*y1+x2*x2-x1*x1)+(y2-y1)*(y1*y1-y3*y3+x1*x1-x3*x3))/(2*(x2-x1)*(y3-y1)-2*(x3-x1)*(y2-y1));

            C.y = ((x3-x1)*(x2*x2-x1*x1+y2*y2-y1*y1)+(x2-x1)*(x1*x1-x3*x3+y1*y1-y3*y3))/(2*(y2-y1)*(x3-x1)-2 *(y3-y1)*(x2-x1));

            double disl = dis(p,C);
            rr = dis(C,a[1]);
            if(disl > rr)
            {
                printf("Safe\n");
            }
            else
            {
                printf("Danger\n");
            }
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值