我该如何计算正常值?

时间:2011-03-29 17:19:10

标签: java math vector normalization

好吧,所以说我得到了一个由Thing A的x,y,宽度和高度组成的矩形(这是2d)。我怎么计算它是正常的?

8 个答案:

答案 0 :(得分:4)

青色,

您不是在寻找由叉积或3维定义的法线。一分钟,我会解释..

修改

this answer开始,很明显你所寻找的只是一条垂直于直线的向量。不是垂直于平面的矢量。

以数学方式评估

R = A - 2<A, N> N

您必须首先对Euclidean Vector明确了解。

给出矢量A(你的入射角):

A = <ax, ay> 

给定向量B(表示墙被弹回的向量):

B = <bx, by>

此向量的法线(垂直)简单地旋转90度。数学上:

N = <nx, ny> = <-bx, by>

因此R =

R = A - 2<A, N> N = ...

让我们先评估一下Dot Product

<A, N> = ax*nx + ay*ny = ax*(-bx) + ay*by = ay*by - ax*bx

然后:

R = <ax, ay> - 2*(ay*by - ax*bx) * N
  = <ax, by> - <2*(ay*by - ax*bx)*nx, 2*(ay*by - ax*bx)*ny>
  = <ax, by> - <2*(ay*by - ax*bx)*(-bx), 2*(ay*by - ax*bx)*(by)>
  = < ax + 2*bx*(ay*by - ax*bx), ay - 2*by*(ay*by - ax*bx) >

所以你需要做的就是确定一个代表你正在反弹的墙的矢量(这是B),以及你的事件Vector(它是A)。

编辑(因为评论):

你真的应该花时间回顾我发布到欧几里德矢量的链接......

基本思想是定义任意数学原点。 (比如说,墙壁的底部)。然后,表示墙壁的矢量只是一个箭头,从顶部到底部(或从底部到顶部)。对于在底部描述的原点,此箭头将指向x方向上的0个单位,但是在y方向上指向100个单位。因此,你的墙(B)矢量只是:

B = < 0, 100 >

(请注意,墙壁的宽度并不重要 - 它会以1px厚,50 px厚或100px厚的墙壁反弹。

但是你要对这个向量进行标准化,使其具有单位幅度(长度为1)。因此,向量变为:

B = <0, 1>

以下是:

Vector length = sqrt( bx^2 + by^2 ) = sqrt( 0^2 + 1^2 ) = 1

N是:

N = <1, 0>  // for the left hand side wall
N = <-1, 0> // for the right hand side wall

答案 1 :(得分:2)

如果“正常”是指垂直向量,请查看cross product:对于向量

<a1, a2, a3>

<b1, b2, b3>

交叉产品

<a2 * b3 - b2 * a3, a1 * b3 - b1 * a3, a1 * b2 - b1 * a2>

...纯2D中的“正常”没有多大意义。

答案 2 :(得分:1)

go google'Cross Product'。 (http://en.wikipedia.org/wiki/Cross_product)

将定义矩形边缘的矢量作为您想要穿过的矢量。

答案 3 :(得分:1)

小心点。矩形有两种可能的法线:

enter image description here

在飞机上它有4个法线:

enter image description here

答案 4 :(得分:0)

如果您的矩形在XY平面上,则法线为(0,0,1)。不需要代数!

答案 5 :(得分:0)

整个矩形的法线将垂直于矩形的平面(沿第三维)。

如果你的意思是矩形的正常(但与矩形在同一平面上),那么你可以计算边的斜率,法线的斜率将是负的它正常的一侧斜坡的倒数。 (如果边的斜率为零,则不确定。)如果你想将这个法线放在矩形上,那么边的中点就是它的好位置。

答案 6 :(得分:0)

正在寻找的氰化物是2D空间中1行的法线。

正常必须满足以下条件:

m_line * m_normal = -1

而m_line是线的大小,而m_normal是法线的大小。

=&GT; m_normal = -1 / m_line

如果m_line = 0,显然会产生错误。所以你需要专门处理这种情况。

如果m_line不为0,则会得到2D-Vector

normal_vector =(1,m_normal)

答案 7 :(得分:0)

2D中的法线是在对象中做90度的向量,在应该击中它的对象的相反方向上。

这些法线的固定值是:

West(1,0); 东(-1,0); 北(0,-1); 南(0,1);