zoukankan      html  css  js  c++  java
  • POJ 1410 Intersection

    题意:给出一条线段、一个矩形,判断两者是否相交。
    注意两个问题:

    1.这里的相交是指线段不在矩形的外面,也就是说 线段与矩形有交点 或者线段完全在矩形内部。

    2.题目描述有问题, 题目中说是按照 xstart ystart xend yend xleft ytop xright ybottom 的format (格式)给出,

    按照题意,也就是说给出的坐标顺序是

    起点,终点,左上角,右下角

    但是根据实际给出的数据看出来,应该是

    起点,终点,对角顶点

    因此,后面两个数据就不一定是 左上角,右下角 了。


    思路:先判断线段所在的直线是否与矩形相交,进一步判断线段是否与矩形相交两种情况:
    1.斜率存在,
    直线方程:y=k*x+b ,
    令s =y-k*x-b , 由s符号可判断点与直线的位置
    相交的两种可能:
    (1).两个点 位于线段所在直线的两侧的时候,则s[i]与s[j] 异号,乘积sum<0;
    (2).其中一个点正好在 线段上,即 其中一个s为0,则 sum=s[i]*s[j] =0,这里斜率有误差,取0.00000001 近似为 0
    如果直线与矩形相交,进一步判断线段是否与矩形相交
    2.斜率不存在的时候,很好判断了

    代码:

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    
    int main(){
    	float xstart,ystart ,xend,yend;
    	float xleft,ytop ,xright,ybottom;
    	float x1,y1 ,x2,y2;//矩形两个对角坐标
    	int n;
    	int i,j;
    	scanf("%d",&n);
    	while(n--){
    		scanf("%f%f%f%f",&xstart,&ystart,&xend,¥d);
    		scanf("%f%f%f%f",&x1,&y1,&x2,&y2);//这里的输入仅仅是两个对角的坐标,哪两个角并不确定
    		xleft=x1<x2?x1:x2;
    		xright=x1>x2?x1:x2;
    		ytop=y1>y2?y1:y2;
    		ybottom=y1<y2?y1:y2;
    		
    		if(xstart!=xend){//斜率存在的时候
    			float k=(yend-ystart)/(xend-xstart);
    			float b=ystart-k*xstart;
    			float s[4];//y=k*x+b  ,令s =y-k*x-b ,由s符号可判断点在直线的位置
    			s[0]=ytop-k*xleft-b;
    			s[1]=ytop-k*xright-b;
    			s[2]=ybottom-k*xleft-b;
    			s[3]=ybottom-k*xright-b;
    			//先判断直线是否与矩形相交
    			bool flag=false;//假设直线与矩形不相交
    			for(i=0;i<4;i++)
    				for(j=0;j<4;j++){//枚举两个点的位置关系
    					float sum=s[i]*s[j];//相交的两种可能:
    					if(sum<=0.00000001)//1.两个点  位于线段所在直线的两侧的时候,则s[i]与s[j]  异号,乘积sum<0;
    						flag=true;     //2.其中一个点正好在  线段上,即 其中一个s为0,则 sum=s[i]*s[j]  =0,这里斜率有误差,取0.00000001 近似为 0 
    				}
    				if(flag==false)
    					printf("F
    ");
    				//进一步判断
    				else{//如果线段所在的直线与矩形相交,进一步判断线段是否与矩形相交
    					if(ystart>ytop&¥d>ytop||ystart<ybottom&¥d<ybottom)//线段在矩形上或下,不想交
    						flag=false;
    					else if(xstart<xleft&&xend<xleft||xstart>xright&&xend>xright)//线段在矩形左或右,不想交
    						flag=false;
    					if(flag)
    						printf("T
    ");
    					else
    						printf("F
    ");
    				}
    		}	
    		
    		else{//斜率不存在的时候
    			if(ystart>ytop&¥d>ytop||ystart<ybottom&¥d<ybottom)//线段在矩形上或下,不想交
    				printf("F
    ");
    			else if(xstart<xleft||xstart>xright)//线段在矩形左或右,不想交
    				printf("F
    ");
    			else printf("T
    ");
    		}
    	}
    	return 0;
    }
    
    
    


    官方测试数据:

    in

    68
    4 9 11 2 1 1 7 5
    11 2 4 9 1 1 7 5
    12 12 24 24 19 5 25 17
    4 6 15 9 1 1 11 11
    19 5 25 17 12 12 24 24
    0 18 8 12 1 1 11 11
    2 4 4 2 1 1 11 11
    -4 9 -11 2 -1 1 -7 5
    -11 2 -4 9 -1 1 -7 5
    -12 12 -24 24 -19 5 -25 17
    -4 6 -15 9 -1 1 -11 11
    -19 5 -25 17 -12 12 -24 24
    0 18 -8 12 -1 1 -11 11
    -2 4 -4 2 -1 1 -11 11
    4 -9 11 -2 1 -1 7 -5
    11 -2 4 -9 1 -1 7 -5
    12 -12 24 -24 19 -5 25 -17
    4 -6 15 -9 1 -1 11 -11
    19 -5 25 -17 12 -12 24 -24
    0 -18 8 -12 1 -1 11 -11
    2 -4 4 -2 1 -1 11 -11
    -4 -9 -11 -2 -1 -1 -7 -5
    -11 -2 -4 -9 -1 -1 -7 -5
    -12 -12 -24 -24 -19 -5 -25 -17
    -4 -6 -15 -9 -1 -1 -11 -11
    -19 -5 -25 -17 -12 -12 -24 -24
    0 -18 -8 -12 -1 -1 -11 -11
    -2 -4 -4 -2 -1 -1 -11 -11
    9 1 9 2 4 3 9 6
    9 2 9 1 4 3 9 6
    10 3 13 3 4 3 9 6
    13 3 10 3 4 3 9 6
    10 6 14 6 4 3 9 6
    14 6 10 6 4 3 9 6
    9 7 9 10 4 3 9 6
    9 10 9 7 4 3 9 6
    4 7 4 10 4 3 9 6
    4 10 4 7 4 3 9 6
    0 6 3 6 4 3 9 6
    3 6 0 6 4 3 9 6
    1 3 3 3 4 3 9 6
    3 3 1 3 4 3 9 6
    4 0 4 2 4 3 9 6
    4 2 4 0 4 3 9 6
    5 3 8 5 4 3 9 6
    8 5 5 3 4 3 9 6
    5 3 8 3 4 3 9 6
    8 3 5 3 4 3 9 6
    6 4 6 5 4 3 9 6
    6 5 6 4 4 3 9 6
    4 3 9 6 4 3 9 6
    9 6 4 3 4 3 9 6
    4 3 5 4 4 3 9 6
    5 4 4 3 4 3 9 6
    5 3 8 3 4 3 9 6
    8 3 5 3 4 3 9 6
    5 3 9 3 4 3 9 6
    9 3 5 3 4 3 9 6
    4 4 4 5 4 3 9 6
    4 5 4 4 4 3 9 6
    4 3 4 5 4 3 9 6
    4 5 4 3 4 3 9 6
    4 3 4 6 4 3 9 6
    4 6 4 3 4 3 9 6
    9 2 9 5 4 3 9 6
    9 5 9 2 4 3 9 6
    9 2 9 7 4 3 9 6
    9 7 9 2 4 3 9 6

    out

    F
    F
    F
    T
    T
    F
    T
    F
    F
    F
    T
    T
    F
    T
    F
    F
    F
    T
    T
    F
    T
    F
    F
    F
    T
    T
    F
    T
    F
    F
    F
    F
    F
    F
    F
    F
    F
    F
    F
    F
    F
    F
    F
    F
    T
    T
    T
    T
    T
    T
    T
    T
    T
    T
    T
    T
    T
    T
    T
    T
    T
    T
    T
    T
    T
    T
    T
    T





  • 相关阅读:
    Work harder, smarter 工作需要努力和智慧
    且慢下手(转)
    .net 打包中的参数传递
    sql语句编写技巧
    在安装文件中解压sfx压缩文件
    vs.net编程技巧
    統制勘定(reconciliationaccounts)とは
    ExtJs页面布局总结(转载)
    ext自定义form表单参数为JSON格式getJsonValue:(同时提交多个表单时需要用到)
    oracle截取日期函数
  • 原文地址:https://www.cnblogs.com/gongpixin/p/4477406.html
Copyright © 2011-2022 走看看