python - 考虑角度简化线串
问题描述
客观的
为 CAD 目的从 2D 多边形(基于 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()
解决方案
推荐阅读
- javascript - 查找对象中具有最大值的键
- python - 如何将多模块 Python 程序编译为单个模块?
- typescript - TypeScript/tsc 模块解析特性
- python - 我怎样才能摆脱双空格?(Python)
- c# - 基于其他列表框 C# 数据库的列表框结果
- android - 如何解决 okhttp3.internal.http2.StreamResetException: stream was reset: REFUSED_STREAM in Retrofit POST request
- angular - .net Core API 和 Angular SPA
- typescript - 在浏览器中显示 PDF,而不是从 URL 下载
- postgresql - PostgreSQL,Spring Data JPA:整数 null 解释为 bytea
- kotlin - Kotlin - 为什么我们必须为泛型方法显式类型参数?