Цель
Создание простой линии скелета из 2D-многоугольника (на основе CAD) для целей CAD. Небольшие линии следует избегать.
Состояние работы
- Создана диаграмма Вороного для многоугольника
- Используется DFS для идентификации ветвей вершин воронок / Края
- Используется Shapely Line String (Ramer-Douglas-Peucker) для упрощения линий
Задача
Ramer-Douglas-Peucker is не в состоянии упростить линию по желанию. Если увеличить допуск RDP, результаты не являются удовлетворительными. Цель должна состоять в том, чтобы представить полигон как можно лучше с наименьшим количеством возможных линий. Горизонтальные сегменты должны быть представлены горизонтальными линиями, а не угловыми. RDP пытается учитывать только те точки, которые приведены в данных. Желаемый результат должен содержать точки, которые раньше не были частью ветви (см. Изображения).
Пример изображения (Начальная точка: средняя ось) Начальная точка: Средняя ось
Пример изображения (Желаемый результат) Желаемый результат
Я упаковал данные точки в: Ссылка на данные
Пример кода для упрощения Shapely
import numpy as np
import matplotlib.pyplot as plt
from shapely.geometry import LineString
##########################
pathToFile = ""
RDP_Tolerance= 2
##########################
data = np.genfromtxt(pathToFile )
plt.figure()
plt.plot(data[:,0],data[:,1])
plt.scatter(data[:,0],data[:,1])
plt.axis('equal')
plt.show()
linestring = LineString(data)
lineStringSimplified = linestring.simplify(RDP_Tolerance)
simplifiedData = np.asarray(lineStringSimplified.coords)
plt.figure()
plt.plot(simplifiedData [:,0],simplifiedData [:,1])
plt.scatter(simplifiedData [:,0],simplifiedData [:,1])
plt.axis('equal')
plt.show()