0%

三角形随机均匀点采样算法

引理及证明

定理1 对于在集合$S \subset \mathbb{R}^n$上具有概率密度函数$f$的$n$维连续随机变量$X$,若在集合$T \subset \mathbb{R}^m$上存在连续随机变量$Y$满足单调函数$Y=\phi (X)$,则其分布函数为$F_Y(y)=F_X(\phi^{-1}(y))$(单调递增)或$F_Y(y)=1-F_X(\phi^{-1}(y))$(单调递减),其分布密度函数为$f_y(y)=f\left( \phi^{-1}(y) \right)|{\frac{d}{dy}\phi^{-1}}(y)|$.

证明:

当$\phi(X)$单调递增时:

当$\phi(X)$单调递减时:

当$\phi(X)$单调递增时,$\frac{\mathrm{d}}{\mathrm{d}y}\phi^{-1}(y) \ge 0$:

当$\phi(X)$单调递减时,$\frac{\mathrm{d}}{\mathrm{d}y}\phi^{-1}(y) \le 0$:

综上所述,当$\phi(X)$单调时,均有:

定理2 对于在集合$S \subset \mathbb{R}^n$上服从均匀分布的$n$维连续随机变量$X$,若在集合$T \subset \mathbb{R}^n$上存在连续随机变量$Y$与$X$满足线性变换$Y=AX + b$,矩阵$A$满秩,则$Y$也服从均匀分布。

证明:
显然线性变换$Y=AX + b$是单调且连续的,因此利用定理1,有

由于$X$服从均匀分布,因此$f_X\left(A^{-1}(y-b)\right)$为常数$C$,故$f_Y(y)=\frac{C}{\left|\det(A)\right|}$也为常数,因而$Y$也服从均匀分布,证明完毕。

三角形重心坐标系(barycentric coordinate system)

三角形$ABC$内的点$P$可以使用重心坐标表示:

利用重心坐标系的三角形随机点采样

三角形重心坐标形式简单,但并不适合直接使用,我们可以将其写成向量形式:

式中,$u,v \in (0, 1)$,我们可以在区间$(0, 1)$上随机生成2个随机数得到$u, v$,带入公式即可得到一个三角形$ABC$内的采样点$P$,示意图如下:

模拟采样结果如下,可见,样本分布并不均匀,在$C$点附近采样点分布明显更加密集。


我们来简单证明一下这种方法得到的分布在$XY$空间中不是均匀分布:
首先由定理2,均匀分布的线性变换一定是均匀分布,那么只要我们证明在任意一个三角形上,这种采样方法得到的不是均匀分布,即可证明在所有三角形上,这种采样方法在$XY$空间中都不服从均匀分布,为了简化运算,我们分别给定三角形的三个点坐标为:$A(0, 0), B(1, 0), C(0, 1)$,在三角形中任取点$P$,点$P$坐标满足:

在$XY$空间中,分布函数为:

由于$U$服从在$(0, 1)$上服从均匀分布,因此$f_U(u) = 1$,当$x > 0,y > 0,x \le 1 - y$,即$(x, y)$在三角形$ABC$内时,有:

因此分布密度函数

明显不是常数,概率密度随着$y$增大而变大,与采样模拟图密度分布结果相符,因此这个分布不是均匀分布,再利用定理2,可以推出——对于所有三角形,这种采样方法都不能在三角形内均匀采点。

利用重心坐标系的三角形随机均匀点采样

定理3 假设$u$和$v$为分别在$(0, 1)$区间上随机均匀生成的随机数,三角形$ABC$内的一个随机均匀采样点可以表示为


证明:
和上文证明之前的采样方法不能得到均匀分布类似,我们只要证明当在特定三角形$A(0, 0), B(1, 0), C(0, 1)$上这种采样能得到均匀分布,那么利用定理2,我们就能证明对于所有三角形,这种采样方法得到的点都服从均匀分布。

因此分布密度函数

显然是常数,符合均匀分布条件,证明完毕。
算法过程如下:

Algorithm samplePointInTriangle($x_a$, $y_a$, $x_b$, $y_b$, $x_c$, $y_c$):

  $u$ ← sample in uniform distribution $[0,1]$.

  $v$ ← sample in uniform distribution $[0,1]$.

  $x$ ← $\sqrt{v}(1-u)x_a+u\sqrt{v}x_b+(1-\sqrt{v})x_c$

  $y$ ← $\sqrt{v}(1-u)y_a+u\sqrt{v}y_b+(1-\sqrt{v})y_c$

  $P$ ← $(x, y)$

return $P$

拒绝采样法

在三角形的bbox上均匀采样,拒绝三角形外的点即可,算法:

Algorithm samplePointInTriangle($x_a$, $y_a$, $x_b$, $y_b$, $x_c$, $y_c$):

  $x_{min}$ ← $\min(x_a, x_b, x_c)$

  $x_{max}$ ← $\max(x_a, x_b, x_c)$

  $y_{min}$ ← $\min(y_a, y_b, y_c)$

  $y_{max}$ ← $\max(y_a, y_b, y_c)$

  do
    $u$ ← sample in uniform distribution $[0,1]$.

    $v$ ← sample in uniform distribution $[0,1]$.

    $P$ ← $(x_{min}+u(x_{max}-x_{min}),y_{min}+v(y_{max}-y_{min}))$

  until $P$ in triangle $ABC$

return $P$

示意图如下(只保留绿色区域的采样点):

d