Как создать многоугольники с дугами в форме (или лучшей библиотекой)
Я пытаюсь использовать shapely для определения области, используемой формой, и области, используемой инструментами, которые будут вырезать ее на фрезерном станке с ЧПУ. Форма импортируется из чертежа dxf с помощью ezdxf.
Траектории инструмента могут быть либо прямоугольниками (если они обрезаются пильным диском, который следует по прямой линии), либо набором сегментов (если они проложены фрезерным долотом). В обоих случаях я могу использовать LineString.buffer(), чтобы автоматически создать смещения и найти область, используемую инструментом.
Я использую стройные, потому что я думаю, что это лучший инструмент, чтобы узнать, перекрывают ли фигуры друг друга (используя union()
объединить все инструменты в одну форму и overlaps()
найти помехи). Пожалуйста, дайте мне знать, если есть лучший инструмент для этой цели.
buffer()
делает хорошую работу по созданию сегментов для представления дуг на углах.
Есть ли способ создать сегменты для представления дуг на самой фигуре?
Например, как мне создать дугу слева от этой фигуры? Нужно ли мне создавать свою собственную (медленную) функцию Python? Или есть оптимизированный стройный способ?
2 ответа
Создание собственного способа создания дуги в python не обязательно медленный. Numpy отлично подходит для операций по этим направлениям, и shapely специально предназначен для взаимодействия с Numpy.
Например,
import numpy as np
import shapely.geometry as geom
# Define the arc (presumably ezdxf uses a similar convention)
centerx, centery = 3, 4
radius = 2
start_angle, end_angle = 30, 56 # In degrees
numsegments = 1000
# The coordinates of the arc
theta = np.radians(np.linspace(start_angle, end_angle, numsegments))
x = centerx + radius * np.cos(theta)
y = centery + radius * np.sin(theta)
arc = geom.LineString(np.column_stack([x, y]))
Приближение дуги с 1000 точками между начальным и конечным углами занимает на моей машине ~3 миллисекунды (включая преобразование ее в стройную LineString).
Я никогда не использовал стройные, но я знаю некоторые принципы векторной графики. Наложения обычно извлекаются с "разницей". Если вы удалите разницу между полигонами из объединения, остаток будет вашей дугой. https://gis.stackexchange.com/questions/11987/polygon-overlay-with-shapely