【问题标题】:Add random spread to directional vector向方向向量添加随机传播
【发布时间】:2013-11-17 07:50:10
【问题描述】:

假设我有一个单位向量 a = Vector(0,1,0),我想在 x = Vector(-0.2,0,-0.2) 和 y = Vector(0.2, 0,0.2),我该怎么做呢?

如果我只是在 x 和 y 之间生成一个随机向量,我会在正方形边界的某个地方得到一个值:

我想要的是由 x 和 y 组成的圆圈内的值:

这似乎是一个简单的问题,但我现在无法找到解决方案。任何帮助将不胜感激。

(我没有在 mathoverflow 上问这个问题,因为这不是一个真正的“研究级数学问题”)

【问题讨论】:

    标签: vector spread


    【解决方案1】:

    如果我正确阅读了您的问题,您需要一个随机方向的向量,该向量在特定长度(圆的半径)内。

    圆的公式是:x2 + y2 = r2

    所以,如果你有一个最大半径 r,它限制了矢量长度,也许可以这样处理:

    1. 为 x 选择一个随机值,介于 -r 和 +r
    2. 根据您选择的 x 计算随机化 y 的限制,因此 ylim = sqrt(r 2 - x2)
    3. 最后,在 -ylim 和 +ylim 之间选择一个随机值 y

    这样,您在 x 中得到一个随机方向,在 y 中得到一个随机方向,但向量长度将保持在 0 到r 等将被限制在该半径的圆内。

    在您的示例中,似乎 r 应该是 sqrt(0.22) 大约是 0.28284 .

    更新

    由于 3D 向量具有长度(或大小)sqrt(x2+y2+z2) 您可以将该技术扩展到 3D,尽管我可能更喜欢不同的方法(这也适用于 2D)。

    1. 通过选择 any x、y 和 z 来选择随机方向
    2. 计算震级m = sqrt(x2+y2+z2)
    3. 归一化方向向量(通过将每个元素除以其大小),因此 x = x/m、y = y/m、z=z /米
    4. 现在选择一个随机长度,L 介于 0 和 r 之间
    5. 按随机长度缩放方向矢量。所以 x = x * L、y = y * L、z = z * L

    【讨论】:

    • 谢谢,成功了。如果我想为 3 个轴执行此操作,是否足以执行 zLim = sqrt(r² -x² -y²) 并使用它为第三轴?我不完全确定这是否会给所有 3 个轴均等的机会?
    • @Silverlan 查看更新的答案,总体而言这可能是更好的方法。
    猜你喜欢
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    相关资源
    最近更新 更多