如何在矩形外生成随机点?
How to generate random points outside a rectangle?
假设我的 window 的尺寸是 400 宽 x 600 高。
单边生成随机点比较容易,就说上面的吧:
random.randint(0, width)
但是什么是最聪明的方法来让它对所有 4 个边都起作用,以便在矩形外生成一个随机点?
如果我这样做
pos_x = [random.randint(0, width)]
pos_y = [random.randint(0, height)]
它们只会出现在拐角处,这是有道理的。我能想到的唯一方法是在矩形内随机创建一个点,比较哪个轴最接近边界,然后夹住它。问题是如果不对每一侧进行 4 次检查(感觉多余),我不知道如何优雅地执行此操作。我觉得有更简单的解决方案吗?
这是一个几乎可行的解决方案,但它太冗长了。刚刚意识到这在角落里得到的分数更少。
# Create a random point inside the rectangle
pos_x = random.randint(0, width)
pos_y = random.randint(0, height)
# Get a distance for each side
left_border = pos_x
right_border = width-pos_x
top_border = pos_y
bottom_border = height-pos_y
borders = [left_border, right_border, top_border, bottom_border]
index_1 = 0
index_2 = 2
closest_side = 0
# Get closest from left/right borders
if right_border < left_border:
index_1 = 1
# Get closest from top/bottom borders
if bottom_border < top_border:
index_2 = 3
# Get closest border
if borders[index_1] < borders[index_2]:
closest_side = index_1
else:
closest_side = index_2
if closest_side == 0:
obj.pos.x = 0 # Clamp to left wall
elif closest_side == 1:
obj.pos.x = width # Clamp to right wall
elif closest_side == 2:
obj.pos.y = 0 # Clamp to top wall
else:
obj.pos.y = height # Clamp to bottom wall
对不起;第一次完全误解了这个问题。
如果您只想在矩形的 边 上随机选取一个点,请尝试这样的操作:
p = random.randint(0, width + width + height + height)
if p < (width + height):
if p < width:
obj.pos.x = p
obj.pos.y = 0
else:
obj.pos.x = width
obj.pos.y = p - width
else:
p = p - (width + height)
if p < width:
obj.pos.x = width - p
obj.pos.y = height
else:
obj.pos.x = 0
obj.pos.y = height - (p - width)
简单地说,它在与矩形周长相同长度的线上随机选择一个点,然后将该线分段环绕矩形以给出 x 和 y 坐标。
为了确保角部的分布保持均匀,四个部分中的每一个都被视为包含 - 排除间隔(可以是0,不能是宽度或高度)并且它们被放置使得它们中的每一个从另一个角落开始。
假设我的 window 的尺寸是 400 宽 x 600 高。
单边生成随机点比较容易,就说上面的吧:
random.randint(0, width)
但是什么是最聪明的方法来让它对所有 4 个边都起作用,以便在矩形外生成一个随机点?
如果我这样做
pos_x = [random.randint(0, width)]
pos_y = [random.randint(0, height)]
它们只会出现在拐角处,这是有道理的。我能想到的唯一方法是在矩形内随机创建一个点,比较哪个轴最接近边界,然后夹住它。问题是如果不对每一侧进行 4 次检查(感觉多余),我不知道如何优雅地执行此操作。我觉得有更简单的解决方案吗?
这是一个几乎可行的解决方案,但它太冗长了。刚刚意识到这在角落里得到的分数更少。
# Create a random point inside the rectangle
pos_x = random.randint(0, width)
pos_y = random.randint(0, height)
# Get a distance for each side
left_border = pos_x
right_border = width-pos_x
top_border = pos_y
bottom_border = height-pos_y
borders = [left_border, right_border, top_border, bottom_border]
index_1 = 0
index_2 = 2
closest_side = 0
# Get closest from left/right borders
if right_border < left_border:
index_1 = 1
# Get closest from top/bottom borders
if bottom_border < top_border:
index_2 = 3
# Get closest border
if borders[index_1] < borders[index_2]:
closest_side = index_1
else:
closest_side = index_2
if closest_side == 0:
obj.pos.x = 0 # Clamp to left wall
elif closest_side == 1:
obj.pos.x = width # Clamp to right wall
elif closest_side == 2:
obj.pos.y = 0 # Clamp to top wall
else:
obj.pos.y = height # Clamp to bottom wall
对不起;第一次完全误解了这个问题。
如果您只想在矩形的 边 上随机选取一个点,请尝试这样的操作:
p = random.randint(0, width + width + height + height)
if p < (width + height):
if p < width:
obj.pos.x = p
obj.pos.y = 0
else:
obj.pos.x = width
obj.pos.y = p - width
else:
p = p - (width + height)
if p < width:
obj.pos.x = width - p
obj.pos.y = height
else:
obj.pos.x = 0
obj.pos.y = height - (p - width)
简单地说,它在与矩形周长相同长度的线上随机选择一个点,然后将该线分段环绕矩形以给出 x 和 y 坐标。
为了确保角部的分布保持均匀,四个部分中的每一个都被视为包含 - 排除间隔(可以是0,不能是宽度或高度)并且它们被放置使得它们中的每一个从另一个角落开始。