对三角形内的均匀随机点进行采样 [关闭]

Sample uniformly random points within a triangle [closed]

提问人:OkheyOfficial 提问时间:7/23/2021 最后编辑:OkheyOfficial 更新时间:7/23/2021 访问量:2147

问:


想改进这个问题吗?更新问题,使其仅通过编辑这篇文章来关注一个问题。

2年前关闭。

我想知道如何在 python 中获取三角形内的随机向量,但这似乎比我预期的要困难。飞机的坐标类似于 [a, b], [x, y], [u, v](三个点):

What I want to do

随机 几何 与语言无关

评论

0赞 Mateen Ulhaq 7/23/2021
最简单的方法是在包含三角形的区域内均匀采样,然后剔除三角形区域外的点。(而且,如果你很聪明,你甚至可以重用一些被拒绝的随机性,而不会产生偏见。
0赞 Mateen Ulhaq 7/23/2021
也许这可能有用:mathworld.wolfram.com/TrianglePointPicking.html
0赞 martineau 7/23/2021
不是 Python 问题。请参阅 Mathematics Stack Exchange
0赞 Mateen Ulhaq 7/23/2021
我编辑了你的问题,指的是统一随机的点,但经过进一步的审查,你是否也希望这些点不要聚集在一起?可以对我在下面给出的均匀随机点生成器进行简单的修改,其中输入均匀分布是某个网格的随机子集,其中间距为 s.t. 点,网格点之间的距离是可容忍的距离。为了降低刚性,您可以以随机方式稍微移动网格点。O(n)。还有拒绝采样,对于足够小的 n,大约是 O(n^2)。S, T
1赞 Mark Dickinson 7/23/2021
似乎是 stackoverflow.com/questions/47410054 的复制品

答:

7赞 Mateen Ulhaq 7/23/2021 #1

let 和 be 向量定义一个以原点为中心的三角形。通过这种三角形点拾取方法,可以在由 和 定义的平行四边形中生成随机点。如果点在三角形之外,只需拒绝或反转 和 之间的对角线的点。uvuvuv

import random

def uniform_triangle(u, v):
    while True:
        s = random.random()
        t = random.random()
        in_triangle = s + t <= 1
        p = s * u + t * v if in_triangle else (1 - s) * u + (1 - t) * v
        yield p

triangle

图生成方式:

from itertools import islice
import matplotlib.pyplot as plt
import numpy as np

triangle = np.array([
    [1, 2],
    [3, 8],
    [7, 5],
])

it = uniform_triangle(
    triangle[1] - triangle[0],
    triangle[2] - triangle[0],
)

points = np.array(list(islice(it, 0, 1000)))
points += triangle[0]

fig, ax = plt.subplots()
ax.scatter(points[:, 0], points[:, 1], s=1)
fig.savefig("triangle.png", dpi=200)