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中也进行交叉点计算您的问题还有待解决吗?