好吧,所以说我得到了一个由Thing A的x,y,宽度和高度组成的矩形(这是2d)。我怎么计算它是正常的?
答案 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)
将定义矩形边缘的矢量作为您想要穿过的矢量。
答案 3 :(得分:1)
小心点。矩形有两种可能的法线:
在飞机上它有4个法线:
答案 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);