转自:http://www.cnblogs.com/shengshouzhaixing/archive/2013/03/17/2964950.html

//功能:求点在有向直线左边还是右边  
  //返回:0共线、1左边、-1右边  
  int   left_right(point   a,point   b,double   x,double   y)  
  {  
          double   t;  
          a.x   -=   x;   b.x   -=   x;  
          a.y   -=   y;   b.y   -=   y;  
          t   =   a.x*b.y-a.y*b.x;  
          return   t==0   ?   0   :   t>0?1:-1;  
  }  
   
  //功能:线段c,d和直线a,b是否相交  
  bool   intersect1(point   a,point   b,point   c,point   d)  
  {  
          return   left_right(a,b,c.x,c.y)^left_right(a,b,d.x,d.y)==-2;  
  }  
   
  //功能:判断线段c,d和线段a,b是否相交  
  bool   intersect(point   a,point   b,point   c,point   d)  
  {  
          return   intersect1(a,b,c,d)   &&   intersect(c,d,a,b);  
  }

以上是一位大神的!!

//

判断两线段是否相交:

方法(1):快速排斥(两个MBR是否有交集)+跨立(一个线段的两个端点在另一线段的两端)。

给出C语言代码如下:

/** 由两个点构造一个向量*/
Vector VectorConstruct(Point A, Point B)
{Vector v;v.x = B.x - A.x;v.y = B.y - A.y;return v;
}// 向量的叉积
double CrossProduct(Vector a, Vector b)
{return a.x * b.y - a.y * b.x;
}/** 由两个点构造一个MBR*/
MBR MbrConstruct(Point A, Point B)
{MBR m;if (A.x > B.x){m.xmax = A.x;m.xmin = B.x;}else{m.xmax = B.x;m.xmin = A.x;}if (A.y > B.y){m.ymax = A.y;m.ymin = B.y;}else{m.ymax = B.y;m.ymin = A.y;}return m;
}/** 判断两个MBR是否有交集,有返回1,否0*/
int MbrOverlap(MBR m1, MBR m2)
{double xmin, xmax, ymin, ymax;xmin = Max(m1.xmin, m2.xmin);xmax = Min(m1.xmax, m2.xmax);ymin = Max(m1.ymin, m2.ymin);ymax = Min(m1.ymax, m2.ymax);return (xmax >= xmin && ymax >= ymin) ? 1 : 0;
}/** 判断两线段(线段AB和CD)是否相交,是返回1,否0*  快速排斥+跨立*/
int SegmentIntersection(Point A, Point B, Point C, Point D)
{// (1)判断AB和CD所在的MBR是否相交MBR m1 = MbrConstruct(A, B);MBR m2 = MbrConstruct(C, D);if (MbrOverlap(m1, m2) == 0)return 0;// (2)跨立判断Vector CA = VectorConstruct(C, A);Vector CB = VectorConstruct(C, B);Vector CD = VectorConstruct(C, D);Vector AC = VectorConstruct(A, C);Vector AD = VectorConstruct(A, D);Vector AB = VectorConstruct(A, B);// AB跨立CD,并且,CD跨立ABif (CrossProduct(CD, CA) * CrossProduct(CD, CB) <= 0 && CrossProduct(AC, AB) * CrossProduct(AD, AB) <= 0)return 1;else return 0;
}

方法(2):判断是否为凸多边形。凸多边形的判断是,当从某个点开始绕一周,要么全顺时针拐弯,要么全逆时针。

/** 判断两线段(线段AB和CD)是否相交,是返回1,否0*   判断四边形ACBD是否是一个凸四边形*/
int SegmentIntersection(Point A, Point B, Point C, Point D)
{Vector AC = VectorConstruct(A, C);Vector CB = VectorConstruct(C, B);Vector BD = VectorConstruct(B, D);Vector DA = VectorConstruct(D, A);double c[4];c[0] = CrossProduct(AC, CB);c[1] = CrossProduct(CB, BD);c[2] = CrossProduct(BD, DA);c[3] = CrossProduct(DA, AC);int f1=0, f2=0;  // 计算正数,负数的个数int i;for (i=0; i<4; i++){if (c[i] > 0) f1++;if (c[i] < 0) f2++;}if (f1 > 0 && f2 > 0)    // 有正,有负,返回无交集return 0;elsereturn 1;
}

转载于:https://www.cnblogs.com/qingsunny/p/3447915.html

判断两直线段是否相交相关推荐

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

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

  2. 判断两条线段是否相交 java_判断两个线段是否相交02

    写在前面 在其他博客中看到这方面的知识,很多都是重复,并且说的总是云里雾里的,所以这里我就自己总结一下这种问题如何求解,判断两个线段是否相交在前面我们提到了会用到叉积的一点知识,那么这里就来详细说一下 ...

  3. 判断两个圆柱体是否相交

    问题 看到有人问这个问题.然后我写了解决这个问题的一个有用的理论准备.接下来简单介绍如何使用它判断两个圆柱是否相交. 解法 问题中的圆柱假设有中轴线,lil_i, 用固定点 Xi=(ai,bi,ci) ...

  4. 判断两个形状是否相交(二)-GJK

    判断两个形状是否相交二-GJK 原文地址 一 介绍 二凸多边形性质 三Minkowski和 四单纯形 五支持函数 六创建单纯形 七相交检测 八迭代 然后我们开始循环迭代 第二次迭代 第三次迭代 九检测 ...

  5. 编程之美:编程判断两个链表是否相交

    1.问题描述 给出两个单向链表的头指针,比如h1.h2,判断两个链表是否相交.编程之美为了简化问题,假设两个链表均不带环. 如下图: 2.分析与解法 解法一:直观法,先判断第一个链表的每个节点是否在第 ...

  6. 3.6 判断两个链表是否相交

    判断两个链表是否相交,若相交则求其交点(指第一个相交的点). 思路1,利用计数法: 遍历链表1,将其节点的内存地址存入map或者hashmap内.然后遍历链表2,并查询map或者hashmap,判断链 ...

  7. 判断两个链表是否相交

    方法:获得两个链表的长度,获得长度的差值len,然后首先遍历较长的链表len次,然后再同时遍历两个链表,如果有相同部分,两个链表就相交,如果没有,则不相交,即没有公共部分. 代码: #include ...

  8. ]数据结构:单链表之判断两个链表是否相交及求交点(带环、不带环)

    1.判断两个链表是否相交,若相交,求交点.(假设链表不带环) 两个指针同时指向两个链表,分别依次往后遍历链表到最后一个节点,如指针的值相同(即节点地址相同),反之没有交点. int IsCross(N ...

  9. 判断两个多边形是否相交相交

    // 1 判断相交//判断两多边形线段是否相交function isSegmentsIntersectant(segA, segB) {//线线const abc = (segA[0][0] - se ...

最新文章

  1. 简要说明建设城市大脑三条关键标准规范
  2. [转]Extending the User Interface in Outlook 2010
  3. (三) 类图和对象图
  4. Windows上的音频采集技术
  5. Linux 2.6.32-279.el6.x86_64 ANDROID SDK碰到”LIBC.SO.6: VERSION `GLIBC_2.14′ NOT FOUND”的解决方法(2)
  6. PMP读书笔记(第8章)
  7. ubuntu更改屏幕界面大小和中文
  8. JavaScript,5种调用函数的方法
  9. 英特尔nuc能代替主机吗_拆了拆了!Intel NUC装机!小机箱退烧器啊!主机显示器合体...
  10. php 如何生成txt文件,PHP生成TXT文件
  11. 浅谈互联网寒冬Android进阶之路
  12. NLP 的巨人肩膀(下):从 CoVe 到 BERT
  13. 未来五年,保险平权的最大机会来了
  14. 智能分数计算机在线使用,作业帮智能计算器在线使用
  15. VMware Horizon 8 2209 - 虚拟桌面基础架构 (VDI) 和应用软件
  16. 计算机二级选择题记忆知识点
  17. c++基本输入输出 输出不同精度的PI(程序给出的PI值为 3.14159265358979323846)。
  18. AI数学基础(2)--- 霍夫丁不等式
  19. 华硕服务器系统安装win7系统教程,华硕光盘重装系统win7图文教程
  20. Oracle多列统计信息

热门文章

  1. 伍六七带你学算法 进阶篇-生命游戏
  2. Go 学习笔记(60)— Go 第三方库之 go-redis(初始化 redis、操作 string、操作 list、操作 set、操作 hset)
  3. git原理及常见使用方法
  4. np.percentile()函数超详解 异常值极端值百分位四分位数
  5. BERT的通俗理解 预训练模型 微调
  6. ALD技术,相机去噪,图像传感器
  7. TVM部署和集成Deploy and Integration
  8. 克服汽车摄像头连接挑战
  9. 介绍一下android的事件分发机制
  10. 大数据调度平台Airflow(一):什么是Airflow