Python 为二维多边形沿某个轴添加每像素点
假设我有一个由2D点列表表示的开放多边形。例如,无基三角形多边形的表示形式为:Python 为二维多边形沿某个轴添加每像素点,python,numpy,Python,Numpy,假设我有一个由2D点列表表示的开放多边形。例如,无基三角形多边形的表示形式为: import numpy as np polygon_arr = np.array([[0,0], [15,10], [2,4]]) 我正在寻找一种优雅的方法来丰富表示,即向多边形添加点,这样多边形本身不会改变,但对于每个y值(在多边形范围内),多边形中都会有一个匹配点 例如: simple_line_polygon = np.array([[0,0], [10,5]]) enriched_representati
import numpy as np
polygon_arr = np.array([[0,0], [15,10], [2,4]])
我正在寻找一种优雅的方法来丰富表示,即向多边形添加点,这样多边形本身不会改变,但对于每个y值(在多边形范围内),多边形中都会有一个匹配点
例如:
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值中的一个像素变化的情况。但是,这不是很优雅,希望有更好的想法。这里不需要直线方程。您可以单独缩放点之间的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)
这里不需要直线方程。您可以单独缩放点之间的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)
谢谢你的回答给了我一个想法,那就是我在使用向量机而不是直线方程时忽略了汉克斯。你的回答给了我一个想法,我不知道如何处理向量而不是线性方程