2012-11-13 53 views
1

enter image description here我如何计算载体的相反,添加一些松弛

我怎样才能calulate我对象(BLACK)行驶方向(绿色)的有效范围(RED)。绿色是Vector2,其中x和y的范围是-1到1.

我在这里要做的是创建火箭燃料燃烧效应。因此,我得到的是

  • 火箭速度(浮点)
  • 火箭方向(Vector2 X = [1,1],Y = [ - 1,1])

我可能会认为火箭的速度并不重要,因为燃油燃烧效应(粒子)是以自己的速度在位置上产生的。

+0

我想你可以将它移入数学网站?这个问题涉及到一些代数和三角。 – CyberDude

+0

火箭科学;)你是否试图通过给定的点来计算与飞机垂直的矢量? – bonCodigo

+0

[一个帖子得到一个想法](http://stackoverflow.com/questions/11650339/find-perpendicular-line-and-its-intersection-to-a-rectangle) – bonCodigo

回答

4

与2D向量A便宜欢快的关键是要调换x和y,然后翻转他们的一个标志,以获得垂直矢量(伪代码):

Vector2 perpendicular (-original.y, original.x) // Or original.y, -original.x 

那么你可以做什么像:

direction + perpendicular * rand(-0.3 , 0.3) 

更新:已经意识到问题问的相反矢量我想我有更好的回答太(忙着看图片!)。将方向乘以-1以得到相反的向量。所以这个:

perpendicular * rand(-0.3 , 0.3) - direction 

应该的地方给你一个随机的方向向量在你的范围内(不归,但足够接近这些目的)。然后,您可以将结果乘以一个随机数,具体取决于您想要拖尾的时间。

+1

垂直是不是(original.y,-original.x)或(-original.y,original.x) – cyon

+0

是的,你是完全正确的。我会更新我的答案 – OlduwanSteve

0

如果要花费在OlduwanSteve的答案上,你可以使它在物理上有些准确。

您想要创建几个表示驱逐(红线)的向量。
首先定义要表示驱逐的向量的数量 - 让它标记n。

你想得到一组n个总和为Vx的数字。这些数字将是排出矢量的x分量。你可以这样做(半伪代码):

SumX = Vx; 
for (i = 0; i < n; i++) 
{ 
    Ax[i] = -rand(0..SumX); // Ax is the array of all expulsion vectors x components 
    SumX -= Ax[i]; 
} 

现在你要计算Ay(驱逐向量的y分量)。除了SumY = 0之外,这与计算十分相似。

这里不是将n个元素中的SumY分开,而是需要决定最大y分量。我可以想到的最佳方式是选择这个最大允许角度,并使用以下公式来定义最大Vy:maxVy = minVx * tan(maxAlpha)。

现在你可以使用这个(半伪代码)好哦:

SumY = maxVy*2; // The actual range is (-maxVy, maxVy), but using (0, 2*maxVy) is simpler IMO 
for (i = 0; i < n; i++) 
{ 
    Ay[i] = rand(0..SumY); 
    SumY -= Ay[i]; 
} 
for (i = 0; i < n; i++) 
{ 
    Ay[i] -= maxVy; // Translate the range back to (-maxVy, maxVy) from (0, 2*maxVy) 
} 

现在你有x和驱逐向量的y分量两者的阵列。迭代两个数组并将元素配对以创建向量(您不必按相同顺序迭代两个数组)。

注:
我对齐的轴发生了我的计算,使得X是平行于所述物体的速度矢量(绿线)。 •maxVy的计算确实是不是保证将生成一个角度为maxAlpha的矢量,它只能保证没有大角度的矢量。 •线条Ay [i] = rand(0..SumY)和Ax [i] = -rand(0..SumX)可能会导致大小为0的矢量。这可能会导致令人讨厌的场景,我会建议处理这种情况(例如,“兰德返回零,再次调用它”)。