【问题标题】:Intersection of circle with two line segments not detecting all intersection points圆与两条线段的交点未检测到所有交点
【发布时间】:2018-06-30 11:32:54
【问题描述】:

我正在使用 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)。

【问题讨论】:

  • 这看起来是一个有趣的问题——我希望我有时间来解决它。通过使代码更最小,您可以使您的问题更有吸引力并更符合本网站的规则。只使用两个点、一个线段和一个圆,找出代码不能正常工作的地方。阅读并关注How to create a Minimal, Complete, and Verifiable example,您将获得更多、更好的答案。您还应该通过包含所有需要的导入语句来使代码完整
  • 感谢@RoryDaulton 的建议。我已经简化 + 完成了代码,所以只留下了相关信息。学习 Stackoverflow 礼仪总是很高兴。

标签: python math geometry sympy intersect


【解决方案1】:

我仍然不知道为什么我以前的方法不起作用,但我知道有一种方法会起作用。在 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)]

【讨论】:

  • 是的,SymPy 对涉及浮点数的方程有很多麻烦。我建议Rational('.8') 作为形成这样的理性的更短的方式(更短的是S(4)/5,其中 S 是“sympify”的内置快捷方式)。
猜你喜欢
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 2012-10-14
相关资源
最近更新 更多