题意:给出一些线段,问有多少个交点。

解题思路:这里实际就是一个线段相交的模型,下面这个图给出了思路。

如果两线段相交,则两线段必然相互跨立对方。若P1P2跨立Q1Q2 ,则矢量 ( P1 - Q1 ) 和( P2 - Q1 )位于矢量( Q2 - Q1 ) 的两侧,即( P1 - Q1 ) × ( Q2 - Q1 ) * ( P2 - Q1 ) × ( Q2 - Q1 ) < 0。上式可改写成( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) > 0。当 ( P1 - Q1 ) × ( Q2 - Q1 ) = 0 时,说明 ( P1 - Q1 ) 和 ( Q2 - Q1 )共线,但是因为已经通过快速排斥试验,所以 P1 一定在线段 Q1Q2上;同理,( Q2 - Q1 ) ×(P2 - Q1 ) = 0 说明 P2 一定在线段 Q1Q2上。所以判断P1P2跨立Q1Q2的依据是:( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) >= 0。同理判断Q1Q2跨立P1P2的依据是:( Q1 - P1 ) × ( P2 - P1 ) * ( P2 - P1 ) × ( Q2 - P1 ) >= 0。具体情况如下图所示:

在实际写的时候并没有先去判断快速排斥实验,而是直接使用跨立实验。注意,这里跨立实验要判断两次, 不仅P1P2一次,Q1Q2也要一次。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;const int maxn = 105;
struct Segment
{double x1,x2,y1,y2;
}s[maxn];
int n;bool Segment_Intersection(int i,int j)
{double s1 = (s[i].x1 - s[j].x1) * (s[i].y1 - s[i].y2) - (s[i].x1 - s[i].x2) * (s[i].y1 - s[j].y1);double s2 = (s[i].x1 - s[j].x2) * (s[i].y1 - s[i].y2) - (s[i].x1 - s[i].x2) * (s[i].y1 - s[j].y2);if(s1 * s2 > 0) return false;double s3 = (s[j].x1 - s[i].x1) * (s[j].y1 - s[j].y2) - (s[j].x1 - s[j].x2) * (s[j].y1 - s[i].y1);double s4 = (s[j].x1 - s[i].x2) * (s[j].y1 - s[j].y2) - (s[j].x1 - s[j].x2) * (s[j].y1 - s[i].y2);if(s3 * s4 > 0) return false;return true;
}int main()
{while(scanf("%d",&n)!=EOF){if(n == 0) break;for(int i = 1; i <= n; i++)scanf("%lf%lf%lf%lf",&s[i].x1,&s[i].y1,&s[i].x2,&s[i].y2);int ans = 0;for(int i = 1; i < n; i++)for(int j = i + 1; j <= n; j++)if(Segment_Intersection(i,j))ans++;printf("%d\n",ans);}return 0;
}

hdu 1086(判断两线段是否相交)相关推荐

  1. python判断两线段是否相交_c语言 判断两直线段是否相交

    转了多人的放到一起比较!! //功能:求点在有向直线左边还是右边 //返回:0共线.1左边.-1右边 intleft_right(pointa,pointb,doublex,doubley) { do ...

  2. [GIS算法] 判断两线段是否相交的四种方案(快速排斥+跨立实验、参数方程求解、凸多边形、点在线的哪一侧)-附C语言实现

    文章目录 算法一:快速排斥+跨立试验 代码 算法二:参数方程求解 代码 算法三:凸多边形 算法四:点在线的哪一侧 算法一:快速排斥+跨立试验 重点掌握 [原理]利用矢量的叉乘 [图解] 代码 #def ...

  3. 判断两线段是否相交——快速排斥与跨立实验

    如何判断两条线段是否相交呢?如果是我们去解决这个问题,用眼睛很容易就看出来了,但是如果用计算机来解决这个问题,该怎么办呢?下面介绍两个方法,这两个方法结合起来就能完美解决这个问题了. 一.快速排斥 对 ...

  4. java判断两线段是否相交

    首先推荐java的Line2D类自带方法linesIntersect java.awt.geom.Line2D.linesIntersect(x1, y1, x2, y2, x3, y3, x4, y ...

  5. 判断两线段是否相交,并求交点

    首先, 上个示意图. 根据图示, 线段a表示为端点a1和a2, 线段b表示为端点b1和b2. 为了利用向量的叉乘关系, 将线段的端点看成四个向量, 下面用粗体表示向量. 根据向量运算可知 a=a2-a ...

  6. nyoj1016德莱联盟【判断两线段是否相交】

    德莱联盟 时间限制:1000ms  |  内存限制:65535KB 难度:1 描述 欢迎来到德莱联盟.... 德莱文... 德莱文在逃跑,卡兹克在追.... 我们知道德莱文的起点和终点坐标,我们也知道 ...

  7. 判断三维空间两线段是否相交(附代码)

    文章目录 一.推导过程 二.MATLAB代码   博文: 计算几何--判断两线段是否相交,提供了判断两线段是否相交的方法以及代码.然而,只是考虑了平面的情况.本博文提供一种简单有效的方法判断三维空间两 ...

  8. python 求两线段是否相交,如果相交求交点

    代码如下,cal_point = False 不输出交点,cal_point = True 输出交点 def cross(p1,p2,p3):#跨立实验     x1=p2.x-p1.x     y1 ...

  9. 快速排斥实验amp;跨立实验 判断两直线是否相交

    两条线段有且仅有一个公共点,且这个点不是任何一条线段的端点时,称这两条线段是严格相交的. 也就是说线段不严格相交时可以将端点作为交点,但本文不讨论不严格相交,只讨论严格相交的情况(即使它们在算法实现上 ...

最新文章

  1. Java项目:精品养老院管理系统(java+Springboot+Maven+mybatis+Vue+Mysql)
  2. C语言do...while语句的妙用(包裹宏替换多句代码)(代替go to语法)(隔绝外部变量)
  3. RabbitMQ高级指南:从配置、使用到高可用集群搭建
  4. nssl1335-蛋糕切割【数论,GCD】
  5. 什么是PermGen泄漏?
  6. windows服务器迁到_Windows Server 2008 R2 DNS 服务器迁移方法
  7. 基于 .Net5.0 的快速开发框架,YuebonCore1.0.3 版已发布
  8. C#语言学习--基础部分(十三)枚举类型和结构体
  9. vector public member function
  10. 手机充当电脑摄像头:无他相机和DroidCam
  11. 临床试验数据管理系统
  12. 32.768khz晶振应该接多大的电容
  13. python绘制ROC曲线图,并计算面积
  14. 云知声 Atlas 超算平台:基于 Fluid + Alluxio 的计算加速实践
  15. 【OpenGL ES】着色语言GLSL
  16. Java中submit的方法,线程池中 submit()和 execute()方法区别
  17. 业务中台--企业流程优化
  18. 万字拆解江小白:新品牌做白酒,敢问路在何方?
  19. jenkins api使用_使用管理API和Jenkins作为IBM App Connect Professional部署自动化的持续集成引擎
  20. 对炒股的一点个人浅见

热门文章

  1. 2022 年营销自动化七大趋势前瞻
  2. 几款xshell绝佳配色方案
  3. 人们对大数据的几点误解
  4. linq之join子句
  5. Ceph的架构(一)
  6. Ladda – 把加载提示效果集成到按钮中,提升用户体验
  7. 分析外星人计算Pi的程序
  8. iccar conference oral presentation
  9. 21天舞动西浦报名失败的教训:先下手为强
  10. 大四学生对于股票的思考