判断两条线段是否相交

根据这个性质可以判断点p2是在线段的左边还是右边,这是判断两条线段是否相交的一个重要性质。

这是判断两条线段相交的一种情况,一条线段的端点在另一条线段上。

这是判断两条线段是否相交的原理。

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cmath>
 4 using namespace std;
 5
 6 struct point {
 7     double x, y;
 8 };
 9
10 bool segmentsIntersect(point p1, point p2, point p3,point p4) {
11     double d1 = direction(p1, p2, p3);
12     double d2 = direction(p1, p2, p4);
13     double d3 = direction(p3, p4, p1);
14     double d4 = direction(p3, p4, p2);
15
16     if (d1 > 0 && d2 < 0 || d1 < 0 || d2>0 || d3>0 && d4 < 0 || d3 < 0 && d4>0)
17         return true;
18     if (fabs(d1) <= 1e-9 && onSegment(p1, p2, p3)) return true;
19     if (fabs(d2) <= 1e-9 && onSegment(p1, p2, p4)) return true;
20     if (fabs(d3) <= 1e-9 && onSegment(p3, p4, p1)) return true;
21     if (fabs(d4) <= 1e-9 && onSegment(p3, p4, p2)) return true;
22     return false;
23 }
24
25 //这是判断p3是在线段p1p2的哪一侧
26 double direction(point p1, point p2, point p3) {
27     return (p2.x - p1.x)*(p3.y - p2.y) - (p3.x - p2.x)*(p2.y - p1.y);
28 }
29
30 //这是判断点p3是否在以p1p2为对角线的矩形内
31 bool onSegment(point p1, point p2, point p3) {
32     if (p3.x >= min(p1.x, p2.x) && p3.x <= max(p1.x, p2.x) &&
33         p3.y >= min(p1.y, p2.y) && p3.y <= max(p1.y, p2.y))
34         return true;
35     return false;
36 }

下面还有一种详情可以看算法导论的几何篇

这个方法略懂。

时间: 2024-10-29 19:10:32

判断两条线段是否相交的相关文章

判断两条线段是否相交。。

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 check(point a,point b,point c,point d) //a,b是第一条线段的两端点.c,d是第二条线段的两端点. { if(max(a.x,b.x)<min(c.x,d.x)) return false; if(max(a.y,b.y)<min(c.y,d.y)) return fa

判断两条线是否相交

判断两线段是否相交: 我们分两步确定两条线段是否相交: (1)快速排斥试验 设以线段 P1P2 为对角线的矩形为R, 设以线段 Q1Q2 为对角线的矩形为T,如果R和T不相交,显然两线段不会相交. (2)跨立试验 如果两线段相交,则两线段必然相互跨立对方.若P1P2跨立Q1Q2 ,则矢量 ( P1 - Q1 ) 和( P2 - Q1 )位于矢量( Q2 - Q1 ) 的两侧,即( P1 - Q1 ) × ( Q2 - Q1 ) * ( P2 - Q1 ) × ( Q2 - Q1 ) < 0.上式

求两条线段交点zz

"求线段交点"是一种非常基础的几何计算, 在很多游戏中都会被使用到. 下面我就现学现卖的把最近才学会的一些"求线段交点"的算法说一说, 希望对大家有所帮助. 本文讲的内容都很初级, 主要是面向和我一样的初学者, 所以请各位算法帝们轻拍啊 嘎嘎 引用 已知线段1(a,b) 和线段2(c,d) ,其中a b c d为端点, 求线段交点p .(平行或共线视作不相交) =============================== 算法一: 求两条线段所在直线的交点, 再判

判断线段和直线相交 POJ 3304

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 #inclu

如何判断单链表是否存在环 &amp; 判断两链表是否相交

给定一个单链表,只给出头指针h: 1.如何判断是否存在环? 2.如何知道环的长度? 3.如何找出环的连接点在哪里? 4.带环链表的长度是多少? 解法: 1.对于问题1,使用追赶的方法,设定两个指针slow.fast,从头指针开始,每次分别前进1步.2步.如存在环,则两者相遇:如不存在环,fast遇到NULL退出. 2.对于问题2,记录下问题1的碰撞点p,slow.fast从该点开始,再次碰撞所走过的操作数就是环的长度s. 3.问题3:有定理:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分

判断两矩形是否相交

转自Avril,略有改动 Problem: 给定两个边与坐标轴平行的矩形,分别由左上角与右下角两点指定,判断两矩形是否相交. Solution: 如下图所示,首先求出$P_1$与$P_3$点(即坐标值较小的两点)在$X$方向较大值与$Y$方向较大值构成的点,在下图中就是$P_3$,用红点(记为M点)表示. 然后求出$P_2$与$P_4$点(即坐标值较小的两点)在X方向较小值与Y方向较小值构成的点,在下图中就是$P_2$,用橙色点(记为N点)表示. 如果M点的X坐标和Y坐标值均比N点相应的X坐标和

判断两线段是否相交

今日集训第一日,遇到了判断线段相交问题.跟面积问题一样,这个同样可以用叉积来解决. 数学原理证明: 首先引出计算几何学中一个最基本的问题:如何判断向量在的顺时针方向还是逆时针方向? 把p0定为原点,p1的坐标是(x1,y1),p2的坐标是(x2,y2).向量的叉积(cross product)实际上就是矩阵的行列式: 代码实现: 1 int direction(Point p0, Point p1, Point p2) { 2 int px02 = p2.x - p0.x; 3 int py02

JVM-如何判断一段数据是真正的数据,还是对象的引用

JVM 判断一段数据到底是数据还是引用类型,首先要看JVM选择用什么方式.通常这个选择会影响到GC的实现. 一.保守式 如果JVM选择不记录任何这种类型的数据,那么它就无法区分内存里某个位置上的数据到底应该解读为引用类型还是整型还是别的什么.这种条件下,实现出来的GC就会是“保守式GC(conservative GC)”. 在进行GC的时候,JVM开始从一些已知位置(例如说JVM栈)开始扫描内存,扫描的时候每看到一个数字就看看它“像不像是一个指向GC堆中的指针”.这 里会涉及上下边界检查(GC堆

&lt;笔试&gt;&lt;面试&gt;C/C++单链表相关(4)判断两链表是否相交,求交点(链表不带环/可能带环)

判断两链表是否相交,求交点(假设链表不带环) 判断两链表是否相交,求交点(假设链表可能带环) RingEntry_Point()等函数见前篇. SListNode* Intersect(SListNode *&L, SListNode *&M)//判断两链表是否相交,求交点(假设链表不带环) {  //思路:若不带环,只有相交/不想交两种情况  // 与RingEntry_Point()函数方法相同:  //     求两个链表长度之差K,再令一个指针从长链表开始先走K步,令另一个指针从短