圆与两条线段的交点未检测到所有交点
Intersection of circle with two line segments not detecting all intersection points
我正在使用 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)。
我仍然不知道为什么我以前的方法不起作用,但我知道有一种方法可以。在 Wolfram|Alpha 中闲逛后,我意识到交叉点的坐标都是不合理的。看到程序的输出是一个分数,显然是哪里出了问题。事实证明,圆的半径 0.8 造成了所有的麻烦。
您需要先对它进行符号化,而不是将浮点数作为参数。记住两件事很重要:
- 参数必须是字符串而不是浮点数。
- 'rational' 标志需要为 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)]
我正在使用 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)。
我仍然不知道为什么我以前的方法不起作用,但我知道有一种方法可以。在 Wolfram|Alpha 中闲逛后,我意识到交叉点的坐标都是不合理的。看到程序的输出是一个分数,显然是哪里出了问题。事实证明,圆的半径 0.8 造成了所有的麻烦。
您需要先对它进行符号化,而不是将浮点数作为参数。记住两件事很重要:
- 参数必须是字符串而不是浮点数。
- 'rational' 标志需要为 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)]