Python 交集:线段的交集

Python 交集:线段的交集,python,sympy,Python,Sympy,我需要使用sympy及其intersection函数计算线段的交点。当直接给出坐标时,它似乎工作得很好,但在我的例子中,我迭代地构造端点。例如,让我们计算下图中线段s0(蓝色)和s1(红色)的交点: 这可以通过以下方式直接完成: import sympy from sympy.geometry import * from numpy import sqrt, cos, sin PI = float(sympy.pi) p0 = Point(0.0, 0.0, evaluate=False)

我需要使用
sympy
及其
intersection
函数计算线段的交点。当直接给出坐标时,它似乎工作得很好,但在我的例子中,我迭代地构造端点。例如,让我们计算下图中线段
s0
(蓝色)和
s1
(红色)的交点:

这可以通过以下方式直接完成:

import sympy
from sympy.geometry import *
from numpy import sqrt, cos, sin

PI = float(sympy.pi)

p0 = Point(0.0, 0.0, evaluate=False)
p1 = Point(1.0, 0, evaluate=False)
p2 = Point(0.5, sqrt(3)/2.0, evaluate=False)
p3 = Point(0.5, -sqrt(3)/2.0, evaluate=False)

s0 = Segment(p0, p1)
s1 = Segment(p2, p3)

print(intersection(s0, s1))
# [Point2D(0.500000000000000, 0)]
或者从p0开始,通过添加相应的向量来构造其他点(命名为q1、q2、q3,以供以后比较):

angle = 0.0
q0 = Point(0.0, 0.0, evaluate=False)
q1 = q0 + Point(cos(angle), sin(angle), evaluate=False)
angle = 2.0*PI/3.0
q2 = q1 + Point(cos(angle), sin(angle), evaluate=False)
angle = -0.5*PI
q3 = q2 + Point(sqrt(3)*cos(angle), sqrt(3)*sin(angle), evaluate=False)

r0 = Segment(q0, q1)
r1 = Segment(q2, q3)

print(intersection(r0, r1))
# []
失败(返回的交叉点为空)

我们可以检查
p0=q0
等,至少在数字上:

print("|p0-q0| = ", p0.distance(q0)) # |p0-q0| =  0
print("|p1-q1| = ", p1.distance(q1)) # |p1-q1| =  0
print("|p2-q2| = ", p2.distance(q2)) # |p2-q2| =  2.48253415324727e-16
print("|p3-q3| = ", p3.distance(q3)) # |p3-q3| =  3.51083346857670e-16
我希望这是相当快的,所以我使用
evaluate=False
只处理浮动,所以我无法理解结果中的差异。还要注意的是
cos
sin
sqrt
函数都是
numpy
包中的函数,因此我们(应该?)避免懒惰的评估把戏。我还缺什么吗


编辑:这是在使用
python3.7.4
sympy 1.4
这看起来像sympy中的一个bug。 您可以使用
srepr()
显示s0、s1、r0、r1的内部表示,注意它们在结构上非常相似

问题是你的坐标几乎相等,但并不完全相等。因此,这是一个数值问题,而不是一个符号问题


请注意,Symphy在符号计算中表现出色,并给出了漂亮的精确结果。对于这种复杂的问题,你真的不会赢得太多时间让Symphy进行数值计算。我的建议是,要么省去数值计算,要么在NumPy中也进行交叉点计算

您的问题还有待解决吗?