【问题标题】:Why do we need to triangulate a convex polygon in order to sample uniformly from it?为什么我们需要对凸多边形进行三角剖分以便从中均匀采样?
【发布时间】:2020-12-25 19:26:24
【问题描述】:

假设我想对凸多边形内的点进行均匀采样。

这里和互联网上描述的最常见的方法之一是对多边形进行三角剖分,并使用不同的方案在每个三角形内生成均匀随机的点。

我认为最实用的一种方法是从均匀分布生成指数分布,以 -log(U) 为例,并将总和归一化为 1。

在 Matlab 中,我们可以让这段代码在三角形内均匀采样:

vertex=[0 0;1 0;0.5 0.5]; %vertex coordinates in the 2D plane

mix_coeff=rand(10000,size(vertex,1)); %uniform generation of random coefficients
x=-log(x); %make the uniform distribution exponential
x=bsxfun(@rdivide,x,sum(x,2)); %normalize such that sum is equal to one
unif_samples=x*vertex; %calculate the 2D coordinates of each sample inside the triangle

这很好用:

但是,对三角形以外的任何东西使用完全相同的方案只会失败。例如对于一个四边形,我们得到以下结果:

显然,采样不再是均匀的,添加的顶点越多,“到达”角落就越困难。

如果我首先对多边形进行三角剖分,那么在每个三角形中进行统一采样很容易,并且显然可以完成工作。

但是为什么呢?为什么要先三角剖分?

哪些特定属性具有三角形(以及一般的单纯形,因为这种行为似乎扩展到 n 维构造)使其适用于它们而不适用于其他多边形?

如果有人能给我对这些现象的直观解释,或者只是指出一些可以帮助我理解正在发生的事情的参考资料,我将不胜感激。

【问题讨论】:

    标签: matlab random polygon triangulation


    【解决方案1】:

    嗯,在三角形中采样均匀的方法更便宜。您正在对单纯形 d+1 中的狄利克雷分布进行采样,并进行投影、计算指数等。我建议您参考代码示例和论文参考here,只有平方根,算法要简单得多。

    关于复杂区域(在您的情况下为四边形)的均匀采样,一般方法非常简单:

    • 三角测量。您将得到两个顶点为 (a,b,c)0 和 (a,b,c)1 的三角形
    • 使用 f.e. 计算三角形面积 A0 和 A1Heron's formula
    • 第一步,根据面积随机选择一个三角形。 if (random() 0/(A0+A1)) 选择三角形 0 否则选择三角形 1. random() 应返回 [0...1] 范围内的浮点数
    • 使用上述方法在选定的三角形中采样点。

    这种方法可以很容易地扩展到对任何具有均匀密度的复杂区域进行采样:N 个三角形,概率与面积成比例的分类分布采样将为您选择三角形,然后在三角形中采样点。

    更新

    我们必须进行三角测量,因为我们知道好的(快速、可靠、只有 2 次 RNG 调用……)算法可以在三角形中以均匀密度进行采样。然后我们可以在它的基础上进行构建,好的软件都是关于可重用性的,然后选择一个三角形(以另一个 rng 调用为代价)然后从中采样,总共三个 RNG 调用以从任何区域获得均匀的密度采样,凸面和凹的一样。相当普遍的方法,我会说。三角测量是一个已解决的问题,并且 基本上你只做一次(三角化并构建权重数组 Ai/Atotal)并采样直到无穷大。

    答案的另一部分是我们(准确地说是我,但我已经使用随机抽样约 20 年了)不知道从任意超过三个凸的凸面以均匀密度精确抽样的好算法-顶点闭合多边形。您提出了一些基于直觉的算法,但没有成功。它不应该工作,因为您使用的是Dirichlet distribution in d+1 simplex 并将其投影回d 超平面。它甚至不能扩展到四边形,而不是与任意凸多边形对话。我猜想,即使存在这样的算法,n-vertices 多边形也需要 n-1 次调用 RNG,这意味着没有三角测量设置,但每次调用获取一个点都会相当昂贵。

    关于抽样复杂性的几句话。假设您进行了三角测量,那么通过对 RNG 的 3 次调用,您将在多边形内均匀采样一个点。 但是对三角形数量 N 进行采样的复杂性最多为 O(log(N))。你基本上会对 Ai/Atotal 的部分和进行二分搜索。

    您可以做得更好,使用三角形的Alias sampling 进行 O(1)(恒定时间)采样。成本会增加一些设置时间,但可以与三角测量融合。此外,它还需要一个 RNG 调用。因此,对于四个 RNG 调用,您将拥有与多边形的复杂性无关的恒定点采样时间,适用于任何形状

    【讨论】:

    • 感谢您的参考。但是您没有回答最初的问题:为什么我们必须进行三角测量?为什么我们不能直接采样一个凸多边形而不首先将它分成几个三角形?
    • 我并不是说三角测量不是正确的方法。实际上恰恰相反,因为网络上描述的几乎所有算法都使用三角测量和对已识别的单纯形进行采样。感谢您确认这确实是解决此类问题的最佳做法。
    • 我不是统计学家,所以我可能会问一些愚蠢的问题,但你能解释一下为什么可以从 Dirichlet 分布中采样并在三角形而不是四边形的情况下投影?
    • @Xav59130 d+1(α=1)中的狄利克雷分布在受条件 X1+X2+...+Xd=1 约束的单纯形中是均匀的。单纯形是三角形。在 3d 单纯形中是三角形平面片,角在 (1,0,0), (0,1,0),(0,0,1)。当您将其投影到d 维平面(例如 XY 平面)时,您将在三角形 (0,0)、(1,0)、(0,1) 中获得均匀的密度采样。这就是您正在做的事情,然后使用已知顶点您可以填充平面上的任何三角形。我们没有类似于四边形的狄利克雷分布。我会说不可能有这样的分布,所以它会覆盖任何四边形。
    【解决方案2】:

    我应该指出,对多边形进行三角剖分以从中均匀采样并不是绝对必要的。另一种对形状进行采样的方法是拒绝采样,其过程如下。

    1. 确定一个覆盖整个形状的边界框。对于多边形,这就像找到多边形的最高和最低 x 和 y 坐标一样简单。
    2. 在边界框中随机均匀选择一个点。
    3. 如果该点位于形状内,则返回该点。 (对于多边形,确定这一点的算法统称为point-in-polygon predicates。)否则,转到步骤 2。

    但是,有两件事会影响这个算法的运行时间:

    1. 时间复杂度很大程度上取决于所讨论的形状。一般来说,这个算法的接受率是形状的体积除以边界框的体积。 (特别是,高维形状的接受率通常非常低,部分原因是维度灾难:典型形状覆盖的体积比它们的边界框小得多。)
    2. 此外,算法的效率取决于确定点是否位于相关形状中的速度。正因为如此,复杂形状通常由简单的形状组成,例如三角形、圆形和矩形,因此很容易确定一个点是否位于复杂形状中或确定该形状的边界框。

    请注意,原则上可以应用拒绝采样来采样任何维度的任何形状,而不仅仅是凸二维多边形。因此,它适用于圆形、椭圆形和曲线形等。

    事实上,原则上,一个多边形可以分解成无数个三角形以外的形状,其中一个形状与其面积成比例采样,而该形状中的一个点通过拒绝采样随机采样。


    现在,稍微解释一下您在第二张图片中给出的现象:

    您所拥有的不是 4 边(2 维)多边形,而是投影到 2 维空间的 3 维单纯形(即四面体)。 (另见上一个答案。)这个投影解释了为什么“多边形”内的点在内部看起来比在角落更密集。如果您将“多边形”描绘成一个四角在不同深度的四面体,您就会明白为什么。随着单纯形的更高维度,这种现象变得越来越严重,部分原因是维度的诅咒

    【讨论】:

    • 我想我知道现在发生了什么,以及为什么它不像我最初想象的那样工作。系数之和确实使我的四边形实际上是四面体在 2D 空间上的投影,并且我拥有的顶点越多情况变得越糟,这是有道理的。我必须在细节上多做一些工作,但你给了我我所缺乏的洞察力来解开我的障碍。
    • @Xav59130 wrt #2,这是一种轻描淡写的说法,即获得关于点入/点出的答案可能很昂贵。对于具有潜在孔洞的复杂非凸多边形,算法将在 O(N) 中运行,其中 N 是边数。实际上,人们经常对多边形进行三角剖分以获得已知的点入/出代码或光线相交的代码。我的意思是,你必须选择你的复杂性在哪里,但你不能避免它
    • @Xav59130 我已经更新了我的答案,请看一下
    • @SeverinPappadeux:在我的大部分回答中,我想指出,对凸多边形进行采样并不一定意味着必须将该多边形分解为 triangles。对多边形或任何其他形状进行采样的时间复杂度不是我回答的重点。
    猜你喜欢
    • 1970-01-01
    • 2018-08-22
    • 2011-07-15
    • 2016-09-28
    • 2012-09-06
    • 2020-04-21
    • 2016-09-27
    • 1970-01-01
    • 2014-07-12
    相关资源
    最近更新 更多