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

如何测试线段是否与2D中的轴对齐矩形相交?

要测试线段是否与2D中的轴对齐矩形相交,请按照以下步骤操作:

  1. 首先确定矩形的长度和宽度。假设长度为w(水平方向)和高度为h(垂直方向),它们满足h>0, w>0以及0<=w<=h,否则矩形为空且不可视。
  2. 在矩形范围内创建一个x,y轴坐标,并计算其对应的坐标点。x轴表示水平方向上的缩放因子,y轴表示垂直方向上的缩放因子。将x轴设为w,y轴为h,然后将坐标点设置为(0,0)。
  3. 在矩形上创建一条垂直于轴对齐的直线,并将其延长至x轴。这条直线由两个端点(x,0) 和 (w,0)确定,它的长度为w。(如红线所示)
  4. 在矩形上创建一条垂直于轴对齐的直线,并将其延长至y轴。这条直线由两个端点(0,h) 和 (0,0) 确定,它的长度为h。(如蓝线所示)
  5. 要测试线段是否与矩形相交,请遍历直线上的每个点,并计算其沿x轴和y轴的缩放因子。要测试线的端点(x,0) 和 (w,0),它们的x轴缩放因子为x和w,而y轴缩放因子为0;对于线的其余部分,x轴缩放因子为w和x之间的部分,y轴缩放因子为0到h之间的部分。

对于每个直线上的点,如果缩放因子大于0,则表示线段在该点上与矩形相交。如果缩放因子等于0,则线段在轴上并处于矩形外部;如果缩放因子小于0,则线段与矩形不相交或越过矩形边缘。如果线段与矩形相交,返回True;否则返回False。

根据这个流程,我们可以比较精确地检测线条是否与轴对齐矩形相交,为图形和线段处理、排版和交互设计提供支持。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

原理 这个问题算法思路挺简单。分成两步来判断: 判断线段两个端点是否矩形内,如果两个端点至少有一个在矩形内,说明线段矩形相交。...如果两个端点都不在矩形内,那么需要再判断线段是否矩形对角线是否相交。因为两个端点都不在矩形线段有可能会切割矩形角,这时会与矩形对角线相交。...那么关键就在于两个子算法:判断点在矩形内和判断线段相交。判断点在矩形内非常简单,就是比较点是否矩形四至范围就可以了;而判断线段相交可以参考《空间或平面判断两线段相交(求交点)》这篇文章。 2....值是不准确 return true; } //线段矩形相交 inline bool static IsIntersectsOrthogon2D(LineSegment...参考 如何判断一条线段和一个矩形或者圆相交? - 叶飞影回答 - 知乎

3K20

Ray-AABB交叉检测算法

最近在解决三维问题时,需要判断线段是否立方体交叉,这个问题可以引申为:射线是否穿过立方体AABB。   ...在3D游戏开发碰撞检测普遍采用算法是对齐矩形边界框(Axially Aligned Bounding Box, AABB)包装盒方法,其基本思想是用一个立方体或者球体完全包裹住3D物体对象,然后根据包装盒距离...----   性质一和性质二比较容易理解,如果射线和3个slab相交线段没有重合,那么这些线段就不可能同时存在于3个slab,也就不可能在AABB盒子。   ...根据上述性质,可以看到A点同时在2D空间中2个slab;此外,根据性质二,因为射线平面相交,那么这条射线slab相交部分必有重合部分,因为A点在射线上,且在平面,那么可以得到max(t1,t2...在上述性质基础上,确定射线AABB是否交叉需要三步骤: 如何确定候选面:只要将平面方程带入射线Ray方程,求出这两个平面的t值,然后t值较小那个自然先射线交叉,那么就表示它是一个候选面。

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

    包含选择 包含策略很简单,遍历图形,对比 selection 选区矩形和图形包围盒,判断是否为前者包含后者关系。 如果是,就放到选中图形集合。 相比相交实现,算法不复杂。...方案 1:线段相交判断 直接一点,判断 selection 边和图形是否相交。...为此我写了一篇判断两条线段是否相交文章: 《几何算法:判断两条线段是否相交》 核心算法实现为: type Point = [number, number]; function crossProduct...(理论上应该做性能测试对比各种实现,还要考虑用户使用选区场景,是否会经常出现特定算法最坏时间复杂度情形,有空再做吧) 方案2:分离定理算法 这个算法挺有意思。...我们在判断选区矩形和图形 AABB 包围盒是否相交时,其实就已经完成了 基于选区矩形对应所有分离 投影上是否相交比较。 接下来我们只要再对图形边对应分离轴线投影,去对比就好了。

    17730

    熬夜总结了 “HTML5画布” 知识点(共10条)

    ,yStart)是线段起点,(xEnd,yEnd)是线段终点。...butt // 定义了线段没有线帽 round // 定义了线段末端为一个半圆形线帽 square // 定义了线段末端为一个矩形线帽 线条连接属性lineJoin,用于两条线条到连接方式:...miter 两条线段外边缘一直延伸到它们相交,属性miterLimit是用来描述如何绘制两条线段交点,是表示延伸长度和线条长度比值。...默认为10,只有miter使用时有效 lineJoin = [value]; round // 两条线段外边缘应该和一个填充弧结合 bevel // 两条线段外边缘应该和一个填充三角形相交...api CanvasContext``canvas 组件绘图上下文 CanvasContext 是旧版接口, 新版 Canvas 2D 接口 Web 一致。

    7.5K10

    熬夜总结了 “HTML5画布” 知识点(共10条)

    yStart)是线段起点,(xEnd,yEnd)是线段终点。...butt // 定义了线段没有线帽 round // 定义了线段末端为一个半圆形线帽 square // 定义了线段末端为一个矩形线帽 线条连接属性lineJoin,用于两条线条到连接方式:...miter两条线段外边缘一直延伸到它们相交,属性miterLimit是用来描述如何绘制两条线段交点,是表示延伸长度和线条长度比值。...默认为10,只有miter使用时有效 lineJoin = [value]; round // 两条线段外边缘应该和一个填充弧结合 bevel // 两条线段外边缘应该和一个填充三角形相交...api CanvasContext``canvas 组件绘图上下文 CanvasContext 是旧版接口, 新版 Canvas 2D 接口 Web 一致。

    7.1K21

    计算几何算法概览

    二、目录   本文整理计算几何基本概念和常用算法包括如下内容: 矢量概念 矢量加减法 矢量叉积 折线段拐向判断 判断点是否线段上 判断两线段是否相交 判断线段和直线是否相交 判断矩形是否包含点...判断线段、折线、多边形是否矩形 判断矩形是否矩形 判断圆是否矩形 判断点是否在多边形 判断线段是否在多边形内 判断折线是否在多边形内 判断多边形是否在多边形内 判断矩形是否在多边形内...判断两线段是否相交:   我们分两步确定两条线段是否相交:   (1)快速排斥试验     设以线段 P1P2 为对角线矩形为R, 设以线段 Q1Q2 为对角线矩形为T,如果R和T不相交,显然两线段不会相交...判断线段、折线、多边形是否矩形:   因为矩形是个凸集,所以只要判断所有端点是否都在矩形中就可以了。   判断矩形是否矩形:   只要比较左右边界和上下边界就可以了。   ...另外,一开始就先利用矢量叉乘判断线段线段(或直线)是否相交,如果结果是相交,那么在后面就可以将线段全部看作直线来考虑。

    1.6K40

    hover 背后数学和图形学

    hover 是跟 DOM 绑定,常规 DOM 是一个个矩形(CSS 盒模型),鼠标移动时浏览器需要判断鼠标指针坐标是否在这个 DOM 矩形范围之内,根本上是一个数学问题,即判断一个点是否位于一个矩形内...所以WebGL任何图形本质上都是多边形,既然是多边形就可以按照上文方案解决点多边形相对位置判断问题。 如何判断两条线段有交点?...明确了上面两个问题之后,就只剩下判断两条线段是否相交这一个问题了。这同样是个纯粹数学问题。...回顾上文提到多边形顶点数据制备,多边形边是由相邻两个顶点相连而成,顶点是有序,也就是说多边形每条边都是有向线段,所以判断两条线段是否相交这个问题准确说发应该是:判断两个有模向量是否相交。...判断两条线段是否相交用到了上述规则2-4。先看下面这张图: 如果线段AB和CD相交可以推导出以下规则: 点A和点B分别位于线段CD两侧; 点C和点D分别位于线段AB两侧。

    1.4K10

    Canvas入门到高级详解(上)

    * 注意:交叉路径填充问题,“非零环绕原则”,顺逆时针穿插次数决定是否填充。...以下是非0环绕原则原理:(了解即可,非常少会用到复杂路径) “非零环绕规则”是这么来判断有自我交叉情况路径:对于路径任意给定区域,从该区域内部画一条足够长线段, 使此线段终点完全落在路径范围之外...图2-14那三个箭头所描述就是上面这个步骤。 接下来,将计数器初始化为0, 然后,每当这条线段路径上直线或曲线相交时, 就改变计数器值。...如果是路径顺时针部分相交,则加1, 如果是路径逆时针部分相交,则减1。...center: 文本中心被放置在指定位置。 left : 文本左对齐。 right : 文本右对齐。 例如:ctx.textAlign = 'left'; ?

    1.7K32

    CAD常用基本操作

    ,所绘矩形只能在第一象限 D 旋转(R):绘制x正方向呈一定夹角矩形 E 选择矩形命令后其它命令操作:a 倒角(C)圆角(F):直接绘制倒角或圆角矩形b 标高(E):指定所绘矩形和基准面的垂直距离...,命令提示行输入extrim命令(增强修剪),剪切所选边一侧所有相交图形 9 延伸命令:extend(EX) 命令修剪类似,按住Shift 键可以选择要修剪对象 小提示:edgemode命令:0:...详细菜单) D 环形阵列使用项目间角度拾取应在中心点拾取之后(默认以中心点为拾取角度顶点) E 环形阵列填充角度选择默认为X夹角,如果要选择填充角度不从X开始,可一先改变UCS,再进行选择...(F) A 半径值(R):输入倒角半径值 B 修剪(T):控制圆角命令是否将选定边修剪到圆角弧端点(是否保留原图形) C 多段线(P):在二维多段线两条线段相交每个顶点处插入圆角弧(如果一条弧线段将会聚于该弧线段两条直线段分开...38 对齐命令 align(AL) A 指定一对、两对或三对源点和定义点,以对齐选定对象,两点或三点对齐对象会发生相应旋转 B 二点对齐可以设置是否缩放,不缩放时,系统默认第一对源点定义点重合,而第二源点仅定义点旋转共线

    5.5K50

    碰撞检测向量实现

    注:1、本文只讨论2d图形碰撞检测。2、本文讨论圆形圆形,矩形矩形、圆形矩形碰撞检测向量实现 前言 2D游戏中,通常使用矩形、圆形等来代替复杂图形相交检测。...其中矩形包围盒又可以分为对齐包围盒(AABB, Axis Aligned Bounding Box)转向包围盒(OBB, Oriented Bounding Box)。...AABBOBB区别在于,AABB矩形其中一条边和坐标平行,OBB计算复杂度要高于AABB。根据不同使用场景,可以用不同方案。 ?...涉及到矩形相交问题都先要判断是否轴对称。...方法是计算圆心矩形最短距离 u,若 u 长度小于 r 则两者相交。 首先利用绝对值把 p - c 转移到第一象限,下图显示不同象限圆心也能映射至第一象限,这不影响相交测试结果: ?

    1.5K10

    canvas详细教程! ( 近1万字吐血总结)

    其中,弧线起点是“开始点所在边切点”,而弧线终点是“结束点所在边切点”。arcTo()方法绘制弧线是两个切点之间长度最短那个圆弧。.../end,对齐方式是以文本对strokeText()方法坐标参数为参考水平方向对齐方式。...只有已有图像之内新图像部分才会显示,已有图像是透明。可以简单理解为,只会展示新图像已有图像重叠部分。..., 150); // 向x正方向移动了100像素,y正方向移动了150像素 ctx.fillRect(0, 0, 200, 100); 蓝色矩形绘制坐标还是(0,0...在上边代码,我在两个save()中间加了一个修改填充颜色为pink代码,观察下图中更改颜色矩形方块是哪几个: 可以看到,更改颜色是旋转和移动原点坐标的两个矩形,而缩放矩形颜色并未修改,

    3.4K12

    Canvas 从入门到劝朋友放弃(图解版)

    W3C 坐标系 和 数学直角坐标系 X 是一样,只是 Y 反向相反。 W3C 坐标系 Y 正方向向下。 直线 一条直线 最简单起步方式是画一条直线。...明明使用方法都是一样,只是第二条直线 Y 值是有小数点。 答:默认情况下 canvas 会将线条中心点和像素底部对齐,所以会导致显示效果是 2px 和非纯黑色问题。...线中心点会和画布像素点底部对齐,所以会线中间是黑色,但由于一个像素就不能再切割了,所以会有半个像素被染色,就变成了浅灰色。 所以如果你设置 Y 值是一个整数,就会出现上面那种情况。...使用线段描绘矩形 可以使用前面画线段方法来绘制矩形 canvas id="c" width="300" height="300" style="border: 1px solid #ccc;"></...文本 Canvas 提供了一些操作文本方法。 为了方便演示,我们先了解一下在 Canvas 如何给本文设置样式。

    1.9K21

    线段检测法(LSD)

    矩形像素level-line angle(水平线角度)最小外接矩形主方向角度差在容忍(tolerance)τ内的话,那么这个点被称作”aligned point”(同性点或者是对齐点)。...通过统计最小外接矩形所有像素数n和其内alinedg points个数k,用来判定这个line support region是否是一个直线段。...在含有线段情况下,我们对对齐数量感兴趣,因此考虑噪声模型虚警线段具有所观测真实线段一样多或更多对齐事件。...给定图像i和矩形r,定义 k(r,i) 表示矩形r对齐数量,n(r )表示矩形 r像素点总数,这样上述事件发生次数即为: 也就是说这种事件发生即表示产生一个直线段检测虚警。...其中Ntest表示被考虑到矩形总数,PH0表示一个矩形对应噪声模型对齐点数量不小于实际模型对齐点数量概率。

    2.6K10

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

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

    73230

    Day 3 学习Canvas这一篇文章就够了

    一般矢量图形软件通过它来精确画出曲线,贝兹曲线由线段节点组成,节点是可拖动支点,线段像可伸缩皮筋,我们在绘图工具上看到钢笔工具就是来做这种矢量曲线。 ​...五、添加样式和颜色 ​ 在前面的绘制矩形章节,只用到了默认线条和颜色。 ​ 如果想要给图形上色,有两个重要属性可以做到。...共有3个值: butt:线段末端以方形结束 round:线段末端以圆形结束 square:线段末端以方形结束,但是增加了一个宽度和线段相同,高度是线段厚度一半矩形区域。...miter(默认) 通过延伸相连部分外边缘,使其相交于一点,形成一个额外菱形区域。...虚线 用 setLineDash 方法和 lineDashOffset 属性来制定虚线样式. setLineDash 方法接受一个数组,来指定线段间隙交替;lineDashOffset属性设置起始偏移量

    1K20

    Python之pygame学习矩形区域(5)

    这四个分别对应矩形区域四个边中间点坐标。 ? 分别返回矩形区域中心点坐标(元祖),中心x,中心y ? 分别返回矩形区域宽高(元祖),宽,高 ?...collidelist() 测试列表一个矩形是否相交 collidelist(list) - > index 测试矩形是否矩形序列任何一个发生碰撞。返回找到第一个碰撞索引。...collidelistall() 测试列表所有矩形是否相交 collidelistall(list) - > indices 返回包含Rect冲突矩形所有索引列表。...collidedict() 测试字典一个矩形是否相交 collidedict(dict) - >(键,值) collidedict(dict) - >没有 collidedict(dict,use_values...例如rect.collidedict({tuple(key_rect) : value}) collidedictall() 测试字典所有矩形是否相交 collidedictall(dict) -

    3.1K30

    第155天:canvas(二)

    一、添加样式和颜色 ​ 在前面的绘制矩形章节,只用到了默认线条和颜色。 ​ 如果想要给图形上色,有两个重要属性可以做到。...共有3个值: butt:线段末端以方形结束 round:线段末端以圆形结束 square:线段末端以方形结束,但是增加了一个宽度和线段相同,高度是线段厚度一半矩形区域。...(3) lineJoin = type 同一个path内,设定线条线条间接合处样式。...miter(默认) 通过延伸相连部分外边缘,使其相交于一点,形成一个额外菱形区域。 ?...(4)虚线 用 setLineDash 方法和 lineDashOffset 属性来制定虚线样式. setLineDash 方法接受一个数组,来指定线段间隙交替;lineDashOffset属性设置起始偏移量

    48430

    关于判断两个矩形是否相交

    众所周知,元素是以一个矩形盒模型形式呈现在网页,而且浏览器可视区域也是一个矩形,那么这个需求就变成了某个元素盒模型(矩形B)是否有某个部分出现在浏览器可视区域(矩形A),如果有则执行动画。...图1 最初思路如下: 首先求出点`Pa1``Pb1`距离原点`(0,0)`更远点(即x方向y方向坐标值较大点),将其标记为`M`(图1粉色点); 然后求出`Pa2``Pb2`距离原点更近点...(即x方向y方向坐标值较小点),将其标记为`N`(图1橙色点); 判断:如果点`M`x坐标值和y坐标值均比点`N`x坐标和y坐标小(即,M点和N点可以构成一个新矩形),则两个矩形相交...仔细观察上面列出几种情况后,想到了一个新思路:如果两个矩形相交,那么矩形A中心点`Pa3(Xa3,Ya3)`矩形B中心点`Pb3(Xb3,Yb3)`在x方向上距离和y方向距离一定满足以下条件...rectF));  // false console.log(isIntersection(rectA, rectG));  // false 特别注意:以上结论若要成立,还有一个**先决条件**,即:两个矩形均为对齐矩形

    2.3K40

    Mastercam9.1

    WCS定面 Entity           图素定面,可以选一圆弧或二条线段或三个点或实体平面来定面 Rotate        旋转定面,当前平面绕着坐标旋转产生新构图面 Last        ...水平线 生成X平行线         Vertical 垂直线 生成Y平行线         Endpoint 两点画线 生成通过二点线         Multi 连续线 生成通过一组点折线...二条相交直线一条直线相切,另一条直线通过圆心,给出半径,生成二整圆,选中其中一个                 point        通过一点,一图素相切,给出半径,生成四个圆弧,选中其中一个...Trim        Y/N        是否修整掉多余                 Chain        对一封闭图形每一个转角处倒圆角                 CW/CCW...生成二组相交曲面间交线         Project 投影线        生成曲线在曲面上投影线。

    2.6K20
    领券