判断线面相交问题
来源:互联网 发布:bytefence是什么软件 编辑:程序博客网 时间:2024/04/29 18:05
题目来源呢,是 UVA191考题。
题目链接
怎么说呢,题目意思还算简洁,数据也限定在正整数不然若是浮点数用上了double误差允许范围内判等 或是 坐标出现负数,那代码就还有的改咯。
另外,参考了一下大牛的解法,贴上地址~
判断两线段是否相交
#include <iostream>#include <cstdio>using namespace std;struct point{//点结构体 int x,y; point(int a=0,int b=0){ x=a; y=b;}//给点赋坐标值};int direction(point p1,point p2,point p3){//二维矩阵 return ( (p2.x-p1.x)*(p3.y-p1.y) - (p3.x-p1.x)*(p2.y-p1.y));}//返回的是向量p1p2与p1p3叉积结果bool checkPointOnLine(point p1,point p2,point p3){//利用坐标大小判断p3是否在线段p1p2 if( p3.x< min(p1.x,p2.x) || p3.x> max(p1.x,p2.x) || p3.y< min(p1.y,p2.y) || p3.y> max(p1.y,p2.y)) return false; else return true;}//reue的条件为 (p3.x>= min(p1.x,p2.x) && p3.x<= max(p1.x,p2.x) && p3.y>=min(p1.y,p2.y) && p3.y<= max(p1.y,p2.y))bool checkIntersection(point p1,point p2,point p3, point p4){//线在矩形外,判断相交 int d1,d2,d3,d4; d1 = direction(p3,p4,p1);//p3p4 and p3p1 d2 = direction(p3,p4,p2);//p3p4 and p3p2//根据叉积几何意义判断两条线段相交知:若d1与d2异号则点p1、p2分居在向量p3p4两侧,即是p1p2与p3p4相交 d3 = direction(p1,p2,p3);//p1p2 and p1p3 d4 = direction(p1,p2,p4);//p1p2 and p1p4//同理,异号时p3、p4分居向量p1p2 //cout << d1 << " " << d2 <<" " << d3 << " " << d4 << endl; if((d1*d2<0) && (d3*d4<0)) return true;//Intersecting! else if((d1 == 0)&&( checkPointOnLine(p3,p4,p1)))//这一行代码说明p3p4与p1p2相交,至少有交点p1(其实已经共线了),以下同理 return true; else if((d2 == 0)&&( checkPointOnLine(p3,p4,p2))) return true; else if((d3 == 0)&&( checkPointOnLine(p1,p2,p3))) return true; else if((d4 == 0)&&( checkPointOnLine(p1,p2,p4))) return true; else return false; } //线段(pa,pb)在矩形p1p3的内部,必相交 bool segmentInRectangle(point p1,point p3,point pa,point pb){//p1、p3表示矩形的上下两个端点(由于题目说此两点不分顺序故需先判断后取大小) if( (min(p1.x,p3.x) <= pa.x && pa.x <= max(p1.x,p3.x)) && (min(p1.y,p3.y) <= pa.y && pa.y <= max(p1.y,p3.y)) && (min(p1.x,p3.x) <= pb.x && pb.x <= max(p1.x,p3.x)) && (min(p1.y,p3.y) <= pb.y && pb.y <= max(p1.y,p3.y)) ) return true; else return false;}inline void gameOver(){ point pa,pb;//线段端点 point p1,p3;//输入的矩形两个对角端点 point p2,p4;//矩形的另外两对角端点 int xa,ya,xb,yb,x1,y1,x3,y3; scanf("%d%d %d%d %d%d %d%d",&xa,&ya,&xb,&yb,&x1,&y1,&x3,&y3); pa = point(xa,ya); pb = point(xb,yb); p1 = point(x1,y1); p3 = point(x3,y3); p2 = point(x1,y3); p4 = point(x3,y1); if( segmentInRectangle(p1,p3,pa,pb) || checkIntersection(p1,p2,pa,pb) || checkIntersection(p3,p4,pa,pb) || checkIntersection(p3,p2,pa,pb) || checkIntersection(p1,p4,pa,pb) ) printf("T\n"); else printf("F\n");}int main(){ int n; scanf("%d",&n); while(n--){ gameOver(); } return 0;}
待更,持续更新中……
0 0
- 判断线面相交问题
- SQL -- 判断线是否与面相交或者在其内部
- 链表判环、判交问题
- ZOJ--1010:Area(线段判交问题)
- POJ 3335 半面相交
- POJ 3130 半面相交
- POJ 1474 半面相交
- 用Mathematica解两个圆柱面相贯的交线及其投影的问题
- 线段判交
- POJ 3525 二分+半面相交
- HDU 4316 凸包+半面相交
- HDU 1086(线段判交)
- 线段判交-- POJ 2653
- Segments(问题抽象与转化+暴力枚举+线段与直线判交)
- Flex点面/线面相交分析思路
- 空间射线与三角面相交算法及实现
- 面相
- GPRS断线问题
- hive union
- Spring Quartz 多任务、并发配置
- Java面向对象之继承
- 理解对象模型OMD(课堂笔记)
- poj 2492 A Bug's Life(并查集 染色法 二分图)
- 判断线面相交问题
- 4. Median of Two Sorted Arrays
- 5种服务器网络编程模型讲解
- UVA11426:GCD
- L1-011. A-B
- Codeforces Round #396 (Div. 2) C. Mahmoud and a Message 倒着DP
- MySQL学习笔记
- 在红尘的最深处与你相遇
- 修改MySQL的root用户的密码