poj 1410 排除法 判断实心矩形和线段相交 输入坑点

题意:

给出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") ;
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值