Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Random 通过将三角形划分为更小的部分来对其进行均匀采样?_Random_Triangulation - Fatal编程技术网

Random 通过将三角形划分为更小的部分来对其进行均匀采样?

Random 通过将三角形划分为更小的部分来对其进行均匀采样?,random,triangulation,Random,Triangulation,要对三角形ABC进行均匀采样,我可以使用以下公式: p=(1-sqrt(r1))*A+(sqrt(r1)*(1-r2))*B+(r2*sqrt(r1))*C 其中r1和r2是介于0和1之间的随机数。你采集的样本越多越好。但如果我想得到更好的分布,同时保持较低的样本数量,该怎么办 例如,如果我有一个正方形,我可以隐式地将其划分为一个nxn网格,并在较小的网格正方形内生成一个随机样本。像这样: float u = (x + rnd(seed)) / width; float v = (y + rnd

要对三角形ABC进行均匀采样,我可以使用以下公式:

p=(1-sqrt(r1))*A+(sqrt(r1)*(1-r2))*B+(r2*sqrt(r1))*C

其中r1和r2是介于0和1之间的随机数。你采集的样本越多越好。但如果我想得到更好的分布,同时保持较低的样本数量,该怎么办

例如,如果我有一个正方形,我可以隐式地将其划分为一个nxn网格,并在较小的网格正方形内生成一个随机样本。像这样:

float u = (x + rnd(seed)) / width;
float v = (y + rnd(seed)) / height;
关键是我强制采样以较低的采样分辨率覆盖整个网格


我如何用三角形来实现这一点?我能想到的唯一方法是使用类似于的库显式地将其细分为若干个三角形。但是,有没有一种方法可以像使用正方形那样隐式地进行此操作,而不必实际分割三角形?

我建议使用泊松圆盘采样(, ,)在三角形的边界框内生成配置,然后裁剪到三角形边界区域

我建议从简短的学术论文开始。这里的原理很容易理解。这个想法有很多不同的版本,所以你要掌握它,找到适合你的


好的,我有一些想法,相信使用准随机数可以改善三角形覆盖范围内点的“均匀性”,而无需细分为更小的三角形。如维基文章所示,使用Sobol序列可以提供更好的覆盖范围

这里是使用标准RNG的200个三角形点(无论Python中是什么)

这是一张从Sobol 2D序列中采集了200个点的图片

我觉得好多了。要使用的Python代码

import os
import math
import random

import numpy as np
import matplotlib.pyplot as plt

import sobol_seq

def trisample(A, B, C, r1, r2):
    s1 = math.sqrt(r1)

    x = A[0] * (1.0 - s1) + B[0] * (1.0 - r2) * s1 + C[0] * r2 * s1
    y = A[1] * (1.0 - s1) + B[1] * (1.0 - r2) * s1 + C[1] * r2 * s1

    return (x, y)

if __name__ == "__main__":
    N = 200

    A = (0.0, 0.0)
    B = (1.0, 0.0)
    C = (0.5, 1.0)

    seed = 1
    xx = list()
    yy = list()
    random.seed(312345)
    for k in range(0, N):

        pts, seed = sobol_seq.i4_sobol(2, seed)
        r1 = pts[0]
        r2 = pts[1]

        # uncomment if you want standard rng
        #r1 = random.random()
        #r2 = random.random()

        pt = trisample(A, B, C, r1, r2)
        xx.append(pt[0])
        yy.append(pt[1])

    plt.scatter(xx,  yy)
    plt.show()

    sys.exit(0)

你问什么有点不清楚。所以你在点A,B和C定义的三角形的平面上均匀采样,对吗?所以你有一个你调用的例程,然后返回点(x,y)
但是如果我想减少样本数量呢?
您不能提前减少样本数量?为什么?我不想完全依靠随机抽样。要在整个三角形中获得良好的分布,需要大量的样本。那么你在这里谈论的是方差减少技术吗?@sascha但在三角形分布中是一致的,从何处取样很重要?好吧,如果你不需要太多样本,我想如何帮助你?你仍然需要穿制服,不是吗?基本上,如果在大三角形中有100个样本。将其细分为2个较小的三角形,并在每个零件中采样50个点。我看不出会有什么不同的表现。好的,让我们来澄清一下——这个三角形到底计算了什么?你在用这些采样的坐标做些什么,对吗?Richard,这不是关于在三角形中均匀采样@Moody使用正确的公式对三角形中的点进行均匀采样,检查并引用其中的内容,这是一种非常好的方法。看起来正是我需要的。谢谢你的帮助!