我知道A,B和C的坐标..我也知道一个源自C的矢量V ..
我知道矢量与A和B相交,我只是不知道如何找到i。
有人能解释解决这个问题所涉及的步骤吗?
非常感谢。
答案 0 :(得分:3)
如果你知道A和B,你知道AB线的等式,你说你知道V,所以你可以形成线V的等式....我只是满足这两个方程的点。
AB线的公式:
(bx-ax)(Y-ay) = (by-ay)(X-ax)
如果你编辑矢量的方向(或斜率= m),以及位于矢量上的任何点,那么矢量V的线的方程是
Y = mX = b
其中m是直线的斜率或方向,b是横穿垂直y =轴的y坐标(其中X = 0)
如果你知道线上的一个点(即C =(s,t),那么你通过以下方式解决b:
t = ms + b ==> b = t - ms
,
所以等式成为
Y = mX + t-ms
答案 1 :(得分:1)
i = C+kV Lets call N the normal to the line A,B so N = [-(B-A).y, (B-A).x] Also, for any point on the line: (P-A)*N = 0 -- substitute from line 1 above: (C+kV-A)*N = 0 (kV+C-A)*N = 0 kV*N + (C-A)*N = 0 kV*N = (A-C)*N k = [(A-C)*N]/V*N Now that we have k, plug it into line 1 above to get i.
这里我使用*表示点积,因此扩展到常规乘法:
k = ((A.x-C.x)*-(B.y-A.y) + (A.y-C.y)*(B.x-A.x)) / (V.x*-(B.y-A.y) + V.x*(B.x-A.x)) I.x = C.x + k*V.x I.y = C.y + k*V.y
除非我搞砸了......
答案 2 :(得分:0)
简单代数。困难的部分通常只是写下基本的方程式,但一旦写下来,其余的很容易。
你能定义一条从C = [c_x,c_y]点发出的线,以及沿矢量V = [v_x,v_y]的点吗?表示这样一条线的一种好方法是使用参数化表示。因此,
V(t) = C + t*V
就矢量元素而言,我们将其作为
V(t) = [c_x + t*v_x, c_y + t*v_y]
看看它是如何工作的。当t = 0时,我们得到C点,但是对于t的任何其他值,我们得到了一些其他点。
通过A和B的线段怎么样?解决该问题的一种方法是以相同的方式参数化地定义第二条线。然后求解两个未知数的两个方程组来找到交点。
更简单的方法是查看线段AB的法线向量。该向量以
给出N = [b_y - a_y , a_x - b_x]/sqrt((b_x - a_x)^2 + (b_y - a_y)^2)
请注意,N在此定义为具有单位规范。
所以现在,我们何时知道一个点是否恰好位于连接A和B的线上?这很容易。当下面定义的点积恰好为零时,就会发生这种情况。
dot(N,V(t) - A) = 0
展开它,并求解参数t。我们可以使用点积来写下来。
t = dot(N,A-C)/dot(N,V)
或者,如果您愿意,
t = (N_x*(a_x - c_x) + N_y*(a_y - c_y)) / (N_x*v_x + N_y*v_y))
一旦我们有了t,用上面的表达式代替V(t)。让我们在实践中看到所有这些工作。我会选择一些点A,B,C和矢量V。
A = [7, 3]
B = [2, 5]
C = [1, 0]
V = [1, 1]
归一化后,我们的法向量N看起来像
N = [0.371390676354104, 0.928476690885259]
然后,行参数t为
t = 3.85714285714286
我们发现交叉点为
C + t*V = [4.85714285714286, 3.85714285714286]
如果你在一张纸上绘制点,它们应该完全融合在一起,而且只用几个简单的表达式。