具有两个线段的圆的交点未检测到所有交点

时间:2018-06-30 11:32:54

标签: python math geometry sympy intersect

我正在使用SymPy的geometry module将线段和圆相交。似乎只计算了一些交点,而忽略了许多其他交点。

以下是一些用于找到相交点的测试代码:

from sympy.geometry import Point2D, Segment2D, Circle

# Point A, B and C
A = Point2D(1, 1)
B = Point2D(3, -1)
C = Point2D(-2, -2)

# Segment from A to B
f_0 = Segment2D(A, B)
# Segment from A to C
f_1 = Segment2D(A, C)
# Circle with center A and radius 0.8
c = Circle(A, .8)

i_0 = c.intersection(f_0)
i_1 = c.intersection(f_1)

print(i_0)
print(i_1)

这应该起作用,并且在进行线-圆交集或圆-圆交集时会捕获所有的交点,但不能分段线或射线-圆交集。输出如下:

[]
[Point2D(217157287525381/500000000000000, 217157287525381/500000000000000)]

它显然没有按预期工作。我不知道是什么原因造成的,我想知道如何解决它或找到任何替代方法(最好还是使用SymPy)。

[geogebra depiction of geometry]

1 个答案:

答案 0 :(得分:2)

我仍然不知道为什么我以前的方法不起作用,但是我知道可以。在沃尔夫勒姆(Wolfram | Alpha)乱七八糟后,我意识到所有不合理的交点坐标。看到程序的输出很小,显然是错误的。事实证明,圆半径0.8造成了所有麻烦。

您无需先将浮点数作为参数,而是首先将其表示。重要的是要记住两件事:

  1. 该参数必须是字符串,而不是浮点数。
  2. “理性”标志必须为True。

考虑到这一点,新代码变为:

from sympy import sympify
from sympy.geometry import Point2D, Segment2D, Circle

# Point A, B and C
A = Point2D(1, 1)
B = Point2D(3, -1)
C = Point2D(-2, -2)

# Segment from A to B
f_0 = Segment2D(A, B)
# Segment from A to C
f_1 = Segment2D(A, C)
# Circle with center A and radius 0.8
c = Circle(A, sympify('.8', rational=True))

i_0 = c.intersection(f_0)
i_1 = c.intersection(f_1)

print(i_0)
print(i_1)

输出将变为:

[Point2D(2*sqrt(2)/5 + 1, -2*sqrt(2)/5 + 1)]
[Point2D(-2*sqrt(2)/5 + 1, -2*sqrt(2)/5 + 1)]