我已经编写了一个方法,在给定矩形的最小/最大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)]
答案 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像素只意味着加倍增量。使其与五边形一起工作意味着......好吧,你必须决定如何处理小数点,但除此之外,只需要选择五个均匀旋转的单位向量而不是四个。