缘起 本文从最基本的线段相交问题出发,从解析几何进入计算几何,介绍点积和叉积这个最基本的计算几何工具,引入计算几何这个关于位置和方向的大航海世界~ 分析 本文要讲清楚的两个基本问题是: 如何判断线段相交...进一步地,如果存在唯一交点,试求出相交的交点坐标 判断线段相交 考虑以下基本问题: 判断平面上两条线段是否相交 输入:4个点,分别表示第一条线段的两个端点和第二条线段的两个端点....回到本题,学习过大学解析几何(或者高中立体几何)的我们,立马就想到了写出直线方程,联立求解即可知道是否相交. 但是这种做法有诸多弊端. 至少有以下两点 情形繁多,尤其是特殊情形....类似的,C、D跨立在直线 AB 两侧的充要条件是 上面两个不等式被形象的称为跨立实验(cross test) 跨立实验能帮助我们知道两条线段是否规范相交,那么非规范相交怎么处理呢?...于是我们就知道了,每次只需要枚举一个管道的上顶点和枚举一个管道的下顶点,这样就将光线确定下来了. 然后再去验证这条直线是否和线段 相交.
分成两步来判断: 判断线段的两个端点是否在矩形内,如果两个端点至少有一个在矩形内,说明线段与矩形相交。 如果两个端点都不在矩形内,那么需要再判断线段是否与矩形的对角线是否相交。...判断点在矩形内非常简单,就是比较点是否在矩形的四至范围就可以了;而判断线段相交可以参考《空间或平面判断两线段相交(求交点)》这篇文章。 2....startPoint = start; endPoint = end; direction = end - start; } //两条线段相交...= line1.startPoint + line1.direction * t1; //这样计算得到的Z值是不准确的 return true; } //线段与矩形相交...参考 如何判断一条线段和一个矩形或者圆相交? - 叶飞影的回答 - 知乎
二、目录 本文整理的计算几何基本概念和常用算法包括如下内容: 矢量的概念 矢量加减法 矢量叉积 折线段的拐向判断 判断点是否在线段上 判断两线段是否相交 判断线段和直线是否相交 判断矩形是否包含点...计算两条共线的线段的交点 计算线段或直线与线段的交点 求线段或直线与折线、矩形、多边形的交点 求线段或直线与圆的交点 凸包的概念 凸包的求法 三、算法介绍 矢量的概念: 如果一条线段的端点是有次序之分的...判断两线段是否相交: 我们分两步确定两条线段是否相交: (1)快速排斥试验 设以线段 P1P2 为对角线的矩形为R, 设以线段 Q1Q2 为对角线的矩形为T,如果R和T不相交,显然两线段不会相交...另外,一开始就先利用矢量叉乘判断线段与线段(或直线)是否相交,如果结果是相交,那么在后面就可以将线段全部看作直线来考虑。...求线段或直线与折线、矩形、多边形的交点: 分别求与每条边的交点即可。 求线段或直线与圆的交点: 设圆心为O,圆半径为r,直线(或线段)L上的两点为P1,P2。 1.
同侧法 这种算法的思想是:如果两条线段相交,那么一条线段的两端点必然位于另一条线段的两端点的异侧。那么问题就可以转换成点是否在一条线段的同侧。...同侧判断可以通过向量叉乘的方法来实现,即判断最后叉乘的方向是否相同。 这个算法与平面中判断点在三角形内算法这篇文章介绍的同侧/异侧判断是一样的,我认为算是比较优秀快速的算法了。...这个方程就是线段上某一点的向量方程。...startPoint.y(), endPoint.y()); max.z() = std::max(startPoint.z(), endPoint.z()); } //两条线段相交...参考 计算几何-判断线段是否相交 详细代码
射线法涉及以下三个问题: 如何获取多边形的各条边的端坐标? 如果多边形的某条边是曲线怎么办? 如何判断两条线段有交点? 如何获取多边形的各条边的端坐标?...所以WebGL中的任何图形本质上都是多边形,既然是多边形就可以按照上文的方案解决点与多边形的相对位置判断问题。 如何判断两条线段有交点?...明确了上面两个问题之后,就只剩下判断两条线段是否相交这一个问题了。这同样是个纯粹的数学问题。...回顾上文提到的多边形顶点数据制备,多边形的边是由相邻两个顶点相连而成,顶点是有序的,也就是说多边形的每条边都是有向线段,所以判断两条线段是否相交这个问题准确的说发应该是:判断两个有模向量是否相交。...判断两条线段是否相交用到了上述的规则2-4。先看下面这张图: 如果线段AB和CD相交可以推导出以下规则: 点A和点B分别位于线段CD的两侧; 点C和点D分别位于线段AB的两侧。
/*****************判断两点p1,p2确定的线段是否与bbox构成的矩形相交的算法*******************/ defun(isLineIntersectRectangle...else res=nil ) res=res ) ) x=isLineIntersectRectangle(-5:0 105:100 list(0:0 100:100));x=t,相交...x=isLineIntersectRectangle(-5:0 -5:100 list(0:0 100:100));x=nil,不相交 x=isLineIntersectRectangle(0:0 100...:100 list(0:0 100:100));x=t,相交
给定m对木棍(ai,bi)(a_i, b_i),请判断每对木棍是否相连。当两根木棍之间有公共点时,就认为它们是相连的。通过相连的木棍间接的连在一起的两根木棍也认为是相连的。...思路: 因为边和边是否相连就看交点是否在线段内,可以把每条线段想象成图中的顶点,只要有交点,就认为可达,最后判断任意两条线段是否相交,只需要判断它们是否可达。...所以问题就转换成了线段与线段相交的判断。分为两种情况: 边平行,需要判断任何一条线段的两个顶点是否在另一条线段上。 非平行边,求出两条线段的交点,判断交点是否分别在这两条线段内。 ?...求外积,其实是求三点是否能够构成三角形,如果三角形的面积为0,说明三点共线。内积判断点是否在线段内,是因为如果向量夹角超过90度,内积为负。而点在线段内,向量的夹角一定为180度。...[i], p[j], q[j]); map[i][j] = map[j][i] = onSeg(p[i], q[i], r) && onSeg(p[j],
如何判断两条线段(注意不是直线)是否有交点? 传统几何算法的局限 上过一点学的西瓜哥我,只用高中学过的知识,还是可以解这个问题的。...一条线段两个点,可以列出一个两点式(x - x1) / (x2 - x1) = (y - y1) / (y2 - y1)),两条线段是两个两点式,这样就是 二元一次方程组 了 ,就能求出两条直线的交点。...然后判断这个点是否在其中一条线段上。如果在,说明两线段相交,否则不相交。 看起来不错,但这里要考虑直线垂直或水平于坐标轴的特殊情况,还有两条直线平行导致没有唯一解的情况,除数不能为 0 的情况。...我们可以换另一个角度去解,即判断线段 1 的两个端点是否在线段 2 的两边,然后再反过来比线段 2 的两点是否线段 1 的两边。 这里我们可以利用上面 叉乘的正负代表旋转方向的特性。...(seg3, seg4)); // true 结尾 总结一下,判断两条线段是否相交,可以判断两条线段的两端点是否分别在各自的两侧,对应地需要用到二维向量叉乘结果的正负值代表向量旋转方向的特性。
如图所示,本文介绍如何判断一个物体是否被一个凸边体区域所囊括,本文将该功能的实现拆分成了如下步骤: 1.如何判断两条线段是否相交 2.如何判断一个点是否在一个凸边形范围内(2D、xz轴构成的平面)...3.如何判断一个点是否在一个凸边体范围内(3D) 4.如何判断一个物体是否在一个凸边体范围内 依次实现: 1.如何判断两条线段是否相交: 通过矢量叉积的符号可以判断两矢量相互之间的顺逆时针关系,如下图所示...,点A和点B分别在线段CD两侧,点C和点D分别在线段AB两侧,这时可以判断它们相交。...同样的,判断点C和点B是否在线段AB的两侧:(D-A)X(B-A)*(C-A)X(B-A)< 0,以上这两个条件成立时,可判断两线段相交。...当然,出现以下这种情况,即(A-D)X(C-D)*(B-D)X(C-D)= 0时,两条线段也是相交的: 在Unity中封装该判断函数: //判断AB与CD是否相交 private bool IsIntersection
CogIntersectCircleCircleTool 功能:检测两圆是否相交 CogIntersectLineCircleTool 功能:检测线与圆是否相交 CogIntersectLineEllipseTool...功能:检测线与椭圆是否相交 CogIntersectLineLineTool 功能:检测线与线是否相交 CogIntersectSegmentCircleTool 功能:检测线段与是否相交...CogIntersectSegmentEllipseTool 功能:检测线段与椭圆是否相交 CogIntersectSegmentLineTool 功能:检测线段与线是否相交 CogIntersectSegmentSegmentTool...功能:检测线段与线段是否相交 8、 Geometry - Measurement ?...CogAngleLineLineTool 功能:两条直线的夹角 CogAnglePointPointTool 功能:由两点组成的线段的角度 CogDistanceCircleCircleTool
判断线段相交可以用到之前讲的判断点与线段的位置关系的来实现。 两条线段相交的充要条件是: 两条线段都满足“另一条线段的两个端点分别位于当前线段的顺时针方向和逆时针方向”,那么这两条线段相交。...const //叉乘 { return x * p.y - y * p.x; } double operator*(const Point &p) const //点乘...(*this).p1 = p1; (*this).p2 = p2; } }; int ccw(Point p0, Point p1, Point p2) //判断p2与线段...else return ON_SEGMENT; } } } bool intersect(Line l1, Line l2) //判断线段是否相交...//如果两条线段都符合“另一条线段的两个端点分别位于当前线段的顺时针和逆时针方向”,那么两条线段相交 { return (ccw(l1.p1, l1.p2, l2.p1) * ccw(l1.p1
考虑到图像坐标空间中的另一个点(xj,yj),它在参数空间中也有相应的一条直线,表示为: · b = -xja + yj (3) 这条直线与点(xi,yi)在参数空间的直线相交于一点在参数空间的直线相交与于一点...反之,在参数空间相交于同一点的所有直线,在图像坐标空间都有共线的点与之对应。根据这个特性,给定图像坐标空间的一些边缘点,就可以通过Hough变换确定连接这些点的直线方程。...与直角坐标不同的是,用极坐标表示时,图像坐标空间的共线的两点(xi,yi)和(xj,yj)映射到参数空间是两条正弦曲线,相交于点(ρ0 ,θ0),如上图所示。...默认值为20.θ和ρ θ和ρ)的两条线段之间的距离小于 FillGap,则合并为一个直线段。默认值为20....《数字图像处理与机器视觉-Visual C++与Mat lab实现 (第2版)》 第12章 图像分割 Page409 2.《数字图像处理(第三版)》
方案 1:线段相交判断 直接一点,判断 selection 的边和图形的边是否有相交的。...为此我写了一篇判断两条线段是否相交的文章: 《几何算法:判断两条线段是否相交》 核心算法实现为: type Point = [number, number]; function crossProduct...当发现投影产生的两条线段没有相交,那找到了那条那条分割两图形的直线,证明两个凸多边形不相交。 否则继续,如果都没找到,说明相交。 下图是以一个图形的蓝边的法向量作为分离轴,进行投影的示意图。...矩形碰撞,特殊的分离轴定理碰撞 不知道你发现没有,从分离轴线的角度去看,两个没有旋转矩形的相交判断,其实是一个特例。...---- 相关阅读, 几何算法:判断两条线段是否相交 图形编辑器开发:颜色 hex 标准化 图形编辑器开发:一些会用到的简单几何算法 几何算法:矩形碰撞和包含检测算法 在容器内显示图片的五种方案
在三维空间中,两条相交的直线可以确定这样一个平面。因此,我们从立体左、右图像中提取直线段。通过立体匹配,计算出三维空间中的端点和直线方向,进而计算出平面。...然而,对于平行线,很难判断它们是否是从同一个真实平面提取的,因此由它们计算的平面容易带来较大的误差。因此,只计算相交线的平面。...为了快速检查相交线,发现满足以下条件的直线: •两条直线之间的角度大于阈值(在实验中为10°) •它们的中心点之间的距离小于直线长度。 • 这两条直线的四个端点位于同一平面上。...面与面之间的距离为 ? 如果D小于阈值(在实验中为5cm),这两条线满足第三个条件,并且计算了平面系数pi,这里是d_k的算术平均值。有时计算的平面可能不是场景中的真实平面,例如门框线的平面。...从实验结果来看,我们的系统明显优于目前最先进的基于特征点的SLAM系统。与基于线的SLAM系统相比,我们的系统也得到了可比的结果。平面计算滤除了这些不精确的线段,并添加了稳定的约束来估计摄像机的姿态。
两线段相交,且不遮盖的情况下才可能装到水。 求出交点,再取两线段的较高端点的较小值h,(h-交点的y)为三角形的高。 三角形的宽即为(h带入两条线段所在直线得到的横坐标的差值)。...坑点:如果用G++提交,ans要加上eps才能过,c++提交则没问题。...xmult(P a,P b,P o){//叉积 return (a.x-o.x)*(b.y-o.y)-(b.x-o.x)*(a.y-o.y); } bool isCross(L a,L b){//是否相交...b.s.x)/(kb-ka); c.y=(c.x-a.s.x)*ka+a.s.y; } return c; } dd getx(L a,dd y){//a所在直线上纵坐标为y的点的...a.e.y)return a.s.x; return (y-a.s.y)*(a.s.x-a.e.x)/(a.s.y-a.e.y)+a.s.x; } bool shadow(L a,L b){//是否遮盖
题目链接:http://codeforces.com/contest/1132/problem/C 题意是有n个点,m条线段,问用m-2条线段最多可以覆盖多少个点。 ...思路就是暴力枚举,但是虽然数据范围不大,但是太暴力也还是过不了的,所以我们可以用前缀和去优化把查询的操作变成O(1)的查询,我们首先记录一下这n个点有多少个点被覆盖了(变量为tot),然后m^2去枚举要删除的两个线段...,对于我们枚举的这两个要删除的线段,会有两种情况,要么相交要么不相交(还有包含的情况),所以我们只需要查询出有多少个点是只被这两条线段覆盖的点。...然后tot减去这些点就是删除这两条线段后被覆盖的点的个数了。...对于查询的操作我们用前缀和来优化,我们首先用差分求出每个点被覆盖的次数,然后我们用两个数组分别记录只被覆盖了1次和2次的点的前缀和,那么我们在之后的查询就是O(1)的时间复杂度了,不理解的可以看看呆码。
今天来实现计算两条线段的交点的解析几何算法。 我们要实现 getLineSegIntersection 方法:提供两条线段,计算它们的交点。 每条线段会用两个点坐标表示。...变体1:两线段是否有交点。 返回值换成布尔值即可。 判断两线段是否有交点,我之前还写了另一种解法,感兴趣可以看看: 《几何算法:判断两条线段是否相交》 变体2:计算两直线的交点。...把判断直线交点是否在线段上的逻辑去掉,然后直接返回点坐标即可。 优化点 1、重叠但却只有一个交点的情况。...如果线段平行,有两种情况: 没有重叠(0 个解) 有部分重叠(多解) 如果部分重叠,可能有多个点,多个点的情况下也不知道拿哪个点作为交点好,这种情况下还是返回 null。...结尾 总结一下,求两线段的交点,本质就是解方程,需要用到克莱姆法则,计算出来的交点是直线交点,不一定是线段交点,需要再判断点是否在线段范围内。 不复杂,就是有一点点小细节。
第一条曲线的第二个控制点(标记为“control 1b”)和第二条曲线的第一个控制点(标记为“control 2a”)与连接两条Bezier曲线的点共线。...那么如何定义控制点呢?看看右边的图片,它显示了三条连接点A、B、C和D的贝塞尔曲线。现在关注蓝色曲线。它需要两个控制点,一个在B点之后,一个在C点之前。...为了找到数据点B附近的控制点,我们查看由点B的两个相邻点A和C定义的线段。红色虚线段将这些点连接起来。现在我们从点B沿着线段的方向移动。绿色虚线段表示平移后的红色线段,它与点B相交。...我们沿着这段线段移动来放置控制点的距离取决于曲线的张力。当您查看代码时,您将看到它是如何工作的。 请注意,您使用同一段来定义特定数据点两侧的控制点。...在图中,你使用相同的绿色虚线段来定义点B之前和之后的控制点。因为这些控制点在与点B相交的一条线上,点B两边的两条Bezier曲线将会平滑地相交。
前序 由于业务需要,我学习了判断点与点、点与线、线与线的关系的算法、理论,这里汇总下,主要内容有: 点与点的关系 点与线的关系 线与线的关系 点与点 点与点关系相对最简单,使用勾股定理即可: 这是怎样计算两个已知坐标点之间的距离...线与线的关系 常用问题: 线与线是否相交?...判断两条线段是否相交有两步: ①快速排斥计算 ②跨立计算 快速排斥 给出线条AB、CD,如果以AB、CD为对角线的矩形不相交,那么AB、CD也必不可能相交;如果矩形相交,那么需要再通过跨立计算进行判断。...跨立计算: 首先,这里需要用到向量叉乘的算法:其中AB与CD是三维空间上的向量,与xOy平面平行。 其次,如下图。AB与CD相交必然有A、B在线段CD两边,C、D在线段AB两边。...struct { X float64 Y float64 } type Segment struct { A Point B Point } // IsSegmentsIntersect 2个线段是否相交
下面就来看看,这两组看似无关的公理,是如何影响到两个点线定理的。 1....以下我们只用到笛沙格定理的简单情况,如下图该定理描述为:两个不共点不共线的三角形,如果三条边分别平行,则对应点连线交于一点;反之,如果对应点连线交于一点,且有两条边分别平行,则第三条边也平行。 ...具体来说,先选择两条相交于OO的直线做“坐标轴”(以下左图),以下只讨论坐标轴上以OO为端点的线段的计算。然后再选定某个方向的平行线簇,它们在两轴上截得的线段被视为“相等”的。...对于线段a,ba,b,把它们放到不同的轴上(本段论述与教材不同),分别引出两轴的平行线并交于点AA(以上右图)。从AA作单位直线的平行线,截两轴得到的线段定义为a+ba+b,加法天然是满足交换律的。...由此我们知道,帕斯卡定理比笛沙格定理更强,可以把满足I,II,IV∗I,II,IV∗和帕斯卡定理的几何定义为帕斯卡几何。
领取专属 10元无门槛券
手把手带您无忧上云