鉴于两个点a
和b
加上两个向量v
和u
我想找到第三个点c
,这是交点以下列方式:
vector2 intersection(vector2 a, vector2 v, vector2 b, vector2 u)
{
float r, s;
a + r * v = b + s * u;
r * v - s * u = b - a
r * v.x - s * u.x = b.x - a.x
r * v.y - s * u.y = b.y - a.y
}
除了使用高斯消除来解决这个系统,还有其他方法吗?或者这是处理这个问题的最佳(或至少是可接受的)方法吗?
修改:
vector2
typedef union vector2
{
float v[2];
struct { float x, y; };
} vector2;
a
和b
也属于vector2
,因为点和矢量之间的唯一区别在于它是通过仿射变换转换的方式。
答案 0 :(得分:1)
对我来说看起来像是一个分配问题。这是帮助您编写代码的逻辑。
让我们将第一个Ray称为R0
R0
上某个点的位置定义为P
:
P = P0 + alpha x V0
对于第二条射线R1
:
P = P1 + beta x V1
因为它们应该相交:
P0 + alpha x V0 = P1 + beta x V1
alpha
和beta
是未知数,我们在x
任意y
中有两个等式。
解决未知问题并找回交叉点。
即,
P0.x + alpha * V0.x = P1.x + beta * V1.x
P0.y + alpha * V0.y = P1.y + beta * V1.y
解决alpha
和beta
。
如果alpha
和beta
都有真正的正解,则光线相交
如果alpha
和beta
都存在真实但至少有一个否定解决方案,则延伸光线相交。
答案 1 :(得分:1)
这是简单的数学。
但是,首先,检查你是否有路口。如果两个向量都是并行的,那么你将无法解决:
// Edit this line to protect from division by 0
if (Vy == 0 && Uy == 0) || ((Vy != 0 && Uy != 0 && (Vx/Vy == Ux/Uy)) // => Fail.
然后(我想显示计算因为它们很长但是):
R = (AxUy - AyUx + ByUx - BxUy) / (VyUx - VxUy)
S = (Ax - Bx + RVx) / Ux
希望能帮到你。