繁体   English   中英

如何在矩形外部生成随机点?

[英]How to generate random points outside a rectangle?

假设我的窗户尺寸是400宽乘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,不能为宽度或高度),并且将它们放置为使得每个分段都从不同的拐角处开始。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM