首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

位置和方向的世界,计算几何的基本问题

缘起 本文从最基本的线段相交问题出发,从解析几何进入计算几何,介绍积和叉积这个最基本的计算几何工具,引入计算几何这个关于位置和方向的大航海世界~ 分析 本文要讲清楚的两个基本问题是: 如何判断线段相交...进一步地,如果存在唯一交点,试求出相交的交点坐标 判断线段相交 考虑以下基本问题: 判断平面上两条线段是否相交 输入:4个,分别表示第一条线段的两个端点和第二条线段的两个端点....回到本题,学习过大学解析几何(或者高中立体几何)的我们,立马就想到了写出直线方程,联立求解即可知道是否相交. 但是这种做法有诸多弊端. 至少有以下两 情形繁多,尤其是特殊情形....类似的,C、D跨立在直线 AB 两侧的充要条件是 上面两个不等式被形象的称为跨立实验(cross test) 跨立实验能帮助我们知道两条线段是否规范相交,那么非规范相交怎么处理呢?...于是我们就知道了,每次只需要枚举一个管道的上顶点和枚举一个管道的下顶点,这样就将光线确定下来了. 然后再去验证这条直线是否线段 相交.

86210

平面中判断线段矩形是否相交

分成两步来判断: 判断线段的两个端点是否在矩形内,如果两个端点至少有一个在矩形内,说明线段矩形相交。 如果两个端点都不在矩形内,那么需要再判断线段是否矩形的对角线是否相交。...判断点在矩形内非常简单,就是比较是否在矩形的四至范围就可以了;而判断线段相交可以参考《空间或平面判断两线段相交(求交点)》这篇文章。 2....startPoint = start; endPoint = end; direction = end - start; } //两条线段相交...= line1.startPoint + line1.direction * t1; //这样计算得到的Z值是不准确的 return true; } //线段矩形相交...参考 如何判断一条线段和一个矩形或者圆相交? - 叶飞影的回答 - 知乎

2.9K20
您找到你想要的搜索结果了吗?
是的
没有找到

计算几何算法概览

二、目录   本文整理的计算几何基本概念和常用算法包括如下内容: 矢量的概念 矢量加减法 矢量叉积 折线段的拐向判断 判断点是否线段上 判断两线段是否相交 判断线段和直线是否相交 判断矩形是否包含...计算两条共线的线段的交点 计算线段或直线线段的交点 求线段或直线折线、矩形、多边形的交点 求线段或直线圆的交点 凸包的概念 凸包的求法 三、算法介绍   矢量的概念:   如果一条线段的端点是有次序之分的...判断两线段是否相交:   我们分两步确定两条线段是否相交:   (1)快速排斥试验     设以线段 P1P2 为对角线的矩形为R, 设以线段 Q1Q2 为对角线的矩形为T,如果R和T不相交,显然两线段不会相交...另外,一开始就先利用矢量叉乘判断线段线段(或直线)是否相交,如果结果是相交,那么在后面就可以将线段全部看作直线来考虑。...求线段或直线折线、矩形、多边形的交点:   分别求每条边的交点即可。   求线段或直线圆的交点:   设圆心为O,圆半径为r,直线(或线段)L上的两为P1,P2。   1.

1.5K40

hover 背后的数学和图形学

射线法涉及以下三个问题: 如何获取多边形的各条边的端坐标? 如果多边形的某条边是曲线怎么办? 如何判断两条线段有交点? 如何获取多边形的各条边的端坐标?...所以WebGL中的任何图形本质上都是多边形,既然是多边形就可以按照上文的方案解决多边形的相对位置判断问题。 如何判断两条线段有交点?...明确了上面两个问题之后,就只剩下判断两条线段是否相交这一个问题了。这同样是个纯粹的数学问题。...回顾上文提到的多边形顶点数据制备,多边形的边是由相邻两个顶点相连而成,顶点是有序的,也就是说多边形的每条边都是有向线段,所以判断两条线段是否相交这个问题准确的说发应该是:判断两个有模向量是否相交。...判断两条线段是否相交用到了上述的规则2-4。先看下面这张图: 如果线段AB和CD相交可以推导出以下规则: A和B分别位于线段CD的两侧; C和D分别位于线段AB的两侧。

1.3K10

挑战程序竞赛系列(83):3.6计算几何基础

给定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],

62650

几何算法:判断两条线段是否相交

如何判断两条线段(注意不是直线)是否有交点? 传统几何算法的局限 上过一学的西瓜哥我,只用高中学过的知识,还是可以解这个问题的。...一条线段两个,可以列出一个两式(x - x1) / (x2 - x1) = (y - y1) / (y2 - y1)),两条线段是两个两式,这样就是 二元一次方程组 了 ,就能求出两条直线的交点。...然后判断这个是否在其中一条线段上。如果在,说明两线段相交,否则不相交。 看起来不错,但这里要考虑直线垂直或水平于坐标轴的特殊情况,还有两条直线平行导致没有唯一解的情况,除数不能为 0 的情况。...我们可以换另一个角度去解,即判断线段 1 的两个端点是否线段 2 的两边,然后再反过来比线段 2 的两是否线段 1 的两边。 这里我们可以利用上面 叉乘的正负代表旋转方向的特性。...(seg3, seg4)); // true 结尾 总结一下,判断两条线段是否相交,可以判断两条线段的两端点是否分别在各自的两侧,对应地需要用到二维向量叉乘结果的正负值代表向量旋转方向的特性。

46330

Unity【Bounds & Vector3 Cross】- 如何判断一个物体是否在一个凸边体三维区域内

如图所示,本文介绍如何判断一个物体是否被一个凸边体区域所囊括,本文将该功能的实现拆分成了如下步骤: 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中封装该判断函数: //判断ABCD是否相交 private bool IsIntersection

1K30

计算几何之判断线段相交

判断线段相交可以用到之前讲的判断点线段的位置关系的来实现。 两条线段相交的充要条件是: 两条线段都满足“另一条线段的两个端点分别位于当前线段的顺时针方向和逆时针方向”,那么这两条线段相交。...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

43030

霍夫变换

考虑到图像坐标空间中的另一个(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.7K30

图形编辑器开发:基于相交策略选中图形

方案 1:线段相交判断 直接一,判断 selection 的边和图形的边是否相交的。...为此我写了一篇判断两条线段是否相交的文章: 《几何算法:判断两条线段是否相交》 核心算法实现为: type Point = [number, number]; function crossProduct...当发现投影产生的两条线段没有相交,那找到了那条那条分割两图形的直线,证明两个凸多边形不相交。 否则继续,如果都没找到,说明相交。 下图是以一个图形的蓝边的法向量作为分离轴,进行投影的示意图。...矩形碰撞,特殊的分离轴定理碰撞 不知道你发现没有,从分离轴线的角度去看,两个没有旋转矩形的相交判断,其实是一个特例。...---- 相关阅读, 几何算法:判断两条线段是否相交 图形编辑器开发:颜色 hex 标准化 图形编辑器开发:一些会用到的简单几何算法 几何算法:矩形碰撞和包含检测算法 在容器内显示图片的五种方案

15430

基于相交线的立体平面SLAM

在三维空间中,两条相交的直线可以确定这样一个平面。因此,我们从立体左、右图像中提取直线段。通过立体匹配,计算出三维空间中的端点和直线方向,进而计算出平面。...然而,对于平行线,很难判断它们是否是从同一个真实平面提取的,因此由它们计算的平面容易带来较大的误差。因此,只计算相交线的平面。...为了快速检查相交线,发现满足以下条件的直线: •两条直线之间的角度大于阈值(在实验中为10°) •它们的中心之间的距离小于直线长度。 • 这两条直线的四个端点位于同一平面上。...面面之间的距离为 ? 如果D小于阈值(在实验中为5cm),这两条线满足第三个条件,并且计算了平面系数pi,这里是d_k的算术平均值。有时计算的平面可能不是场景中的真实平面,例如门框线的平面。...从实验结果来看,我们的系统明显优于目前最先进的基于特征的SLAM系统。基于线的SLAM系统相比,我们的系统也得到了可比的结果。平面计算滤除了这些不精确的线段,并添加了稳定的约束来估计摄像机的姿态。

1.1K31

Educational Codeforces Round 61 (Rated for Div. 2) C. Painting the Fence(思维+前缀和)

题目链接:http://codeforces.com/contest/1132/problem/C        题意是有n个,m条线段,问用m-2条线段最多可以覆盖多少个。        ...思路就是暴力枚举,但是虽然数据范围不大,但是太暴力也还是过不了的,所以我们可以用前缀和去优化把查询的操作变成O(1)的查询,我们首先记录一下这n个有多少个被覆盖了(变量为tot),然后m^2去枚举要删除的两个线段...,对于我们枚举的这两个要删除的线段,会有两种情况,要么相交要么不相交(还有包含的情况),所以我们只需要查询出有多少个是只被这两条线段覆盖的。...然后tot减去这些就是删除这两条线段后被覆盖的的个数了。...对于查询的操作我们用前缀和来优化,我们首先用差分求出每个被覆盖的次数,然后我们用两个数组分别记录只被覆盖了1次和2次的的前缀和,那么我们在之后的查询就是O(1)的时间复杂度了,不理解的可以看看呆码。

38130

解析几何:计算两条线段的交点

今天来实现计算两条线段的交点的解析几何算法。 我们要实现 getLineSegIntersection 方法:提供两条线段,计算它们的交点。 每条线段会用两个坐标表示。...变体1:两线段是否有交点。 返回值换成布尔值即可。 判断两线段是否有交点,我之前还写了另一种解法,感兴趣可以看看: 《几何算法:判断两条线段是否相交》 变体2:计算两直线的交点。...把判断直线交点是否线段上的逻辑去掉,然后直接返回坐标即可。 优化 1、重叠但却只有一个交点的情况。...如果线段平行,有两种情况: 没有重叠(0 个解) 有部分重叠(多解) 如果部分重叠,可能有多个,多个的情况下也不知道拿哪个作为交点好,这种情况下还是返回 null。...结尾 总结一下,求两线段的交点,本质就是解方程,需要用到克莱姆法则,计算出来的交点是直线交点,不一定是线段交点,需要再判断点是否线段范围内。 不复杂,就是有一小细节。

30220

如何在WPF绘图中(通过贝塞尔曲线)绘制平滑曲线

第一条曲线的第二个控制(标记为“control 1b”)和第二条曲线的第一个控制(标记为“control 2a”)连接两条Bezier曲线的共线。...那么如何定义控制呢?看看右边的图片,它显示了三条连接点A、B、C和D的贝塞尔曲线。现在关注蓝色曲线。它需要两个控制,一个在B之后,一个在C之前。...为了找到数据点B附近的控制,我们查看由B的两个相邻A和C定义的线段。红色虚线段将这些连接起来。现在我们从B沿着线段的方向移动。绿色虚线段表示平移后的红色线段,它与B相交。...我们沿着这段线段移动来放置控制的距离取决于曲线的张力。当您查看代码时,您将看到它是如何工作的。 请注意,您使用同一段来定义特定数据点两侧的控制。...在图中,你使用相同的绿色虚线段来定义B之前和之后的控制。因为这些控制点在B相交的一条线上,B两边的两条Bezier曲线将会平滑地相交

2.8K20

理解点线拓扑关系的计算原理

前序 由于业务需要,我学习了判断点线、线线的关系的算法、理论,这里汇总下,主要内容有: 的关系 线的关系 线线的关系 关系相对最简单,使用勾股定理即可: 这是怎样计算两个已知坐标点之间的距离...线线的关系 常用问题: 线线是否相交?...判断两条线段是否相交有两步: ①快速排斥计算 ②跨立计算 快速排斥 给出线条AB、CD,如果以AB、CD为对角线的矩形不相交,那么AB、CD也必不可能相交;如果矩形相交,那么需要再通过跨立计算进行判断。...跨立计算: 首先,这里需要用到向量叉乘的算法:其中ABCD是三维空间上的向量,xOy平面平行。 其次,如下图。ABCD相交必然有A、B在线段CD两边,C、D在线段AB两边。...struct { X float64 Y float64 } type Segment struct { A Point B Point } // IsSegmentsIntersect 2个线段是否相交

62810

万物皆数 数学的本质在于它的自由 --- 康托尔

下面就来看看,这两组看似无关的公理,是如何影响到两个点线定理的。 1....以下我们只用到笛沙格定理的简单情况,如下图该定理描述为:两个不共不共线的三角形,如果三条边分别平行,则对应点连线交于一;反之,如果对应点连线交于一,且有两条边分别平行,则第三条边也平行。   ...具体来说,先选择两条相交于OO的直线做“坐标轴”(以下左图),以下只讨论坐标轴上以OO为端点的线段的计算。然后再选定某个方向的平行线簇,它们在两轴上截得的线段被视为“相等”的。...对于线段a,ba,b,把它们放到不同的轴上(本段论述教材不同),分别引出两轴的平行线并交于AA(以上右图)。从AA作单位直线的平行线,截两轴得到的线段定义为a+ba+b,加法天然是满足交换律的。...由此我们知道,帕斯卡定理比笛沙格定理更强,可以把满足I,II,IV∗I,II,IV∗和帕斯卡定理的几何定义为帕斯卡几何。

60000
领券