python - 如何将向量钳位在某个量级内?
问题描述
给定一个速度向量v = [vx, vy]
,我们如何限制它的大小v
使其小于或等于某个最大幅度maxm
?
IEsqrt(v[0]**2 + v[1]**2) <= maxm
为了保持速度矢量的方向,v[0]
应该v[1]
乘以相同的数。
什么 Python 代码可以实现这一点?
解决方案
从概念上讲:
- 除以范数,所以你有一个单位长度的向量。
- 乘以原始规范的最小值和最大值。
In [5]: import math
...: def clamp_norm(v, n_max):
...: vx, vy = v
...: n = math.sqrt(vx**2 + vy**2)
...: f = min(n, n_max) / n
...: return [f * vx, f * vy]
In [6]: clamp_norm([0.5, 0.5], 1)
Out[6]: [0.5, 0.5]
In [7]: clamp_norm([0.5, 0.5], 0.5)
Out[7]: [0.35355339059327373, 0.35355339059327373]
推荐阅读
- android - 为什么同一个本机线程似乎从不同的 Java 线程调用方法?
- typescript - 带有 Typescript 3.8.3 的 Angular 9 是默认支持 IE 中的可选链接,而无需更改 polyfill (core-js)?
- r - 我已将 r shiny 文件中的变量分配给全局环境,但我的脚本文件无法访问它
- ansible - Ansible 解析我的 YML 注释并将其误认为 k=v
- r - `UseMethod()` 与 `inherits()` 在 R 中确定对象的类
- sql - 从 2 个不同表的 2 列创建一列
- angular - Angular 8:在通过 HTTP 调用获取所需数据后渲染子组件
- android - 如何让谷歌播放过滤我的平板电脑应用
- r - 过滤所有小于 x 的行,所有后续值也小于 x
- r - R中的Kolmogorov-Smirnov检验 - For-loop