如何按指定的量填充多边形?

8 浏览
0 Comments

如何按指定的量填充多边形?

这个问题看起来很简单,但是我很难使它正常工作。

我有一个由顶点列表定义的(非凸)多边形。我想要创建另一个多边形,其中每个点都向外移动一定距离。我尝试过对点进行缩放,然后再移回原始原点,但效果不是我想要的。

screenshot

我希望每个点都在原始点的“外部”。但是,仅仅根据点的列表来计算“外部”似乎非常困难。有没有简单的方法来实现这个?

0
0 Comments

问题的出现原因:在给定的多边形中,需要对其进行指定量的填充(padding)操作,即在多边形的边界上插入一定宽度的区域。

解决方法:通过遍历多边形的各个线段,可以定义每个线段的左侧和右侧。可以选择逆时针遍历线段,并在当前线段的右侧添加偏移量,或者选择顺时针遍历线段,并在当前线段的左侧添加偏移量。这样做可能会在凹陷处创建退化的形状。

下面是具体实现的代码示例:

# 逆时针遍历线段并在右侧添加偏移量
def pad_polygon(polygon, amount):
    padded_polygon = []
    for i in range(len(polygon)):
        current_segment = polygon[i]
        next_segment = polygon[(i + 1) % len(polygon)]
        
        # 计算当前线段的法向量
        normal_vector = [-(next_segment[1] - current_segment[1]), next_segment[0] - current_segment[0]]
        
        # 计算偏移量
        offset_vector = [amount * normal_vector[0], amount * normal_vector[1]]
        
        # 添加偏移后的线段
        padded_polygon.append([current_segment[0] + offset_vector[0], current_segment[1] + offset_vector[1]])
    
    return padded_polygon

# 顺时针遍历线段并在左侧添加偏移量
def pad_polygon(polygon, amount):
    padded_polygon = []
    for i in range(len(polygon)):
        current_segment = polygon[i]
        previous_segment = polygon[i - 1]
        
        # 计算当前线段的法向量
        normal_vector = [-(current_segment[1] - previous_segment[1]), current_segment[0] - previous_segment[0]]
        
        # 计算偏移量
        offset_vector = [amount * normal_vector[0], amount * normal_vector[1]]
        
        # 添加偏移后的线段
        padded_polygon.append([current_segment[0] + offset_vector[0], current_segment[1] + offset_vector[1]])
    
    return padded_polygon

以上代码示例分别展示了逆时针和顺时针遍历线段并添加偏移量的方法。具体选择哪种遍历方式取决于具体需求和多边形的结构。

通过以上的解决方法,可以对给定的多边形进行指定量的填充操作。

0
0 Comments

问题:如何根据指定的数值对多边形进行填充?

原因:根据问题描述,需要找到一个多边形的“偏移量”,即所有在多边形外部且与多边形之间的距离为给定数值的点的集合。然而,偏移量不是一个多边形。

解决方法:可以尝试将多边形的所有顶点相对于多边形的重心进行缩放。

我认为这就是我在上面的图片中尝试过的方法(相对于重心缩放所有顶点)。除非我做了什么愚蠢的事情,否则这不会导致所有的点都在原始点的外部。

# 伪代码示例
def pad_polygon(polygon, offset_distance):
    centroid = calculate_centroid(polygon)
    padded_polygon = []
    for vertex in polygon:
        direction = calculate_direction(centroid, vertex)
        offset_vertex = move_along_direction(vertex, direction, offset_distance)
        padded_polygon.append(offset_vertex)
    return padded_polygon

0