由点指定的两条无限直线的交点

Intersection of two infinite lines specified by points

这里已经提出并回答了很多类似的问题,但是在浏览它们之后 none 很好地解决了我的问题。我正在寻找一种可靠的算法来找到每条由两个点指定的两条无限线的交点。就我而言,有两个并发症:

  1. 保证交点位于指定每条线的两个顶点之间(这意味着像this one这样的解决方案将不起作用),并且
  2. 这些线可以在二维平面中任意定向,这意味着基于斜率和截距的解决方案并不总是有效(因为其中一条线可以垂直定向,产生无限的斜率和截距)

我目前的方法说明了基于斜率和截距的方法的缺点。这个问题可以通过实施一个旋转整个系统的步骤来部分规避,所以没有一条线是垂直的,但这看起来不是很优雅。你知道更好的方法吗?

import numpy as np

# The intersection point of the example below should be (0,0)

# Vertices for the first line
p1_start    = np.asarray([-5,   0])
p1_end      = np.asarray([-3,   0])

# Vertices for the second line
p2_start    = np.asarray([0,    4])
p2_end      = np.asarray([0,    2])

# Calculate slope and intercept for the first line
m_1         = (p1_end[1]-p1_start[1])/(p1_end[0]-p1_start[0])
t_1         = p1_start[1] - m_1*p1_start[0]

# The slope and intercept are zero
print('First line')
print('slope = '+str(m_1))
print('intercept = '+str(t_1))

# Calculate slope and intercept for the second line
m_2         = (p2_end[1]-p2_start[1])/(p2_end[0]-p2_start[0])
t_2         = p2_start[1] - m_2*p2_start[0]

# The slope and intercept are infinite
print('Second line')
print('slope = '+str(m_2))
print('intercept = '+str(t_2))

# Find out where these points interset
# Doesn't work if one of the slopes is infinite
intersection_point_x = (t_2-t_1)/(m_1-m_2)
intersection_point_y = intersection_point_x*m_1 + t_1
print('Intersection point')
print(intersection_point_x)
print(intersection_point_y)

跟随 AKX's solution, I have adapted the solution reported in his linked thread 进入一个简短的 Python 片段:

import numpy as np

# The intersection point of the example below should be (0,0)

# Vertices for the first line
p1_start    = np.asarray([-5,   0])
p1_end      = np.asarray([-3,   0])

# Vertices for the second line
p2_start    = np.asarray([0,    4])
p2_end      = np.asarray([0,    2])

p       = p1_start
r       = (p1_end-p1_start)

q       = p2_start
s       = (p2_end-p2_start)

t       = np.cross(q - p,s)/(np.cross(r,s))

# This is the intersection point
i       = p + t*r

为什么不使用,sympy 几何模块。 下面是代码。

import sympy as sy
import sympy.geometry as gm
sy.init_printing()
line1=gm.Line(gm.Point(1,1),gm.Point(8,5)) #Line1
line2=gm.Line(gm.Point(30,4),gm.Point(35,-4)) #Line2
 #These are two infinite lines defined by two points on the line
intersection=line1.intersection(line2)
print(intersection[0].evalf())

Lines intersection