被坑一次,判断错误一次,不过A掉了。
题目输入left, top, right, bottom不一定按左上-右下输入,随机的需要判断。
而且线段在矩形内也算 'T' ;
判断是否相交问题,转化为判断 线段端点 与 边长线段 的位置关系和 边长线段端点 与线段之间的位置关系。
相互判断同时成立即可,一左一右, 一左另一个在线段上, 一右另一个在线段上
若共线单独思考(别人告诉我不用,我不会,各位求教下).
#include <stdio.h>
int left, top, right, bottom;
//判断线段是否与矩形各个边相交
int Judge (int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
{
int a, b, c, d;
a = (x2 - x1) * (y4 - y1) - (x4 - x1) * (y2 - y1);
b = (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1);
c = (x4 - x3) * (y2 - y3) - (x2 - x3) * (y4 - y3);
d = (x4 - x3) * (y1 - y3) - (x1 - x3) * (y4 - y3);
//两个线段不相交时不能共线
if ((a * b <= 0) && (c * d < 0) || (a * b < 0) && (c * d <= 0))
return 1;
return 0;
}
void swap(int *a, int *b)
{
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
//线段端点在矩形内或在矩形上
int inside(int x, int y)
{
if (x >= left && x <= right && y >= bottom && y <= top)
return 1;
return 0;
}
int main()
{
int n, ok;
int x1, y1, x2, y2;
scanf("%d", &n);
while (n--)
{
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
scanf("%d%d%d%d", &left, &top, &right, &bottom);
//处理,使left < right && bottom < top
//题目没有这么给出,需要自己处理
if (left > right) swap(&left, &right);
if (top < bottom) swap(&top, &bottom);
if (inside(x1, y1) && inside(x2, y2))
ok = 1;
else if (Judge(x1, y1, x2, y2, left, bottom, right, bottom) == 1)
ok = 1;
else if (Judge(x1, y1, x2, y2, right, bottom, right, top) == 1)
ok = 1;
else if (Judge(x1, y1, x2, y2, right, top, left, top) == 1)
ok = 1;
else if (Judge(x1, y1, x2, y2, left, top, left, bottom) == 1)
ok = 1;
else
ok = 0;
printf("%c\n", ok ? 'T' : 'F');
}
return 0;
}

本文介绍了一种判断线段与矩形是否相交的算法实现,通过比较线段端点与矩形边界的位置关系来判断是否相交。讨论了线段端点位于矩形内部或边界上的特殊情况。

被折叠的 条评论
为什么被折叠?



