题意:
给出8个整数,第1~2个整数是线段的一个端点的横纵坐标,第3~4个整数是线段的另一个端点的横纵坐标,第5~6个整数是矩形的左边的横坐标和上边的纵坐标,第7~8个整数是矩形的右边的横坐标和下边的纵坐标。然后又说了一句术语左上角和右下角并不意味着坐标的任何顺序。不代表任何顺序。矩形的问线段与矩形及矩形的内部是否有公共点。
题解:
1.排除法排除所有不符合题意的情况即可。结合代码和注释容易理解。
2.输入坑点:术语左上角和右下角并不意味着坐标的任何顺序。表明给的可能是左上角和右下角坐标,也可能是右下角和左上角坐标。这个坑死我了,WA了十几次。
3.我给的方法和百度给的不太一样,我是按中学数学的斜率和截距算的,并没有用叉积,我觉得比叉积熟悉一些。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#define eps 1e-8
using namespace std;
int x1 , yy1 , x2 , y2 ;
int lx , rx , dy , uy ;
double k , b ;
double ly , ry ;
int main()
{
int t ;
scanf("%d" , &t) ;
while(t --)
{
scanf("%d%d%d%d%d%d%d%d" , &x1 , &yy1 , &x2 , &y2 , &lx , &uy , &rx , &dy) ;
if(lx > rx)
swap(lx , rx) ;
if(dy > uy)
swap(dy , uy) ;
if(max(x1 , x2) < lx || min(x1 , x2) > rx
|| max(yy1 , y2) < dy || min(yy1 , y2) > uy)
//假如x或y不在这片区域那么一定没有交点
{
printf("F\n") ;
continue ;
}
if(x1 == x2 || yy1 == y2)
//与x轴和或y轴平行的情况,排除了端点都在区域一侧的情况,那就都符合了
//其实主要是避免下面的排除法出现分母为0的情况
{
printf("T\n") ;
continue ;
}
k = (double)(y2 - yy1) / (x2 - x1) ;
b = yy1 - k * x1 ;
ly = k * lx + b ;
ry = k * rx + b ;
if(k > 0 && ly > uy && fabs(ly - uy) > eps
|| k < 0 && ry > uy && fabs(ry - uy) > eps
|| k < 0 && ly < dy && fabs(ly - dy) > eps
|| k > 0 && ry < dy && fabs(ry - dy) > eps)
//当线段不与坐标轴平行的不符合情况
{
printf("F\n") ;
continue ;
}
printf("T\n") ;
}
}