세그먼트가 사각형과 교차하는지 여부를 판단하다

2754 단어 ACM - 형상 계산
입력 형식:
xstart ystart xend yend xleft ytop xright ybottom Note: The terms top left and bottom right do not imply any ordering of coordinates.
계산 기하학 문제는 나에게 있어서 쓰기만 하면 오래 걸리고 코드도 간결하고 이해하기 쉬워서 정말 어렵다. 주의점은 선과 직사각형이 교차하지 않는다는 것이다. 이것은 선단이 직사각형 이외에도 직사각형 안에 있을 수 있다는 것을 의미한다.
#include 
using namespace std;

int main()
{
    int t, x1, y1, x2, y2, xl, yt, xr, yb;
    int a, b, c, f1, f2, f3, f4;
    cin >> t;
    while (t--)
    {
        scanf("%d%d%d%d%d%d%d%d", &x1, &y1, &x2, &y2, &xl, &yt, &xr, &yb);
        if (xl > xr) swap(xl, xr);
        if (yt < yb) swap(yt, yb);
        a = y1 - y2;
        b = x2 - x1;
        c = x1 * y2 - y1 * x2;
        f1 = a * xl + b * yb + c;
        f2 = a * xl + b * yt + c;
        f3 = a * xr + b * yb + c;
        f4 = a * xr + b * yt + c;
        if ((f1>0 && f2>0 && f3>0 && f4>0) || (f1<0 && f2<0 && f3<0 && f4<0))
            printf("F
"
); else if ((x1 > xr && x2 > xr) || (x1 < xl && x2 < xl)) printf("F
"
); else if ((y1 > yt && y2 > yt) || (y1 < yb && y2 < yb)) printf("F
"
); else printf("T
"
); } return 0; }

좋은 웹페이지 즐겨찾기