POJ3304_Segments_叉积::判断直线与线段是否相交
来源:互联网 发布:新闻营销拓虹网络 编辑:程序博客网 时间:2024/06/06 03:39
题意
给出 n 个线段,问是否存在一条直线,当这 n 条线段投影在直线上时,至少有一个公共点。
思路
如果存在这么一条直线,那么以公共点为垂足,作这条直线的垂线,则这条垂线与所有线段都至少存在一个交点。于是,问题就转化成了:是否存在一条直线, n 条直线都相交。
把这条线段微微旋转,则可以使这条垂线上至少存在两个端点。于是,可以通过枚举线段的端点,来找这条直线。
最后一个关键点是,如何判断一条直线和一条线段是否相交。
叉积判断直线与线段是否相交
线段的端点 a 向直线上的两点作向量,并求叉积 x1;端点 b 向这两点作向量并求叉积 x2。如果 x1 * x2 <= 0,则直线过某一端点,或线段的两个端点分别在直线的两侧。从而可以推出线段与直线相交。
题目链接
http://poj.org/problem?id=3304
AC代码
#include<cstdio>#include<iostream>#include<cmath>using namespace std;struct P{ double x, y; P(){} P(double _x, double _y) : x(_x), y(_y) {} P operator + (P b){return P(x + b.x, y + b.y);} P operator - (P b){return P(x - b.x, y - b.y);} P operator * (double b){return P(x * b, y * b);} double dot(P b){return x * b.x + y * b.y;} double det(P b){return x * b.y - y * b.x;}};struct L{ P a, b; L(){} L(P _a, P _b) : a(_a), b(_b) {}};const int maxn = 110;const int eps = 1e-8;int Cas, N;L line[maxn];double Xmult(P a, P b, P t){ return (a - t).det(b - t);}bool Judge(P a, P b){ if(fabs(a.x - b.x) <= eps && fabs(a.y - b.y) <= eps) return false; for(int i= 0; i< N; i++) if(Xmult(a, b, line[i].a) * Xmult(a, b, line[i].b) > 0) return false; return true;}int main(){// freopen("in.txt", "r", stdin); scanf("%d", &Cas); while(Cas --) { scanf("%d", &N); for(int i= 0; i< N; i++) { double x1, y1, x2, y2; scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2); line[i] = L(P(x1, y1), P(x2, y2)); } bool res = false; for(int i= 0; i< N && !res; i++) for(int j= 0; j< N && !res; j++) if(Judge(line[i].a, line[j].a) || Judge(line[i].a, line[j].b) || Judge(line[i].b, line[j].a) || Judge(line[i].b, line[j].b)) res = true; if(res) printf("Yes!\n"); else printf("No!\n"); } return 0;}
阅读全文
0 0
- POJ3304_Segments_叉积::判断直线与线段是否相交
- 51nod 判断线段是否相交 poj Segments直线与多条线段相交
- 判断直线与线段是否相交,相交则输出交点x轴坐标
- POJ 3304 判断直线与线段相交
- POJ 3304 判断线段 与 直线 相交
- poj 3304 判断直线与线段相交
- POJ 3304 直线与线段相交判断
- 判断直线与线段 是否相交 + 加入误差 故需要判断重点 poj 3304 Segments
- poj1410判断线段与矩形是否相交(判断线段相交)
- poj 3304 判断是否有与所有线段相交的直线
- poj 3304 Segments 【判断是否存在一条直线与所有线段相交】
- POJ 3304 Segments (计算几何、判断直线与线段是否相交)
- 线段与直线相交
- POJ - 3304 :Segments__判断直线和线段是否 相交
- POJ 3304 Segments (判断直线和线段是否相交)
- poj3304-Segments-判断直线和线段是否相交
- POJ 3304 Segments(判断线段和直线是否相交)
- 判断线段与圆是否相交
- Oracle之查询+内置函数
- BZOJ 1030-文本生成器(DP+AC自动机)
- struts2的json-default和struts-default的区别
- oracle数据库技能树
- 缓存穿透与缓存雪崩的解决方案
- POJ3304_Segments_叉积::判断直线与线段是否相交
- rails 监控多个表的改动
- Java语言判断输入的是否是一个英文字母
- 相同字符串比较却返回false(提取cookie内容出现的小问题)
- Linux 内核模块 helloworld
- VS快捷键的设置使用
- 并发多线程测试工具
- Android笔记(17)弹出对话框
- 萌新的linux之旅1