直线与 AABB 矩形相交?

2023-12-02

最好不使用任何类型的循环,因为这将在游戏中使用。

我希望将一条线与任意大小的矩形相交。 但我也希望返回交点。

有可能,我已经做了一些谷歌搜索,但仍然没有解决。

该线使用 (x1,y1,x2,y2) 定义。 矩形也有这两点。


我建议简单地对构成矩形的每个线段(边缘)进行线段线段交叉检查。这是我多年前编写的线段相交检测算法,是从我的一个旧 XNA 项目中挖掘出来的:

// a1 is line1 start, a2 is line1 end, b1 is line2 start, b2 is line2 end
static bool Intersects(Vector2 a1, Vector2 a2, Vector2 b1, Vector2 b2, out Vector2 intersection)
{
    intersection = Vector2.Zero;

    Vector2 b = a2 - a1;
    Vector2 d = b2 - b1;
    float bDotDPerp = b.X * d.Y - b.Y * d.X;

    // if b dot d == 0, it means the lines are parallel so have infinite intersection points
    if (bDotDPerp == 0)
        return false;

    Vector2 c = b1 - a1;
    float t = (c.X * d.Y - c.Y * d.X) / bDotDPerp;
    if (t < 0 || t > 1)
        return false;

    float u = (c.X * b.Y - c.Y * b.X) / bDotDPerp;
    if (u < 0 || u > 1)
        return false;

    intersection = a1 + t * b;

    return true;
}

我将把每条边输入到上述方法中并收集结果作为读者的练习:)


编辑一年后,现在我已经上大学并完成了图形课程:

看看科恩-萨瑟兰算法当您有大量线且其中大多数线不与矩形相交时,可以有效地执行此操作。它使用 9 段网格,并将线的每个端点放置在所述网格的区域中:

grid

使用它我们可以判断是否不会有任何线相交:

grid with lines

例如这里CD不会与矩形相交(在第一张图像中以红色显示),因为两者C and D都在顶行并且都不会AB。对于直线可能与矩形相交的地方,我们必须尝试直线与直线的相交。

他们对各部分进行编号/标记的方式使我们能够简单地执行x AND y != 0 (where x and y是每个线端点的部分标签)以确定是否不会有交叉点。

使用这种方法意味着我们的线与线的交叉点要少得多,这大大加快了整个过程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

直线与 AABB 矩形相交? 的相关文章

  • 在 C++ 中使用 matlab 结构(matlab 函数调用的返回值)(由 matlab 编译器生成的库)

    你好 我有一个相当简单的 matlab 函数 例如 function MYSTRUCT myfunc MYSTRUCT prop1 test MYSTRUCT prop2 foo MYSTRUCT prop3 42 end 我用 matla
  • 如何在c++中读取pcap文件来获取数据包信息?

    我想用 C 编写一个程序来读取 pcap 文件并获取数据包的信息 例如 len sourc ip flags 等 现在我找到了如下代码 我认为它会帮助我获取信息 但是我有一些疑问 首先我想知道应该将哪个库添加到我的程序中 然后什么是 pca
  • 如何将非静态类成员“std::bind”绑定到 Win32 回调函数“WNDPROC”?

    我正在尝试将非静态类成员绑定到标准WNDPROC http msdn microsoft com en us library ms633573 aspx功能 我知道我可以通过将类成员设为静态来简单地做到这一点 但是 作为一名 C 11 ST
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 是否有实用的理由使用“if (0 == p)”而不是“if (!p)”?

    我倾向于使用逻辑非运算符来编写 if 语句 if p some code 我周围的一些人倾向于使用显式比较 因此代码如下所示 if FOO p some code 其中 FOO 是其中之一false FALSE 0 0 0 NULL etc
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • 如何在 Xaml 文本中添加电子邮件链接?

    我在 Windows Phone 8 应用程序中有一些大文本 我希望其中有电子邮件链接 例如 mailto 功能 这是代码的一部分
  • Azure 辅助角色“请求输入之一超出范围”的内部异常。

    我在辅助角色中调用 CloudTableClient CreateTableIfNotExist 方法 但收到一个异常 其中包含 请求输入之一超出范围 的内部异常 我做了一些研究 发现这是由于将表命名为非法表名引起的 但是 我尝试为我的表命
  • 为什么 std::strstream 被弃用?

    我最近发现std strstream已被弃用 取而代之的是std stringstream 我已经有一段时间没有使用它了 但它做了我当时需要做的事情 所以很惊讶听到它的弃用 我的问题是为什么做出这个决定 有什么好处std stringstr
  • 等待进程释放文件

    我如何等待文件空闲以便ss Save 可以用新的覆盖它吗 如果我紧密地运行两次 左右 我会得到一个generic GDI error
  • AES 128 CBC 蒙特卡罗测试

    我正在 AES 128 CBC 上执行 MCT 如中所述http csrc nist gov groups STM cavp documents aes AESAVS pdf http csrc nist gov groups STM ca
  • 使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞?

    当子进程数量很大时 我的程序停止运行 我不知道问题是什么 但我猜子进程在运行时以某种方式被阻止 下面是该程序的主要工作流程 void function int process num int i initial variables for
  • 使用 %d 打印 unsigned long long

    为什么我打印以下内容时得到 1 unsigned long long int largestIntegerInC 18446744073709551615LL printf largestIntegerInC d n largestInte
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • 我的班级应该订阅自己的公共活动吗?

    我正在使用 C 3 0 遵循标准事件模式我有 public event EventHandler

随机推荐

  • 通过拟合 HMM 模型预测未来排放量

    我已经安装了一个HMM使用我的数据模型hmm discnp在R中封装如下 library hmm discnp zs lt hmm y lis K 5 现在我想根据该模型预测未来的 K 个观测值 排放 但我只能获得我已经通过的观察结果的最可
  • 在 php 上回显我的表单值

    我使用下面的代码来打印插入到框中的值 但是 在我输入值并单击提交后 没有任何内容打印出来
  • Laravel 返回“419 页已过期;”在 Chrome 和 Edge 浏览器等上登录/注册后[重复]

    这个问题在这里已经有答案了 迁移 Laravel 项目域 in 到 institute 和托管 namecheap 到 name com 后 一切正常 当我尝试在 Chrome 和 Edge 等浏览器上登录或注册时 它返回 419 PAGE
  • 服务器未检测到 CSS 样式表路径 404 未找到错误?

    我有一个名为 header php 的头文件 如下所示 它位于名为includes的文件夹内 因此路径为includes header php
  • PHPMailer 说无法连接到 SMTP 主机

    在过去的两天里 我一直在尝试使用 PHP 脚本来发送电子邮件 但它似乎不起作用 首先我尝试了普通的 php 邮件功能 然后是 PHPMailer 然后是 Swiftmailer 我尝试过使用 gmail 的帐户和 SMTP 以及我的互联网提
  • 上次 Ubuntu 18.04 更新后 Docker 损坏

    上次 Ubuntu 更新后 有人遇到 Docker 问题吗 我有 2 个项目 由 docker compose 在 ubuntu18 04 中运行 这两个项目都工作正常 但在 yml 进行 0 次更改后 我现在开始收到此错误 interna
  • 如何创建带背景的三角形(固定高度,宽度=100%)

    我有一个图形背景 我需要在左上角显示一个彩色三角形 与分辨率无关 我可以仅使用 HTML CSS JS 创建一个宽度 100 高度 200px 背景 红色的三角形元素吗 我可以通过 IMG 创建它 宽度 100 但我希望有一个比调整图像大小
  • django 模型具有两个可能模型之一的外键

    我有两个相似但不完全相同的模型 这是我能想到的对该问题的最佳抽象 class Cat models Model name models TextField breed models TextField class Dog models Mo
  • jQuery 加载文本文件数据

    我正在尝试使用外部脚本文件中的 get 函数从服务器上的文本文件加载数据 我的代码如下 Load sample date var stringData get http localhost webpath graphing sample d
  • Node JS 中的 JSON stringify 未序列化对象数组

    我在用sails js 节点js框架 我正在尝试对其中一个对象进行 JSON stringify 但是当我这样做时 它会忽略其中一个字段 下面的 rooms 数组 这是 console log object 给我的 rooms Object
  • Selenium ChromeDriver 目前是否支持处理弹出窗口?

    单击 Chrome 浏览器上的按钮后 我必须处理一个弹出窗口 一旦以编程方式启动弹出窗口 驱动程序对象的任何进一步操作都会导致此异常 OpenQA Selenium WebDriverException 服务器没有对 url 做出响应 窗口
  • 关于 ArangoDB 中多个索引的使用

    具有以下结构的文档 path String enabled Long disabled null Long other fields 我想通过路径前缀和某些数字与文档时间戳之间的数字关系的组合来查找文档 伪代码 SELECT e FROM
  • 在居中的动态宽度父级中左对齐子级

    我有点无法理解它 而且也很难在网络 此处找到正确的解决方案 因为它很难制定 基本上我想要的是像左对齐图像的居中对齐 所以它应该是一个居中的动态宽度父div 宽度取决于浏览器宽度 它保存带有在一行中呈现的图像的div 但新行应该左对齐 我可以
  • CardView 海拔高度不适用于 Android 5.1.1

    我在 RecyclerView 中使用 CardView 经过大量阅读后 我最终只在 Android 5 1 1 上遵循 不工作 代码 在之前的 Android 版本上 它运行良好
  • SoftLayer 通过 userStatusID 获取用户

    我正在尝试检索SoftLayer 用户配置文件通过用户状态 ID 我正在使用网址
  • Discord.js v13 语音通道数据未更新

    我的 Slash 命令已注册 但它们出现不一致 我的用法的简化版本 client on interactionCreate async interaction gt if interaction isCommand return conso
  • 如何创建输出自定义类型的 Swift Regex?

    In the 全球开发者大会视频 结果表明你可以这样做Captures TryCapture正则表达式生成器中的 s let regex Regex TryCapture OneOrMore digit transform Int 0 和输
  • 在 Android 中嵌入 Knopflerfish 不起作用

    我正在尝试将 Knopflerfish 框架嵌入到 Android 应用程序中以动态加载和卸载包 我跟着this教程 我做的第一步是从下载framework jarthis链接 并将其添加到我的 Eclipse 项目中的类路径中 另外 下面
  • Titanium - Android 外部存储 - 创建新目录,然后将文件写入其中

    我们是否不能简单地以编程方式在 Android 的外部 SD 卡 而不是设备的内部存储器 上创建新目录 并且我们不能在 SD 卡上写入文件 Titanium 是否受到如此限制 即使在使用后也始终在内部存储器上写入文件Ti Filesyste
  • 直线与 AABB 矩形相交?

    最好不使用任何类型的循环 因为这将在游戏中使用 我希望将一条线与任意大小的矩形相交 但我也希望返回交点 有可能 我已经做了一些谷歌搜索 但仍然没有解决 该线使用 x1 y1 x2 y2 定义 矩形也有这两点 我建议简单地对构成矩形的每个线段