控制加速度直到到达某个位置的算法

2024-04-04

我有一个可以移动的点(在一维),并且我需要它平滑地移动。所以我认为它的速度必须是一个连续函数,我需要控制加速度,然后计算它的速度和位置。

该算法对我来说似乎并不明显,但我想这一定是一个常见问题,我只是找不到解决方案。

Notes:

  • 对象在移动时的最终目的地可能会发生变化,并且无论如何移动都需要平滑。
  • 我想天真的实现会产生弹跳,我需要避免这种情况。

这是使用“临界阻尼弹簧”的完美候选者。

从概念上讲,您可以使用弹簧或松紧带将该点连接到目标点。弹簧受到阻尼,因此不会“弹跳”。您可以通过更改称为“SpringConstant”的常数来控制系统的反应速度。这本质上就是松紧带的强度。

基本上,您向该位置施加两个力,然后随着时间的推移对其进行积分。第一个力是弹簧施加的力,Fs = SpringConstant * DistanceToTarget。第二个是阻尼力,Fd = -CurrentVelocity * 2 * sqrt( SpringConstant )。

CurrentVelocity 构成系统状态的一部分,并且可以初始化为零。

在每个步骤中,将这两个力的总和乘以时间步长。这会改变 CurrentVelocity 的值。再次乘以时间步长,就可以得到位移。

我们将其添加到该点的实际位置。

在 C++ 代码中:

float CriticallyDampedSpring( float a_Target,
                              float a_Current,
                              float & a_Velocity,
                              float a_TimeStep )
{
    float currentToTarget = a_Target - a_Current;
    float springForce = currentToTarget * SPRING_CONSTANT;
    float dampingForce = -a_Velocity * 2 * sqrt( SPRING_CONSTANT );
    float force = springForce + dampingForce;
    a_Velocity += force * a_TimeStep;
    float displacement = a_Velocity * a_TimeStep;
    return a_Current + displacement;
}

在我使用的系统中,大约 5 的值是开始试验弹簧常数值的好时机。设置太高会导致反应太快,设置太低会导致反应太慢。

请注意,您可能最好创建一个保持速度状态的类,而不必一遍又一遍地将其传递到函数中。

我希望这对您有帮助,祝您好运:)

EDIT:如果它对其他人有用,可以很容易地将其应用到 2 或 3 维。在这种情况下,您只需为每个维度独立应用一次 CriticallyDampedSpring。根据您想要的运动,您可能会发现在极坐标(对于 2D)或球坐标(对于 3D)中工作更好。

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

控制加速度直到到达某个位置的算法 的相关文章

  • 在哪里可以找到有关双三次插值和 Lanczos 重采样的好读物?

    我想用 C 实现上述两种图像重采样算法 双三次和 Lanczos 我知道现有的实现有几十种 但我仍然想制作自己的实现 我之所以这么做 部分原因是我想了解它们是如何工作的 部分原因是我想为它们提供一些主流实现中没有的功能 例如可配置的多 CP
  • 比较两棵树的伪代码

    这是我遇到过几次的问题 并且不确信我使用了最有效的逻辑 例如 假设我有两棵树 一棵是文件夹结构 另一棵是该文件夹结构的内存 模型 我希望比较两棵树 并生成一棵树中存在的节点列表 而不是另一棵树中存在的节点列表 反之亦然 是否有公认的算法来处
  • SymPy 和 Sage 有什么区别?

    有什么区别SymPy http www sympy org and Sage https www sagemath org 又名 SageMath 全面披露 我是 SymPy 的首席开发人员 您应该了解的第一件事是 SymPy 和 Sage
  • 算法:找到圆中的峰值

    Given n排列成圆圈的整数显示了一种可以找到一个峰值的有效算法 峰值是不小于它旁边的两个数字的数字 一种方法是遍历所有整数并检查每个整数以查看它是否是峰值 这产生O n 时间 似乎应该有某种方法来分而治之 以提高效率 EDIT 好吧 基
  • 最低共同祖先算法

    所以我一直在研究实现最低共同祖先算法 我研究了许多不同的算法 主要是 Trajan 解决方案的变体或 RMQ 的变体 我正在使用非二叉树 我的树经常会在查询之间发生变化 因此预处理不一定值得 树的节点数不应超过 50 75 个 我想知道的是
  • 确保 unsigned int/long 始终在 C# 中的检查上下文中执行

    有没有人觉得奇怪 uint 和 ulong 的默认上下文是未检查的 而不是检查的 因为它们旨在表示永远不能为负的值 因此 如果某些代码试图违反该约束 在我看来 自然且首选的行为是抛出异常 而不是返回最大值 这很容易使重要数据处于无效状态并且
  • 随机排列

    我无法找到一种随机洗牌元素的好方法std vector经过一些操作后 恢复原来的顺序 我知道这应该是一个相当简单的算法 但我想我太累了 由于我被迫使用自定义随机数生成器类 我想我不能使用std random shuffle 无论如何这没有帮
  • 如何计算一组字符串的最短唯一前缀?

    这是一个非常常见的算法命令行解析 给定一组预定义的长选项名称 计算唯一标识这些选项之一的最短前缀 例如 对于以下选项 help hostname portnumber name polymorphic 这将是输出 he ho por n p
  • 加权图的 BFS 算法 - 寻找最短距离

    我看过很多帖子 即 post1 https stackoverflow com questions 30409493 using bfs for weighted graphs post2 https cs stackexchange co
  • 打印从 1 到 100 的质数

    此 C 代码打印出以下素数 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 但我不认为这就是我的书所希望的写作方式 它提到了一些关于数字的平方根的内容
  • 查找数组中的重叠数据

    我们正在编写一个 C 应用程序 它将有助于删除不必要的数据重复器 只有在以下情况下才可以移除中继器 all它接收到的数据被其他中继器接收 我们第一步需要做的事情解释如下 例如 我有 int 数组的集合 A 1 2 3 4 5 b 2 4 6
  • 为什么使用 no-op 来填补 paxos 事件之间的空白是合法的?

    我正在学习Paxos算法 http research microsoft com en us um people lamport pubs paxos simple pdf http research microsoft com en us
  • 读取4个点的坐标。他们做一个正方形吗?

    我计算点之间的距离 如果距离相等 则点构成一个正方形 否则不 仅当我按以下顺序读取坐标 A x y B x y C x y D x y 或相反时 我的代码才有效 但是如果我这样读 例如 A x y B x y D x y C x y 它将不
  • 让电脑实现360度=0度,旋转炮塔

    我正在制作一个游戏 其中有一个计算机控制的炮塔 炮塔可360度旋转 它使用 trig 找出枪瞄准所需的角度 obj deg 并将枪的当前角度存储在 gun deg 下面的代码以设定的速度旋转枪 if objdeg gt gundeg gun
  • 广度优先搜索:检查访问状态的时机

    在有向图的广度优先搜索中 可能循环 当一个节点出队时 其所有尚未访问的子节点都会入队 并且该过程将继续 直到队列为空 有一次 我以相反的方式实现它 将节点的所有子节点排队 并在节点出队时检查访问状态 如果正在出队的节点之前已被访问过 则该节
  • 哪种算法可以有效地找到路径一定距离内的一组点?

    给定一组点s 一组 x y 坐标 和由连接一组点的线段组成的路径l 描述一种有效的算法 可用于从s在指定距离内d路径的l 其实际应用可能是查找沿城市之间的公路旅行路径 10 英里内任意位置的餐馆列表 For example in the f
  • 从数字列表中生成所有唯一对,n 选择 2

    我有一个元素列表 假设是整数 我需要进行所有可能的两对比较 我的方法是 O n 2 我想知道是否有更快的方法 这是我在java中的实现 public class Pair public int x y public Pair int x i
  • 几何:找到两点之间特定距离的点

    这类似于这个问题 https stackoverflow com questions 328107 how can you determine a point is between two other points on a line se
  • 为什么对本地列表求和比用“GHC -O2”对教会编码列表求和慢?

    为了测试教会编码的列表如何针对用户定义的列表和本机列表执行 我准备了 3 个基准测试 用户定义的列表 data List a Cons a List a Nil deriving Show lenumTil n go n Nil where
  • 期望最大化算法的数值示例[重复]

    这个问题在这里已经有答案了 由于我不确定给出的公式 有人可以提供 EM 算法的简单数字示例吗 一个非常简单的具有 4 或 5 个笛卡尔坐标的坐标就可以了 那这个呢 http en wikibooks org wiki Data Mining

随机推荐

  • jQuery 提交 ajax 表单,带有 2 个提交按钮

    我试图实现以下目标 在 php 中我有一个这样的表单
  • 我可以将自定义对象发送到 Android Wear 吗?

    我刚刚学习如何为 Android Wear 进行开发 我已经为智能手表创建了一个全屏活动 在应用程序的移动部分中 我获取了一些 JSON 数据并从中创建了自定义对象列表 在我的移动应用程序上 我在 ListView 中显示这些对象的信息 在
  • 在 Rust 中将原始指针转换为 16 位 Unicode 字符到文件路径

    我正在用 Rust 编写的 DLL 替换用 C 编写的 DLL 目前DLL中的函数调用如下 BOOL calledFunction wchar t pFileName 我相信在这样的背景下wchar t是一个 16 位 Unicode 字符
  • 是否可以在Azure中运行npx工具来执行包

    是否可以运行npx工具来执行Azure App服务 Web应用程序 中的包 我在用 节点 v10 19 0 npm v6 13 4 如果我在本地计算机上浏览到 nodejs 我可以看到 npx cmd 工具 但如果我在 azure 中执行相
  • Textmate for Ruby 自动完成?

    我真的很习惯 Netbeans 的自动完成功能 在 Netbeans 中 当我键入 字符串 然后点击 点 时 它将打印出 String 类的方法列表 TextMate好像没有这个功能 您可以添加什么吗 会节省很多时间 而不是一直使用 ri
  • 在列表视图上方添加图像

    我想在列表视图上方添加图像视图 我知道在列表视图中添加部分听者 但我只是想节省时间 所以我使用图像视图作为列表视图标题 而不是使用 addSectionHeader 不幸的是我只是坚持使用一些 xml 属性 图像叠加在我的列表视图中 实际上
  • 我正在尝试获取 Apple Music API 的用户令牌,我已经从 python 终端命令生成了有效的开发人员令牌

    我正在我的 IOS 应用程序中第一次使用 Apple Music api 我已经在 python 命令的帮助下生成了开发者令牌 每次请求用户令牌时 我都会收到错误 请求用户令牌时发生错误 操作无法完成 SKErrorDomain 错误 7
  • 检查 arraytype 列是否包含 null

    我有一个数据框 其中有一列可以包含整数值的数组类型 如果没有值 它将只包含一个 并且它将是空值 重要的 注意该列不会为空 而是一个具有单个值的数组 无效的 gt val df DataFrame Seq foo Seq Some 2 Som
  • 在 TFS API 中将测试用例添加到 ITestSuiteBase

    我正在使用 TFS API 并遇到了 ITestSuiteBase 和 IRequirementTestSuite 的问题 我设法在 IStaticTestSuite 中轻松创建一个新的测试用例 IStaticTestSuite worki
  • 自动同步 Visual Studio 的类视图

    是否可以让 Visual Studio 的 类视图 窗格 在 视图 gt 类视图 下可用 自动同步到当前符号 基本上只要当前符号发生变化就会执行 View SynchronizeClassView See here https stacko
  • 其元数据的二进制版本是1.7.1,预期版本是1.5.1

    C Users khare gradle caches modules 2 files 2 1 org jetbrains kotlin kotlin stdlib common 1 7 0 51736992f422993a1e741051
  • KTable 应该发出的事件

    我正在尝试测试一个拓扑 该拓扑作为最后一个节点 具有 KTable 我的测试是使用成熟的 Kafka 集群 通过 confluence 的 Docker 镜像 所以我not使用TopologyTestDriver 我的拓扑有键值类型的输入S
  • 自定义设计signed_up_but_unconfirmed消息

    实际上我想自定义signed up but unconfirmed消息该消息是 A message with a confirmation link has been sent to your email address Please fo
  • 如何检查SuperTab和jedi-vim是否激活?

    正如标题所述 如何检查插件是否已加载 当我击中时tab 对于 SuperTab 我得到的只是插入到我的文件中的普通字符 tab 当我点击ctrl 空格键我只是被抛出插入模式 与点击相同的行为ESC The scriptnames命令列出所有
  • 办公文档设置

    我目前正在存储一个键值对Office context documents settings使用以下函数 Office context document settings set name value 存储键值对后 我将重新启动加载项并尝试使
  • 无法将 SQL 查询的结果传递给 JAVA 中的方法

    这是我第一次使用 Java 我很困惑 我创建了这个方法 List
  • 即使使用文档中的示例,也无法模拟打开

    我直接从 Python 复制并粘贴了以下代码模拟文档 https docs python org 3 library unittest mock html mock open from unittest mock import patch
  • 无法安装 MySQL-python

    好的 我最近从 Ubuntu 10 04 升级到 12 04 只会面临很多问题 我是这方面的新手 所以你可能需要更详细地或一步一步地告诉我 我有一个 django 项目运行完美 但现在它给了我这个错误 File usr local lib
  • 在 Fabric.js 中控制 z-index

    在fabricjs中 我想创建一个场景 其中鼠标下方的对象在z index中上升到场景的顶部 然后一旦鼠标离开该对象 它就会返回到它来自的z index 无法设置 object zindex 这很好 相反 我使用一个占位符对象 将其放入旧位
  • 控制加速度直到到达某个位置的算法

    我有一个可以移动的点 在一维 并且我需要它平滑地移动 所以我认为它的速度必须是一个连续函数 我需要控制加速度 然后计算它的速度和位置 该算法对我来说似乎并不明显 但我想这一定是一个常见问题 我只是找不到解决方案 Notes 对象在移动时的最