HDU 1221(Rectangle and Circle)

#include <iostream>
#include <cmath>
#include <algorithm>
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 sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1));
        else if (x > x2)
            return sqrt((x - x2) * (x - x2) + (y - y2) * (y - y2));
        else
            return fabs(y - y1);
    }
    else if (x1 == x2)
    {
        if (y1 > y2)
            swap(y1, y2);
        if (y < y1)
            return sqrt((x - x1) * (x - x1) + (y - y2) * (y - y2));
        else if (y > y2)
            return sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1));
        else
            return fabs(x - x1);
    }
    return 0;
}

//计算两点之间的距离
double PointToPointDist(double x1, double y1, double x2, double y2)
{
    return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}

int main()
{
    int P;
    cin >> P;
    double x, y, r, x1, y1, x2, y2;
    double d1, d2, d3, d4; //圆心和矩形4个顶点的距离
    while (P--)
    {
        cin >> x >> y >> r >> x1 >> y1 >> x2 >> y2;
        d1 = PointToPointDist(x, y, x1, y1);
        d2 = PointToPointDist(x, y, x2, y2);
        d3 = PointToPointDist(x, y, x1, y2);
        d4 = PointToPointDist(x, y, x2, y1);
        //矩形4个顶点都在圆内,不相交
        if (d1 < r && d2 < r && d3 < r && d4 < r)
        {
            cout << "NO" << endl;
            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);
        //圆心到矩形4条边的距离都大于半径,不相交
        if (d1 > r && d2 > r && d3 > r && d4 > r)
            cout << "NO" << endl;
        else
            cout << "YES" << endl;
    }
    return 0;
}

 

Published 152 original articles · won praise 1 · views 7628

Guess you like

Origin blog.csdn.net/Intelligence1028/article/details/104658139