Python - 生成矩形中的所有点

时间:2018-03-21 05:06:43

标签: python refactoring

我已经编写了一个方法,在给定矩形的最小/最大x / y坐标(从左上角顺时针方向前进)的情况下,将生成矩形中的每个像素/点。它按预期工作,但包含四个非常相似的代码块。似乎应该有更多的pythonic'用更少的重复代码实现这一目标的方法。我意识到这可以被视为一个开放式/主观的问题,但希望它足以保证一些答案/建议。

注意:此处的代码实际上是为2x2像素生成点

def _generate_points(self, min_x, min_y, max_x, max_y):
    # TODO: I'm sure this can/should be more pythonic somehow

    # Top
    for i in range((max_x - min_x) / 2):
        x_val = min_x + i*2
        y_val = min_y
        yield [(x_val, y_val), (x_val + 1, y_val), (x_val, y_val + 1), (x_val + 1, y_val + 1)]

    # Right-side
    for i in range((max_y - min_y) / 2):
        x_val = max_x
        y_val = min_y + i*2
        yield [(x_val, y_val), (x_val + 1, y_val), (x_val, y_val + 1), (x_val + 1, y_val + 1)]

    # Bottom
    for i in range((max_x - min_x) / 2):
        x_val = max_x - i*2
        y_val = max_y
        yield [(x_val, y_val), (x_val + 1, y_val), (x_val, y_val + 1), (x_val + 1, y_val + 1)]

    # Left-side
    for i in range((max_y - min_y) / 2):
        x_val = min_x
        y_val = max_y - i*2
        yield [(x_val, y_val), (x_val + 1, y_val), (x_val, y_val + 1), (x_val + 1, y_val + 1)]

1 个答案:

答案 0 :(得分:1)

你可以重构的一种方法是循环四个delta对,然后内循环可以使用当前循环。例如:

def perimeter(min_x, min_y, max_x, max_y):
    x, y = min_x, min_y
    for dx, dy in (1, 0), (0, 1), (-1, 0), (0, -1):
        while x in range(min_x, max_x+1) and y in range(min_y, max_y+1):
            yield (x, y)
            x += dx
            y += dy
        x -= dx
        y -= dy

这不是最清晰的写作方式,但我认为这是最好的想法。

一个很好的优点是你可以很容易地适应它来处理完全不同的形状。使其适用于2x2像素只意味着加倍增量。使其与五边形一起工作意味着......好吧,你必须决定如何处理小数点,但除此之外,只需要选择五个均匀旋转的单位向量而不是四个。

相关问题