在三角形内均匀随机取样点。

4
我想知道如何在Python中获取三角形内的随机向量,但这好像比我预期的更困难。该平面将具有类似 [a, b]、[x, y]、[u, v](三个点)的坐标。

最简单的方法是在包含三角形的区域内均匀采样,然后拒绝在三角形区域外的点。(如果你聪明的话,甚至可以重新利用一些被拒绝的随机性而不会产生偏差。) - Mateen Ulhaq
也许这个链接会有用:https://mathworld.wolfram.com/TrianglePointPicking.html - Mateen Ulhaq
不是Python问题。请参考数学堆栈交换 - martineau
我修改了你的问题,使其涉及到均匀随机点,但进一步审查后,您是否还希望这些点不聚集在一起?可以对我下面提供的均匀随机点生成器进行简单修改,其中输入均匀分布'S,T'是某个网格的随机子集,其中间距足以使网格点之间的距离可接受。为了减少刚性,您可以稍微随机地移动网格点。O(n)。还有拒绝抽样,对于足够小的n,大约为O(n ^ 2)。 - Mateen Ulhaq
1
似乎是 https://dev59.com/5qbja4cB1Zd3GeqPn-76 的重复。 - Mark Dickinson
显示剩余2条评论
1个回答

7

设向量uv定义了一个以原点为中心的三角形。通过该三角形点选方法,可以在由uv定义的平行四边形内生成随机点。如果点在三角形外,则简单地拒绝它,或者将其关于uv之间对角线翻转。

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

三角形

图像生成方式:

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接