Python 考虑角度简化线串

Python 考虑角度简化线串,python,algorithm,shapely,Python,Algorithm,Shapely,目标 从二维多边形(基于CAD)创建简单的骨架线,用于CAD目的。应避免使用小型管线 工作状态 创建多边形的Voronoi图 用于识别voronoi顶点/边的分支 使用形状优美的线串(Ramer Douglas Peucker)简化线 问题 Ramer Douglas Peucker无法根据需要简化生产线。如果增加RDP公差,则结果不令人满意。目标应该是尽可能用最少的线来表示多边形。水平段应该用水平线来表示,而不是小角度的线。 RDP试图只考虑数据中给出的点。所需结果应包含以前不属于分支的点

目标

从二维多边形(基于CAD)创建简单的骨架线,用于CAD目的。应避免使用小型管线

工作状态

  • 创建多边形的Voronoi图
  • 用于识别voronoi顶点/边的分支
  • 使用形状优美的线串(Ramer Douglas Peucker)简化线
问题

Ramer Douglas Peucker无法根据需要简化生产线。如果增加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()