找到两个移动物体的更好交点

2024-05-05

我想极大地优化我的算法之一,我将尽力以最好的方式解释它。

主题

我们当时处于二维欧几里德系统中t = 0。 在这个系统中有两个对象:O1 and O2.

O1 and O2分别位于点PA and PC.

O1移动于常数和已知点方向的速度PB。当物体到达PB时就会停止。

O2可以移动到常数和已知 speed 不同与否O1 的任意方向。在时间 0 时,O2 有没有方向,我们需要为它找到一个。

已知参数:

  • O1:位置、方向、速度
  • O2:位置、速度

这是系统的小图。

我们想找到重点PI和时间ti其中:Position of O1 at the time ti = Position of O2 at the time ti = PI。然后我们让物体O2移动到点PI,得到氧气方向.

当选择 O2(点 PI)的方向并且物体 O1 和 O2 都在移动时,物体永远不会停止或等待对于彼此。

In this case, the result would be something like this (PI is noted D on this picture). Best intersection

算法

你可以在这里找到用 JS 编写的工作算法jsfiddle http://jsfiddle.net/mamadrood/86n9f/,这也是理解问题的好方法。

此时我使用一个简单的算法,该算法有效,但可以进行很多操作,我将得到最佳的交叉点时间,然后得到交叉点位置。

为了得到这个时间,我会检查一下O1的位置,并检查O2此时是否可能到达这个位置。如果O2无法及时到达物体,我们将增加150%的时间,但如果O2当时能够越过O1-B线,我们将减少50%的时间。

最终,经过多次近似,我们将找到两个物体相遇的完美时间。

伪代码

function getOptimalIntersectionTime time
   if distance between O1 and O2 at the time `time` < 1
       return time
   else if O2 could not reach the object O1 at the time `time`
       return getOptimalIntersectionTime time * 1.5
   else
       return getOptimalIntersectionTime time * 0.5

我为什么担心?

我的算法有效,但在某些情况下(例如 jsFiddle 中的“反向案例”)需要大量微积分才能找到最佳点。

在这个 jsFiddle 中,我们对位置(-1000 到 1000)和速度(1-200)使用了很少的值,但是随着数字的增大,该算法的速度会显着变慢。

我知道过早优化是一个坏主意,但我已经完成了项目(包括数据库插入/选择和数据分析,包括这个被调用很多次的算法),并且这个算法占用了 80% 的时间。在某些情况下会占用系统资源,因此改进可以真正提高系统的稳定性和响应能力。


不失一般性,设O2位于(0,0)。

Let s and vO1 的位置和速度矢量,v2O2 的速度,t 拦截时间。然后我们有:

|s + v * t| = t * v2

根据距离的定义:

(sx + vx * t) ^ 2 + (sy + vy * t) ^ 2 = (t * v2) ^ 2

将此相乘并重新排序项得出:

  sx^ 2 + 2 * sx * vx * t + vx^2 * t^2
+ sy^ 2 + 2 * sy * vy * t + vy^2 * t^2
-                           v2^2 * t^2
= 0

i.e.

  sx^2 + sy^2 + (2 * sx * vx + 2 * sy * vy) * t + (vx^2 + vy^2 - v2^2) * t^2 = 0
  \---   ---/   \------------   ----------/       \--------   ------/
      \ /                    \ /                           \ /
       c                      b                             a

正如您所看到的,这是一个 t 的二次方程。我们可以简单地应用二次公式 http://en.wikipedia.org/wiki/Quadratic_equation#Quadratic_formula找到两个可能的值t(如果方程无解,那是因为不可能截取)。您可能想要使用最早的未来拦截,即 > 0 的较小 t。

一旦你计算出t,找到拦截点并从中确定拦截方向应该很容易。

总而言之,这个问题可以在常数时间内解决,不需要迭代。

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

找到两个移动物体的更好交点 的相关文章

随机推荐

  • 在javascript中调用c#函数[重复]

    这个问题在这里已经有答案了 可能的重复 从 Javascript 调用 ASP NET 函数 https stackoverflow com questions 3713 call asp net function from javascr
  • Zend_Controller_Router_Route:找不到翻译器

    我正在开发一个多语言应用程序 在引导程序中有路由设置 protected function initRoutes this gt bootstrap frontController router this gt frontControlle
  • 使用 PrimarySearcher.FindAll() 时出现内存泄漏

    我也有一个使用插件和应用程序域长时间运行的服务 并且由于使用目录服务而出现内存泄漏 请注意 我正在使用 system directoryservices accountmanagement 但据我了解 它使用相同的底层 ADSI API 因
  • Spring WebFlux - 通过 webClient 转发 FilePart

    我浏览过类似的门票 即如何在 Spring WebFlux 中从 Multipart form data 流式传输文件 https stackoverflow com questions 70408075 how to stream fil
  • 在 Python 中删除表达式树及其每个子表达式树中第一个元素周围的括号

    目标是实现简化操作 删除表达式树及其每个子表达式树中第一个元素周围的括号 其中表达式作为括在各个括号中的字符串输入给出 这必须适用于任意数量的括号 例如 12 3 45 6 gt 123 45 6 删除 12 周围的括号 然后删除 45 周
  • 在 QtCreator 中查看数组内容

    调试时是否可以在 Qt Creator 中查看数组的内容 似乎检测到我的数组是一个数组而不是一个指针 此外 我可以点击一个箭头 就像展开一样 但之后什么也没有显示 当我试穿的时候std vector Qt Creator 设法按预期显示内容
  • Lucene 评分:在什么情况下使用 queryNorm?

    我对 lucene 的评分策略有点困惑 我知道Lucene的评分公式是这样的 score q d coord q d x queryNorm q X SUM
  • ASP.NET Core Web API 模板中没有个人用户帐户身份验证选项

    我有点困惑为什么最新的 ASP NET Core Web API 模板中没有个人用户帐户身份验证选项 是否仍然可以按照 MVC 模板的方式实现个人用户帐户 或者是否有意义 假设我正在创建一个独立的 Web API 它将包含我的所有业务逻辑和
  • Django FileResponse PDF - 前端的 pdf 字体更改 - (Django DRF 和 React.js)

    我在我的应用程序中使用 Django Rest Framework 和 React js 作为应用程序的一部分 我在后端生成 pdf 然后将它们发送到前端进行显示 这个功能是有效的 如果不是因为我的前端 pdf 中的字体看起来不同的话 在我
  • Django url模式多个参数(不带pk)

    我是 Django 框架的新手 有一件事困扰着我 我想要一个简单的休息电话 www abc com users 1 cantonments 1 如果我在 url 模式中使用 pk 则一切都可以开箱即用 pk pk1 pk2 但我有一些权限功
  • 如何使用 python / pywinusb 将 hid 数据发送到设备?

    我正在尝试使用 pywinusb 将输出报告发送到 pic18f4550 该设备可以接收数据 我已经使用 C 应用程序对其进行了测试 效果很好 另外 我可以使用 pywinusb 从设备读取数据 但我在尝试发送数据时遇到问题 这是我正在运行
  • 在 Flutter 中更改深色模式的文本颜色(带有动态主题)?

    当我选择深色模式时 文本变成白色 但我想将所有文本设置为白色70或其他内容 包括按钮和常规文本 如何定义深色模式的默认文本颜色 我的主题数据现在是这样的 class MyApp extends StatelessWidget overrid
  • aspnet_Profiles 表中的 PropertyValuesString 和 PropertyValuesBinary 字段有何用途?

    我认为 PropertyValuesString 用于通常是这些类型对象的键值对的值部分 但是 如果您已经将值放入 PropertyValuesString 中 那么 PropertyValuesBinary 字段会出现在哪里呢 这两个字段
  • 在 Winforms 中,PreviewKeyDown() 从未针对任何键触发

    我最初试图让我的程序获取箭头键 上 下 左 右 的输入 但发现在 KeyDown 中这些键从未出现过 后来我发现我可以通过进入 PreviewKeyDown 函数并设置来启用箭头键 e IsInputKey true 及其周围的任何条件和逻
  • 使用 powershell 在 MS-Access 中创建查询

    我需要自动从 Microsoft Access DB 中提取一些数据 数据库是由第三方提供给我的 因此我无法控制收到数据库时的内容 我需要使用 Powershell 自动从数据库中提取数据 有没有办法使用powershell在accessD
  • 隐藏错误报告窗口

    我有以下问题 我的 ASP Net 应用程序接收简单控制台程序的 C 源代码 使用 cl exe 命令行 VC 编译器 对其进行编译 并使用 System Diagnostics Process 运行它 ASP Net应用程序运行在PC上
  • 蓝牙连接;无法正确发送字符串

    当我需要将字符串从服务器蓝牙套接字发送到客户端蓝牙套接字时 我的程序遇到了麻烦 只要我一次只发送一个字符串 例如聊天 一切都可以正常工作 但是如果我需要在短时间内编写更多字符串 以交换信息 则字符串将不会与客户端代码分离 例如 如果我发送
  • lua中的权限问题

    是否需要在 corona build settings 中设置一些特定权限才能将高分永久保存在文件中 每次运行代码时都会出现 权限被拒绝 的错误 如何纠正这个错误 这是我尝试过的代码 function read score local f1
  • 如何将焦点设置到 Windows 窗体应用程序中的控件?

    在 Windows 窗体应用程序中 when我是否编写代码以在应用程序启动时以及随后调用函数后将焦点设置到控件 例如 如果我有一个 DropDownList 一个 TextBox 和四个按钮 并且我希望将 Focus 设置为 DropDow
  • 找到两个移动物体的更好交点

    我想极大地优化我的算法之一 我将尽力以最好的方式解释它 主题 我们当时处于二维欧几里德系统中t 0 在这个系统中有两个对象 O1 and O2 O1 and O2分别位于点PA and PC O1移动于常数和已知点方向的速度PB 当物体到达