【问题标题】:How to find the intersection of two lines given a point on each line and a parallel vector给定每条线上的一个点和一个平行向量,如何找到两条线的交点
【发布时间】:2017-06-07 11:12:48
【问题描述】:

我需要一种可以找到两条二维线交点的算法。每条线将以线上的一个点和平行向量的 dx/dy 的形式出现。我尝试对每条线进行参数化并求解方程组以求解参数化变量,我可以将其插入线的参数方程并得到我的 x/y,但我的尝试失败了。有任何想法吗?我正在使用 Python 编程,但语言并不重要。

【问题讨论】:

  • “但我的尝试失败了” - 如果只有 某种 方式我们可以看到您的尝试?这对我们来说是有用的信息,是吗? :-)
  • “平行向量的 dx/dy”是什么意思?你的意思是给你线的斜率(因为平行线有相同的斜率),或者线的方向向量,还是别的什么?我们确实需要看到你在这个问题上所做的工作的证据,如果没有别的,那么我们就可以看到失败的地方。
  • @paxdiablo - 哇,太咸了。但是当然。我只是没有包括它,因为它又长又坏。我从 x=x1+t1*dx1, y=y1+t1*dy1, x=x2+t2*dx2, y=y2+t2*dy2. after solving the system of equations I ended with t2=(x2dy1-x1dy1-y1y2dx1) / (dy2dy1-dx1dy2). 开始,当我尝试使用以下值时:(x1,y1)=(0,0), (x2,y2)=(1,1), (dx1,dy1)=(1,0), (dx2,dy2)=(0,-1) 我在 t2 方程的底部得到一个 0。

标签: python algorithm math graphics intersection


【解决方案1】:

你基本上必须解决以下方程:

x = x0,a+dxa×t
y = y0,a+dya×t
x = x0,b+dxb×u
y = y0,b+dyb×u

或者:

x0,a+dxa×t = x0,b+dxb×u
x0,a+dxa×t = x0,b+dxb×u

现在如果你做一些代数操作,你会发现:

t=dyb×(x0,b-x0,a)-dxb ×(y0,b-y0,a)/d
u=dya×(x0,b-x0,a)-dxa×(y 0,b-y0,a)/d;在哪里
d=dxa×dyb-dxb×dya

因此,现在只需确定tu(您不必同时计算两者),然后代入上述公式即可。所以

def intersect(x0a,y0a,dxa,dya,x0b,y0b,dxb,dyb):
    t = (dyb*(x0b-x0a)-dxb*(y0b-y0a))/(dxa*dyb-dxb*dya)
    return (x0a+dxa*t,y0a+dya*t)

如果等式(分母)中的d 等于0,这意味着没有交点(两条线平行)。您可以决定更改函数,例如在这种情况下返回 None 或引发异常。

如果您对其进行测试,例如使用矢量 (1,0) 偏移和方向 (0,1);以及具有偏移量 (0,2) 和方向 (1,1) 的向量;你得到的结果并不令人惊讶:

$ python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> def intersect(x0a,y0a,dxa,dya,x0b,y0b,dxb,dyb):
...     t = (dyb*(x0b-x0a)-dxb*(y0b-y0a))/(dxa*dyb-dxb*dya)
...     return (x0a+dxa*t,y0a+dya*t)
... 
>>> intersect(1,0,0,1,0,2,1,1)
(1.0, 3.0)

【讨论】:

  • 如果我能给你的答案投票 10 次,我会的。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-28
  • 1970-01-01
  • 2013-01-18
  • 2016-03-24
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多