首页 > 解决方案 > 如何将向量钳位在某个量级内?

问题描述

给定一个速度向量v = [vx, vy],我们如何限制它的大小v使其小于或等于某个最大幅度maxm

IEsqrt(v[0]**2 + v[1]**2) <= maxm

为了保持速度矢量的方向,v[0]应该v[1]乘以相同的数。

什么 Python 代码可以实现这一点?

标签: python

解决方案


从概念上讲:

  1. 除以范数,所以你有一个单位长度的向量。
  2. 乘以原始规范的最小值和最大值。
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]

推荐阅读