您的位置:首页 > 其它

poj 1410(判断直线是否相交)

2011-04-30 11:45 337 查看
题意:给定一条直线,和一个矩形,判断此直线是否和矩形有交点.

思路:把矩形的边转换成四条线段,与给定直线判交.

注意:矩形是一个实框,若直线在矩形内部也算有交点.

代码:

#include <iostream>
#include <cstdio>
using namespace std;
struct point
{
double x,y;
};
struct line
{
point p1,p2;
}lines[5];
double dmax(double a, double b)
{
return a > b? a : b;
}
double dmin(double a,double b)
{
return a > b? b:a;
}
double dir(point p1, point p2, point p3)
{
return (p3.x-p1.x)*(p2.y-p1.y)-(p2.x-p1.x)*(p3.y-p1.y);
}
bool on_segment(point p1,point p2, point p3)
{
double xmin = dmin(p1.x,p2.x);
double xmax = dmax(p1.x,p2.x);
double ymin = dmin(p1.y,p2.y);
double ymax = dmax(p1.y,p2.y);
if(xmin <= p3.x && xmax >=p3.x && ymin<= p3.y && ymax >=p3.y)
return true;
else
return false;
}
bool segment_intersect(point p1,point p2,point p3,point p4)
{
double d1,d2,d3,d4;
d1 = dir(p3,p4,p1);
d2 = dir(p3,p4,p2);
d3 = dir(p1,p2,p3);
d4 = dir(p1,p2,p4);
if(((d1>0 && d2<0)||(d1<0 && d2>0))&&((d3>0 && d4<0)||(d3<0 && d4>0)))
return true;
else if(d1==0 && on_segment(p3,p4,p1))
return true;
else if(d2==0 && on_segment(p3,p4,p2))
return true;
else if(d3 == 0 && on_segment(p1,p2,p3))
return true;
else if(d4==0 && on_segment(p1,p2,p4))
return true;
else
return false;
}
int main(void)
{
int t;
cin >> t;
while(t--)
{
int i;
bool flag = false;
line L;
point p,pp;
cin >> L.p1.x >>L.p1.y >>L.p2.x >> L.p2.y;
cin >>p.x >>p.y>>pp.x>>pp.y;
lines[0].p1.x = p.x;
lines[0].p1.y = p.y;
lines[0].p2.x = pp.x;
lines[0].p2.y = p.y;
lines[1].p1.x = p.x;
lines[1].p1.y = p.y;
lines[1].p2.x = p.x;
lines[1].p2.y = pp.y;
lines[2].p1.x = pp.x;
lines[2].p1.y = pp.y;
lines[2].p2.x = p.x;
lines[2].p2.y = pp.y;
lines[3].p1.x = pp.x;
lines[3].p1.y = pp.y;
lines[3].p2.x = pp.x;
lines[3].p2.y = p.y;
if(L.p1.x<=dmax(p.x,pp.x)&&L.p1.x>=dmin(p.x,pp.x)&&L.p2.x<=dmax(p.x,pp.x)&&L.p2.x>=dmin(p.x,pp.x)
&&L.p1.y<=dmax(p.y,pp.y)&&L.p1.y>=dmin(p.y,pp.y)&&L.p2.y<=dmax(p.y,pp.y)&&L.p2.y>=dmin(p.y,pp.y))
flag = true;
for(i=0; i<4; i++)
if(segment_intersect(L.p1,L.p2,lines[i].p1,lines[i].p2))
{
flag = true;
break;
}
if(flag)
cout << "T" << endl;
else
cout <<"F" << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: