【数学】hdu 1221 Rectangle and Circle

本文介绍了通过优化点到矩形距离计算函数,简化了圆与矩形关系的判断过程。重点在于排除点在圆内部的情况,计算圆心到点的最短距离,并根据不同情况判断圆与矩形的位置关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链接:今天去西湖了

各种WA,后来没办法,改了一下计算点到线段的距离的那个函数,因为矩形的边是平行于坐标轴的,所以计算点到矩形边的距离变得十分容易。

思路:首先排除所有点在圆内部的特殊情况,然后计算圆心到所有点的最短距离,全部都在圆的外面,说明圆是在矩形的内部,否则,与圆相交

#include <iostream>
#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include<stdio.h>
#include<math.h>
using namespace std;

double PointToSegDist(double x, double y, double x1, double y1, double x2, double y2)
{
    if(y1 == y2)
    {
        if(x1 > x2) swap(x1, x2);
        if(x < x1) return (x - x1) * (x - x1) + (y - y1) * (y - y1);
        if(x > x2) return (x - x2) * (x - x2) + (y - y2) * (y - y2);
        return fabs(y - y1) * fabs(y - y1);
    }
    else if(x1 == x2)
    {
        if(y1 > y2) swap(y1, y2);
        if(y > y2) return (x - x1) * (x - x1) + (y - y2) * (y - y2);
        if(y < y1) return (x - x1) * (x - x1) + (y - y1) * (y - y1);
        return fabs(x - x1) * fabs(x - x1);
    }
    return 0;
}

double ptop(double x1, double y1, double x2, double y2)
{
    return ((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}

int main()
{
    int t;
    while(scanf("%d", &t) != EOF)
    {
        while(t--)
        {
            double x, y, r, x1, y1, x2, y2;
            scanf("%lf%lf%lf%lf%lf%lf%lf", &x, &y, &r, &x1, &y1, &x2, &y2);
            double d1, d2, d3, d4;
            d1 = ptop(x, y, x1, y1);
            d2 = ptop(x, y, x2, y2);
            d3 = ptop(x, y, x1, y2);
            d4 = ptop(x, y, x2, y1);
            if(d1 < r * r && d2 < r * r && d3 < r * r && d4 < r * r)
            {
                puts("NO");
                continue;
            }
            d1 = PointToSegDist(x, y, x1, y1, x1, y2);
            d2 = PointToSegDist(x, y, x1, y1, x2, y1);
            d3 = PointToSegDist(x, y, x1, y2, x2, y2);
            d4 = PointToSegDist(x, y, x2, y1, x2, y2);
            if(d1 > r * r && d2 > r * r && d3 > r * r && d4 > r * r)
                puts("NO");
            else puts("YES");
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值