Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vector 将随机排列添加到方向向量_Vector_Spread - Fatal编程技术网

Vector 将随机排列添加到方向向量

Vector 将随机排列添加到方向向量,vector,spread,Vector,Spread,假设我有一个单位向量a=vector(0,1,0),我想在x=vector(-0.2,0,-0.2)和y=vector(0.2,0,0.2)之间加一个随机排列,我该怎么做呢 如果我只是在x和y之间生成一个随机向量,我会得到一个值,在一个正方形的边界上: 我想要的是x和y组成的圆内的值: 这似乎是个简单的问题,但我现在想不出解决办法。任何帮助都将不胜感激 (我没有在mathoverflow上问这个问题,因为这不是一个真正的“研究级数学问题”)如果我读对了你的问题,你需要一个在特定长度(圆的半径

假设我有一个单位向量a=vector(0,1,0),我想在x=vector(-0.2,0,-0.2)和y=vector(0.2,0,0.2)之间加一个随机排列,我该怎么做呢

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

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

这似乎是个简单的问题,但我现在想不出解决办法。任何帮助都将不胜感激


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

如果我读对了你的问题,你需要一个在特定长度(圆的半径)内的随机方向上的向量

圆的公式是:x2+y2=r2

因此,如果你有一个限制向量长度的最大半径,r,也许可以进行如下操作:

  • x选择一个介于-r+r之间的随机值
  • 根据您选择的x,计算随机化y的限制,因此ylim=sqrt(r2-x2)
  • 最后,在-ylim+ylim之间选择一个随机值y
  • 这样,在x中获得一个随机方向,在y中获得一个随机方向,但向量长度将保持在0r之间,因此将被限制在该半径的圆内

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

    更新

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

  • 通过选择任意xyz
  • 计算震级m=sqrt(x2+y2+z2)
  • 将方向向量归一化(通过将每个元素除以其大小),因此x=x/my=y/mz=z/m
  • 现在在0r之间选择一个随机长度L
  • 按随机长度缩放方向向量。所以x=x*Ly=y*Lz=z*L

  • 如果我读对了你的问题,你需要一个在特定长度(圆的半径)内的随机方向上的向量

    圆的公式是:x2+y2=r2

    因此,如果你有一个限制向量长度的最大半径,r,也许可以进行如下操作:

  • x选择一个介于-r+r之间的随机值
  • 根据您选择的x,计算随机化y的限制,因此ylim=sqrt(r2-x2)
  • 最后,在-ylim+ylim之间选择一个随机值y
  • 这样,在x中获得一个随机方向,在y中获得一个随机方向,但向量长度将保持在0r之间,因此将被限制在该半径的圆内

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

    更新

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

  • 通过选择任意xyz
  • 计算震级m=sqrt(x2+y2+z2)
  • 将方向向量归一化(通过将每个元素除以其大小),因此x=x/my=y/mz=z/m
  • 现在在0r之间选择一个随机长度L
  • 按随机长度缩放方向向量。所以x=x*Ly=y*Lz=z*L

  • 谢谢,成功了。如果我想对3个轴执行此操作,那么执行zLim=sqrt(r²-x²-y²)并使用它为第三个轴生成一个随机值就足够了吗?我不完全确定这是否会给所有3个轴一个平等的机会?@Silverlan看到更新的答案,总体来说这可能是一个更好的方法。谢谢,这就成功了。如果我想对3个轴执行此操作,那么执行zLim=sqrt(r²-x²-y²)并使用它为第三个轴生成一个随机值就足够了吗?我不完全确定这是否会给所有3个轴一个平等的机会?@Silverlan看到更新的答案,总体来说这可能是一个更好的方法。