51Nod 1264 线段相交 (计算几何)
2016-08-19 09:36
309 查看
给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相交)。 如果相交,输出"Yes",否则输出"No"。
Input
Output
Input示例
Output示例
首先引出计算几何学中一个最基本的问题:如何判断向量
在
的顺时针方向还是逆时针方向?把p0定为原点,p1的坐标是(x1,y1),p2的坐标是(x2,y2)。向量的叉积(cross product)实际上就是矩阵的行列式:
当叉积为正时,说明
在
的顺时针方向上;叉积为0说明两向量共线(同向或反向)。当同时满足:(1)
和
在
的两侧(即一个顺时针方向上,一个在逆时针方向上)(2)
和
在
的两侧时可肯定
和
相交。
Input
第1行:一个数T,表示输入的测试数量(1 <= T <= 1000) 第2 - T + 1行:每行8个数,x1,y1,x2,y2,x3,y3,x4,y4。(-10^8 <= xi, yi <= 10^8) (直线1的两个端点为x1,y1 | x2, y2,直线2的两个端点为x3,y3 | x4, y4)
Output
输出共T行,如果相交输出"Yes",否则输出"No"。
Input示例
2 1 2 2 1 0 0 2 2 -1 1 1 1 0 0 1 -1
Output示例
Yes No
利用叉积进行判断(叉积原来还可以这样用。。。)
首先引出计算几何学中一个最基本的问题:如何判断向量
在
的顺时针方向还是逆时针方向?把p0定为原点,p1的坐标是(x1,y1),p2的坐标是(x2,y2)。向量的叉积(cross product)实际上就是矩阵的行列式:
当叉积为正时,说明
在
的顺时针方向上;叉积为0说明两向量共线(同向或反向)。当同时满足:(1)
和
在
的两侧(即一个顺时针方向上,一个在逆时针方向上)(2)
和
在
的两侧时可肯定
和
相交。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; struct Point { double x,y; }; double mult(Point a, Point b, Point c) { return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y); } bool judge(Point aa, Point bb, Point cc, Point dd) { if ( max(aa.x, bb.x)<min(cc.x, dd.x) ) { return false; } if ( max(aa.y, bb.y)<min(cc.y, dd.y) ) { return false; } if ( max(cc.x, dd.x)<min(aa.x, bb.x) ) { return false; } if ( max(cc.y, dd.y)<min(aa.y, bb.y) ) { return false; } if(mult(cc,bb,aa)*mult(dd,bb,aa)<=0&&mult(bb,dd,cc)*mult(aa,dd,cc)<=0) return true; return false; } int main() { int T; scanf("%d",&T); while(T--) { Point a,b,c,d; scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y,&d.x,&d.y); if(judge(a,b,c,d)) printf("Yes\n"); else printf("No\n"); } return 0; }
相关文章推荐
- 51nod 1264 线段相交(计算几何)
- 51nod 1264:线段相交(计算几何)
- 51nod--1264 线段相交 (计算几何基础, 二维)
- 【51Nod】1264 - 线段相交(计算几何)
- 51nod 1264 线段相交(计算几何)
- [51NOD]-1264 线段相交 [计算几何&叉积&点积]
- 51Nod 1264:线段相交(计算几何)
- 1264 线段相交(几何计算)
- 51Nod 1264 线段相交 <叉积计算>
- 51nod 1264 线段相交(几何)
- 51nod:1264 线段相交(数学几何)
- 1264 线段相交(计算几何)
- 51NOD 1264 线段相交
- POJ 1127 —— 计算几何 && 线段相交
- POJ 3304 Segments(计算几何:直线与线段相交)
- 移动微小的距离,线段相交,计算几何(怪物陷阱,LA 2797)
- 51nod 1264 线段相交
- 51Nod-1264 线段相交
- hdu 1086:You can Solve a Geometry Problem too(计算几何,判断两线段相交,水题)
- NYOJ 83-迷宫寻宝(二)(计算几何->线段相交)