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; }
相关文章推荐
- poj 1410 判断线段和矩形是否相交
- POJ 3304 Segments (计算几何、判断直线与线段是否相交)
- 判断直线与线段 是否相交 + 加入误差 故需要判断重点 poj 3304 Segments
- poj 1410 判断线段与长方形是否相交
- poj 1410 Intersection (判两直线是否相交)
- POJ1912_A highway and the seven dwarfs_判断凸包与直线是否相交
- POJ 1410 Intersection(判断线段和矩形是否相交)
- poj-1410 判断矩形和线段是否相交
- POJ 3304 Segments(判断线段和直线是否相交)
- poj 1410 Intersection(判断线段是否与实心矩形相交)
- POJ 3304 Segments (判断直线和线段是否相交)
- POJ - 3304 :Segments__判断直线和线段是否 相交
- (计算几何step8.1.2.1)POJ 2653 Pick-up sticks(判断一根木棒的上面时候还有其他木棒——判断两条直线是否相交)
- poj 3304 判断是否有与所有线段相交的直线
- poj 3304 Segments 【判断是否存在一条直线与所有线段相交】
- POJ 1410 Intersection(判断线段与矩形是否相交)
- Segments - POJ 3304 (判断直线与线段是否相交)
- poj 3304 判断是否存在一条直线与所有线段相交
- poj 1410 判断线段与长方形是否相交
- poj 1410 Intersection 【判断线段 与矩形面是否相交】