考虑角度简化线串

Ben*_*nyS 5 python algorithm shapely

客观的

从 2D 多边形(基于 CAD)创建简单的骨架线以用于 CAD 目的。应避免出现小线。

工作状态

  • 创建多边形的 Voronoi 图
  • 使用 DFS 识别 voronoi 顶点/边的分支
  • 使用 Shapely Line String (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()
Run Code Online (Sandbox Code Playgroud)