直线与 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 矩形相交? 的相关文章

  • 错误:表达式不可赋值三元运算符

    我有以下代码 MPLABX XC8 编译器给出此错误 错误 表达式不可分配 U1ERRIRbits RXFOIF uart1 oerr 1 uart1 oerr 0 这是相关代码部分 typedef union struct bool fe
  • 来自 double 的 static_cast 可以优化分配给 double 吗?

    我偶然发现了一个我认为不必要的功能 并且通常让我感到害怕 float coerceToFloat double x volatile float y static cast
  • 如何从经过身份验证的 SecurityToken 中获取声明

    我将令牌作为字符串传递到 SOAP 服务中 并验证了该令牌是否有效 我现在有一个 SecurityToken 在调试模式下我可以看到所有声明 特别是我想传递到另一个方法的 userId 声明 我似乎不知道如何获得这些索赔 现在 我解码了令牌
  • 每个元素的 asp.net Web 表单自定义错误消息

    我创建了一个 Web 应用程序 表单 以及后端 SQL 插入和查询 目前我正在显示所有用户错误消息 div style padding 1em div
  • Visual Studio 2013 调试器显示 std::string 的奇怪值

    我有一个大型的 cmake 生成的解决方案 其中包含许多项目 由于某种原因 我无法查看字符串的内容 因为根据调试器 Bx Buf含有一些垃圾 text c str 正确返回 Hello 该问题不仅仅发生在本地字符串上 返回的函数std st
  • 我担心我添加了太多接口

    我正在构建我的领域模型并继续重构它 正如我所做的那样 我发现我喜欢接口 因为它允许我根据接口为具体类型创建可重用的方法 控制器 视图 但是 我发现每次向域实体之一添加新属性时 我都会创建一个接口 例如 我有一个会员状态从抽象继承的对象Ent
  • 自己绘制的WPF自定义滑块

    这是我关于堆栈溢出的第一个问题 所以不要踢它 我在尝试创建 Mac 风格的滑块控件时遇到问题 我已经发现这个解决方案 http www codeproject com KB miscctrl MAC Slider aspx我已经在我的解决方
  • 注入包含接口的所有已注册实现的 Enumerable

    给出以下接口 public interface IMyProcessor void Process 我希望能够注册多个实现 并让我的 DI 容器将它们的可枚举注入到这样的类中 public class MyProcessorLibrary
  • X 轴和 Z 轴上的 Quaternion.Slerp,无 Y 轴

    I am trying to rotate the Player about X Y and Z axis The Y axis should not move from last angle Example if I rotate 45
  • MPI - 发送和接收列

    我需要从一个进程发送矩阵列并从另一个进程接收它 我尝试运行以下程序 但得到了一个奇怪的结果 至少我这么认为 仅复制矩阵的第一个元素 某些矩阵元素会发生意外变化 include
  • Clang 5.0 上的 vsprintf 和 vsnprintf [-Wformat-nonliteral] 警告

    我有这段代码 static void err doit int errnoflag int level const char fmt va list ap int errno save unsigned long n char buf MA
  • 具有多个父项的 Qt 树模型

    我想构建一棵树 其中一个元素可以引用另一个元素 我想要构建的树是 像这样的东西 A B C D E F P this is a pointer to C D first child of C E second child of C I fo
  • 使用未命名命名空间而不是静态命名空间

    我可以假设在未命名命名空间中声明的对象相当于static namespace int x 1 static int x 2 FWIK 在这两种情况下 x将具有静态存储期限和内部链接 声明为的对象的所有规则也是如此static适用于未命名名称
  • 让 Windows 尝试读取文件

    我正在对 Windows 文件系统进行某种封装 当用户请求打开文件时 Windows 调用我的驱动程序来提供数据 在正常操作中 驱动程序返回缓存的文件内容 但是 在某些情况下 实际文件没有缓存 我需要从网络下载它 问题是是否有可能让 Win
  • c++ - <未解析的重载函数类型>

    在我的班级里叫Mat 我想要一个将另一个函数作为参数的函数 现在我有下面 4 个函数 但是在调用 print 时出现错误 第二行给了我一个错误 但我不明白为什么 因为第一行有效 唯一的区别是功能f不是班级成员Mat but f2是 失败的是
  • 查找数组中的多个索引

    假设我有一个像这样的数组 string fruits watermelon apple apple kiwi pear banana 是否有一个内置函数可以让我查询 apple 的所有索引 例如 fruits FindAllIndex ap
  • C# 多维数组解析

    我有一个多维数组 内容在调试器中看起来像这样 数组设置为 String s new String 6 4 A B Yes C A B Yes C A B No C A B Yes C A B Yes C A B Yes C A B No C
  • 异步/等待 - 是*并发*吗?

    我一直在考虑 C 5 中新的异步内容 并且出现了一个特殊问题 据我了解 await关键字是一个简洁的编译器技巧 语法糖来实现连续传递 http en wikipedia org wiki Continuation passing style
  • 使用通用存储库模式和流畅的 nHibernate

    我目前正在开发一个中型应用程序 它将访问不同站点上的 2 个或更多 SQL 数据库等 我正在考虑使用类似的东西 http mikehadlow blogspot com 2008 03 using irepository pattern w
  • 如何使用 Microsoft Graph API 更新 MailboxSettings

    我想从不同的日历更新邮箱设置 如何构建可以通过 Microsoft Graph 更新 MailboxSetting 的请求 这是我的代码示例 但有例外 代码示例 User obj GraphServiceClient Users roomC

随机推荐

  • 通过拟合 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 定义 矩形也有这两点 我建议简单地对构成矩形的每个线段