Упростить строку строки с учетом углов - PullRequest
3 голосов
/ 12 февраля 2020

Цель

Создание простой линии скелета из 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()
...