Пересечение круга с двумя отрезками, не обнаруживающими все точки пересечения - PullRequest
0 голосов
/ 30 июня 2018

Я использую геометрический модуль SymPy для пересечения отрезков и окружностей. Кажется, что подсчитываются только некоторые точки пересечения, в то время как многие другие игнорируются.

Вот некоторый тестовый код для нахождения точек пересечения:

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 голосов
/ 30 июня 2018

Я до сих пор не знаю, почему мой предыдущий метод не сработал, но я знаю тот, который будет. После возни в Wolfram | Alpha я понял координаты пересечения, где все иррационально. Видя, что результаты программы были дробными, что-то было явно не так. Оказывается, радиус круга, 0,8, вызвал все неприятности.

Вместо того, чтобы приводить число с плавающей точкой в ​​качестве аргумента, вам нужно сначала его прояснить. Важно помнить две вещи:

  1. Аргумент должен быть строкой, а не плавающей точкой.
  2. Флаг «рациональный» должен быть истинным.

Учитывая это, новый код становится:

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)]
...