假设我有一个由2D点列表表示的开放多边形。例如。没有基础的某种三角形多边形的表示形式是:
import numpy as np
polygon_arr = np.array([[0,0], [15,10], [2,4]])
我正在寻找一种丰富表示法的优雅方法,即在 polygon_arr 中添加点,以使多边形本身不会改变,而是对于每个y值(在多边形范围内) )在 polygon_arr 中会有一个匹配点。
示例:
simple_line_polygon = np.array([[0,0], [10,5]])
enriched_representation = foo(simple_line_polygon)
# foo() should return: np.array([[0,0], [2,1], [4,2], [6,3], [8,4], [10,5]])
我考虑过考虑多边形中的每两个相邻点,构造一个线方程(y = mx + n),并在范围内为每个y对其采样;然后处理特殊情况,例如两个点是垂直的(因此未定义线方程),以及两个点之间的距离已经比y像素变化一个像素更近的情况。但是,这并不是那么优雅,希望能有更好的主意。
答案 0 :(得分:2)
这里不需要线方程。您可以分别缩放点之间的x和y距离。如果两点之间应该有最小距离,则可以通过计算拐角之间的欧式距离来检查。这是一个小函数,希望可以完成您的工作:
import numpy as np
def enrich_polygon(polygon, maxpoints = 5, mindist=1):
result = []
##looping over all lines of the polygon:
for start, end in zip(polygon, np.vstack([polygon[1:],polygon[:1]])):
dist = np.sqrt(np.sum((start-end)**2)) ##distance between points
N = int(min(maxpoints+1,dist/mindist)) ##amount of sub-sections
if N < 2: ##mindist already reached
result += [start]
##generating the new points:
##put all points (including original start) on the line into results
else:
result += [
start+i*(end-start)/(N-1) for i in range(N-1)
]
return np.array(result)
polygon_arr = np.array([[0,0], [15,10], [2,4]])
res = enrich_polygon(polygon_arr)
print(res)
该函数采用原始多边形,并在成对的相邻角点上进行迭代。如果两个角之间的距离大于mindist
,则新的点将累加到最大点(每条线最多可增加的点数)。对于给定的示例,结果如下所示:
[[ 0. 0. ]
[ 3. 2. ]
[ 6. 4. ]
[ 9. 6. ]
[12. 8. ]
[15. 10. ]
[12.4 8.8 ]
[ 9.8 7.6 ]
[ 7.2 6.4 ]
[ 4.6 5.2 ]
[ 2. 4. ]
[ 1.33333333 2.66666667]
[ 0.66666667 1.33333333]]