首页 > 其他分享 >判断两个矩形是否相交(Rect Intersection)

判断两个矩形是否相交(Rect Intersection)

时间:2023-06-08 11:56:15浏览次数:31  
标签:Intersection 取反 相交 && 思路 矩形 Rect

0x00 Preface

最近在开发一个2D组态图形组件的过程中,里面的数学模块,涉及到两个矩形是否相交的判断。

这个问题很多年前就写过,算是个小的算法吧。

网络上搜索一下,有很多思路,有一些思路要基于多种组合的判断,显得比较复杂。 比如两个矩形相交的情形,可能有下面的多种类型:

image.png

而每种类型又有多种子类型。

0x01 Body

其实可以反向来思考这个问题,就比较简单,两个矩形A和B,不相交的情况有哪些,然后通过bool 取反,就是相交的情况。
假设矩形的的定义如下:

class Rect {
    constructor(x,y,w,h) {
      this.x = x;
      this.y = y;
      this.w = w;
      this.h = h;
      
      this.r = x + w; // r表示矩形的右边
      this.b = y + h; // b 表示矩形的下边
    }
}

不相交的情况可以归纳为这几种情况:

  • A在B的左边 (A.r < B.x)
  • A在B的右边 ( B.r < A.x)
  • A在B的上边 (A.b < B.y )
  • A在B的下边 (B.b < A.y )

所以不相交的代码如下:

A.r < B.x || B.r < A.x || A.b < B.y || B.b <A.y

对于这种情况取反,就是相交的情况:

!(A.r < B.x || B.r < A.x || A.b < B.y || B.b <A.y)

取反之后 或变与:

A.r >= B.x && B.r >= A.x && A.b >= B.y && B.b >= A.y

尝试着问下ChatGPT,它给出的正是这种思路,如下图:

image.png

0x02 Conclusion

  • 有时候反过来思考问题,是一种很好的思路
  • ChatGPT 牛逼。

0x03 The Last

最后,关注公号“ITMan彪叔” 可以添加作者微信进行交流,及时收到更多有价值的文章。

标签:Intersection,取反,相交,&&,思路,矩形,Rect
From: https://www.cnblogs.com/flyfox1982/p/17465795.html

相关文章

  • SparkUI中的Peak Pool Memory Direct / Mapped (直接缓冲池和映射缓冲池)
      PeakPoolMemoryDirect/Mapped --直接缓冲池和映射缓冲池峰值内存##什么是直接缓冲池和映射缓冲池?在Java中,有两种类型的缓冲池:直接缓冲池和映射缓冲池。直接缓冲池1)从堆外内存分配,不受JVM管理2)占用内存较多3)相比从JVM复制数据到本地,性能更高 映射缓冲池1)将文......
  • kanzi的安卓工程报错解决办法:Error: Could not find or access Kanzi's Gradle plugin
    这是因为安卓里配置的环境变量不对。需要检查下述文件的路径是否真实存在,以及和使用的版本是否匹配  ......
  • 拓扑错误:自交。jts.geom.TopologyException: found non-noded intersection between L
    Thatbeingsaid,youwillwanttoensurethegeometriesarevalidbeforecomputingtheintersection,using polygon1.isValid() and polygon2.isValid().Thesampledatafor polygon2 isself-intersecting,sotheintersectionoperationfailswithcom.vividso......
  • Active Directory 域服务概述
    工作组和域工作组(WorkGroup):工作组是一种平等身份环境,各个计算机之间各为一个独立体,不方便管理和资源共享,在高端应用中,支持度不够,发挥不了高端应用的更多功能。域(Domain):域是一种管理单元,也是一个管理安全边界。域管理员只能管理域的内部,除非其他的域显式地赋予他管理权限,他才......
  • C#将矩形平铺在大的矩形内,支持旋转调整
    publicstaticList<Rect>TileRects(Sizerect,Sizecontainer){List<Rect>result=newList<Rect>();if(rect.Width>container.Width&&rect.Width>container.Height||rect.Height>container.Height&......
  • pymysql.err.DataError: (1366, “Incorrect string value: ‘\\xF0\\x9F\\x92
    原因是字符串中有emoji数据。原因:字符串中有emoji字符,数据库是utf8无法识别解决方法:安装emoji库pipinstallemoji处理字符串:importemojis=emoji.demojize('......
  • Intersection Observer API 交叉观察器 API vue3 antd table 滚动加载 使用过程
    需求:表格滚动加载做法:步骤一:给表格最后一行添加特定标识,类名或者id等组件库https://www.antdv.com/components/table-cn#APIwebApihttps://developer.mozilla.org/zh-CN/docs/Web/API/Intersection_Observer_API组件名table添加类名的组件方法rowClassName使用例子::......
  • Python安装软件包报错 fatal error: Python.h: No such file or directory
    原因是我们安装的这个第三方库内含需要编译的调用pythonapi的c/c++文件,而linuxlinux发行版通常会把类库的头文件和相关的pkg-config分拆成一个单独的xxx-dev(el)包。以python为例,以下情况你是需要python-dev的:ubuntu下apt-getinstallpython-devapt-getinstallpython3-d......
  • POJ1151(线段树+扫描线求矩形面积并)
    题目:http://poj.org/problem?id=1151 #include<iostream>#include<string.h>#include<algorithm>#include<stdio.h>usingnamespacestd;constintN=10005;structnode{intl,r;intcov;doublelen;};structline{......
  • POJ3695(矩形切割中等题)
    题目:Rectangles 题意:给N个矩形,他们可能会重叠,然后给M个询问,每个询问给出指定的矩形位置,然后分别计算每个询问中选中的矩形的并。 本题跟求所有矩形的并一个思路,只是再增加一个数组来保存选中矩形的位置,然后直接求并即可。#include<stdio.h>#include<string.h>#include<algor......