1 // 判断线段和直线相交 POJ 3304
 2 // 思路:
 3 // 如果存在一条直线和所有线段相交,那么平移该直线一定可以经过线段上任意两个点,并且和所有线段相交。
 4
 5 #include <cstdio>
 6 #include <cstring>
 7 #include <iostream>
 8 #include <algorithm>
 9 #include <map>
10 #include <set>
11 #include <queue>
12 #include <stdlib.h>
13 #include <cmath>
14 using namespace std;
15 typedef long long LL;
16 const LL inf = 1e18;
17 const int N = 5000;
18 const double eps = 1e-8;
19
20 int sgn(double x){
21     if(fabs(x)<eps) return  0;
22     if(x<0) return -1;
23     return 1;
24 }
25
26 struct Point{
27     double x,y;
28     Point(){}
29     Point(double _x,double _y){
30         x=_x;y=_y;
31     }
32     Point operator -(const Point &b)const{
33         return Point(x-b.x,y-b.y);
34     }
35     double operator *(const Point &b)const{
36         return x*b.x+y*b.y;
37     }
38     double operator ^(const Point &b)const{
39         return x*b.y-y*b.x;
40     }
41 };
42
43 struct Line{
44     Point s,e;
45     Line(){}
46     Line(Point _s,Point _e){
47         s=_s,e=_e;
48     }
49 };
50
51 double xmult(Point p0,Point p1,Point p2){
52     return (p1-p0)^(p2-p0);
53 }
54
55 bool Seg_inter_line(Line l1,Line l2){
56     return sgn(xmult(l2.s,l1.s,l1.e))*sgn(xmult(l2.e,l1.s,l1.e))<=0;
57 }
58
59 double dist(Point a,Point b){
60     return sqrt((a-b)*(a-b));
61 }
62 Line line[N];
63 bool work(Line l1,int n){
64     if(sgn(dist(l1.s,l1.e))==0) return false;
65     for(int i=0;i<n;i++){
66         if(Seg_inter_line(l1,line[i])==false) return false;
67     }
68     return true;
69 }
70 int main(){
71     int n,T;
72     scanf("%d",&T);
73     while(T--){
74         scanf("%d",&n);
75         double x1,y1,x2,y2;
76         for(int i=0;i<n;i++){
77             scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
78             line[i]=Line(Point(x1,y1),Point(x2,y2));
79         }
80         bool flag=false;
81         for(int i=0;i<n;i++){
82             for(int j=0;j<n;j++){
83                 if(work(Line(line[i].s,line[j].e),n)||work(Line(line[i].s,line[j].s),n)||work(Line(line[i].e,line[j].e),n)||work(Line(line[i].e,line[j].s),n)){
84                     flag=true;
85                     break;
86                 }
87             }
88             if(flag) break;
89         }
90         if(flag) puts("Yes!");
91         else puts("No!");
92     }
93     return 0;
94 }

转载于:https://www.cnblogs.com/ITUPC/p/5851135.html

判断线段和直线相交 POJ 3304相关推荐

  1. 判断两条线段/直线相交,并求交点

      一.矢量基本知识     因为后面的计算需要一些矢量的基本知识,这里只是简单的列举如下,如果需要更加详细的信息,可以自行搜索wikipedia或google. 1.矢量的概念:如果一条线段的端点是 ...

  2. 判断两条直线是否相交c语言,学习OpenCV3:判断两条直线相交,并计算交点和夹角...

    一.问题 已知两条直线 和 ,现希望判断 与 间是否相交.若相交,计算出两条直线的交点和夹角. 二.分析 1.直线方程 的直线方程: 的直线方程: 提示: 和 不能同时为0.若 和 同时为0,起点和终 ...

  3. 线段(向量)的计算(判断线段重叠、相交,合并线段,点与线的关系)

    主要内容: 判断两线段是否相交 计算两线段的交叉点 点与直线的位置关系 判断两线段重合并计算其重合部分 判断合并两条线段 说明全都在注释里了,有的方法可能不是最佳,欢迎大家提出建议~~ public ...

  4. Segments POJ 3304 直线与线段是否相交

    题目大意:给出n条线段,问是否存在一条直线,使得n条线段在直线上的投影有至少一个公共点. 题目思路:如果假设成立,那么作该直线的垂线l,该垂线l与所有线段相交,且交点可为线段中的某两个交点 证明:若有 ...

  5. 几何常用算法与判断线段相交【转】

    下面这个函数在我写的计算几何库函数里面有,那个库可以在http://algorithm.126.com/的资源中心   -   代码角   找到. 算法简单说明: 首先判断以两条线段为对角线的矩形是否 ...

  6. 判断直线与线段 是否相交 + 加入误差 故需要判断重点 poj 3304 Segments

    题目来源:http://poj.org/problem?id=3304 分析: 题目大意:给出n条线段两个端点的坐标,问所有线段投影到一条直线上,如果这些所有投影至少相交于一点就输出Yes!,否则输出 ...

  7. Segments POJ - 3304(判断直线知否经过所有线段)

    Segments POJ - 3304 题意:给n个线段的端点,问你将这些线段都投影到同一条直线上是否所有的线段都有交点. 思路:如果可以有一条直线可以穿过所有的线段的话那么就存在题意中的直线. #i ...

  8. 【POJ - 3304 】Segments(计算几何,思想转化,直线和线段相交)

    题干: Given n segments in the two dimensional space, write a program, which determines if there exists ...

  9. 判断线段相交 + vector. erase迭代指针 的使用 poj 2653 Pick-up sticks

    题目来源:http://poj.org/problem?id=2653 分析: 题意:按顺序给出一些木棍,输出在最上面的木棍标号. 用vector 存储木棍标号, 当前木棍与 vector 中的木棍 ...

最新文章

  1. 10分钟认识RAID磁盘阵列技术!!!
  2. python的数学模块是什么_Python的数学模块Think Python
  3. tree view 後台編寫
  4. 系列文章--oracle简单入门教程
  5. 806. Number of Lines To Write String - LeetCode
  6. linux 网络编程:使用两线程实现socket同时收发数据
  7. Linux系统中使用netcat命令的奇技淫巧
  8. linux数据库定期备份,linux数据库定期备份
  9. 电赛练习之旋转倒立摆
  10. 精心整理|Python爱好者社区历史文章合集(作者篇)--20190925从豆瓣获取
  11. 制作macOS苹果电脑U盘启动盘
  12. windows永久关闭445、3389端口
  13. web border属性
  14. linux匿名邮件,Linux下用mutt给QQ邮箱发匿名邮件
  15. 风云四(FY-4)气象卫星 tif文件解析成txt
  16. 从ccps项目中学习bottle,sqlalchemy,jinja2
  17. Windows/Ubuntu双系统磁盘管理中删除Ubuntu分区后Ubuntu EFI分区无法删除卷解决办法
  18. Power BI 字符串填充一些特定的字符补齐位数
  19. php 短信接口验证码,PHP代码示例_PHP验证码短信接口 | 微米-中国领先的短信彩信接口平台服务商...
  20. SpringBoot入门:项目下载,依赖,启动

热门文章

  1. [bzoj3532][Sdoi2014]Lis
  2. redis学习之——redis.conf配置(基本)文件学习
  3. 树形dp小胖守皇宫(vijosP1144)
  4. vim的tab键设定
  5. struts+swfupload实现批量图片上传(上):swfupload
  6. 用GDAL/OGR去读shapefile
  7. java获取10位随机数_Java基础:JAVA中BitSet使用详解
  8. JAVA程序员面试题集合
  9. excel实战应用案例100讲(六)-社会判断理论:模型及应用
  10. abd.exe 需要下java吗_Abd.exe文件下载|