为什么我们需要对凸多边形进行三角剖分才能从中均匀采样?

2024-01-23

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

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

我发现最实用的方法是从均匀分布生成指数分布,例如 -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 维构造),使其适用于它们而不适用于其他多边形?

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


我应该指出,为了从中均匀采样,对多边形进行三角测量并不是绝对必要的。对形状进行采样的另一种方法是拒绝抽样并进行如下。

  1. 确定覆盖整个形状的边界框。对于多边形,这就像查找多边形的最高和最低 x 和 y 坐标一样简单。
  2. 在边界框中均匀随机选择一个点。
  3. 如果该点位于形状内部,则返回该点。 (对于多边形,确定这一点的算法统称为多边形内的点谓词 https://en.wikipedia.org/wiki/Point_in_polygon.) 否则,请转至步骤 2。

然而,有两件事会影响该算法的运行时间:

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

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

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


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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我们需要对凸多边形进行三角剖分才能从中均匀采样? 的相关文章

  • Java给定长度的随机数

    我需要在 Java 中生成一个恰好 6 位数字的随机数 我知道我可以在随机发生器上循环 6 次 但是在标准 Java SE 中还有其他方法可以做到这一点吗 要生成 6 位数字 Use Random http download oracle
  • 优先连接,Matlab 中的复杂网络

    大家好 我现在正在 MATLAB 中研究优先附件模型 在理解以下内容时遇到一些困难 假设我一开始有 4 个节点 连接如下 time 0 1 lt gt 2 3 lt gt 4 在下一个时间步骤中 我添加一个节点和 4 个连接 然后添加另一个
  • 如何从 matlab 调用 Qtproject?

    我在 matlab 中有一个函数可以写入一个 file txt 我在 qt 项目中使用它 So 当我使用 unix 获取要运行的 qt 编译可执行文件时 我有一个 Matlab 文件 但出现错误 代码 unix home matt Desk
  • 像matlab一样在python中连接数组而不知道输出数组的大小

    我正在尝试在 python 中连接数组 类似于 matlab array1 zeros 3 500 array2 ones 3 700 array array1 array2 我在 python 中做了以下操作 array1 np zero
  • 绘制布朗运动 matlab

    首先 我只想说我不太习惯使用matlab 但我需要一个作业 我应该创建一个 布朗运动 我的代码目前如下所示 clf hold on prompt Ge ett input size input prompt numParticles inp
  • 氡变换线检测

    我正在尝试检测灰度图像中的线条 为此 我在 MATLAB 中使用 Radon 变换 我的 m 文件的示例如下所示 我可以使用此代码检测多行 我还使用线条的移位和旋转属性来绘制线条 但是 我不明白在获取rho和theta值后如何获取检测线的起
  • 使用不同的背景颜色保存 MATLAB 图窗

    我想打印一个带有深色背景和白色标签的 MATLAB 图 如果我使用print or saveas命令我不知何故失去了颜色 绘图符号再次变暗 背景变为白色 points rand 100 3 plot3 points 1 points 2 p
  • MATLAB问题:在图块中引用变量的值[重复]

    这个问题在这里已经有答案了 可能的重复 matlab 绘图标题中的变量 https stackoverflow com questions 5629458 matlab variable in plot title 我想在图中引用 m 文件
  • pandas 中数据帧中的随机/洗牌行

    我目前正在尝试找到一种方法来按行随机化数据框中的项目 我在 pandas 中按列洗牌 排列找到了这个线程 在 pandas 中对 DataFrame 进行改组 排列 https stackoverflow com questions 157
  • 如何在matlab中使矩阵图平滑

    就像上图一样 怎样才能让画面更流畅呢 或者缩小y轴的范围 数据来自二维矩阵 然后我用plot data 请随意提出任何想法 平滑线条的一种方法涉及样本点之间数据的非线性插值 当你这样做时plot x y o http www mathwor
  • 计算移动的球与移动的线/多边形碰撞的时间(2D)

    我有一个多边形 里面有一个移动的球 如果球撞到边界 它应该反弹回来 My current solution I split the polygon in lines and calculate when the ball hits the
  • 为 javascript 编写一个真正具有包容性的随机方法

    Javascript MATH 对象有一个随机方法 该方法从集合 0 1 返回 0 含 0 1 不包括 有没有办法返回一个真正随机的方法 其中包括 1 e g var rand MATH random 2 if rand gt 1 rand
  • 在 JavaScript 中使用随机数创建长度为 n 的数组

    跟进这个答案 https stackoverflow com a 34693778 1525840为了创建指定长度的数组 我执行了以下命令以获得相应的结果 但填充了随机数 而不是零 var randoms Array 4 fill Math
  • 使用 scipy.io 将 python pandas dataframe 转换为 matlab 结构

    我正在尝试使用 scipy io 将 pandas 数据帧保存到 matlab mat 文件 我有以下内容 array1 np array 1 2 3 array2 np array a b c array3 np array 1 01 2
  • Matlab:如何读取以逗号作为小数分隔符的数字?

    我有很多 数十万 相当大 gt 0 5MB 的文件 其中数据是数字 但以逗号作为小数分隔符 使用像这样的外部工具对我来说是不切实际的sed s g 当分隔符是点时 我只使用textscan fid f f f 但我看不到更改小数点分隔符的选
  • PHP 使用今天的日期生成一个随机数

    我正在尝试为内容块 在网页上 分配一个随机生成的数字 该数字基于今天的日期 无论是什么 和固定数字 由于某种原因 输出的数字种类存在巨大差异 例如 当我在本地测试我的代码时 生成的数字对我来说足够好 正数 但在实际的实时服务器上时 它们通常
  • Python 中 Matlab 'fscanf' 的等价物是什么?

    Matlab函数fscanf 似乎很强大 python 或numpy 中是否有相同的等效项 具体来说 我想从文件中读取矩阵 但我不想迭代每一行来读取矩阵 类似的东西 来自 matlab 用于读取 2D 1000x1000 矩阵 matrix
  • 可以避免迭代元胞数组时的“s{1} 烦恼”吗?

    The s 1 标题的 烦恼 指的是下面的 for 块中的第一行 for s some cell array s s 1 unpeel the enclosing cell do stuff with s end This s s 1 业务
  • UDP接收和发送Matlab

    我目前正在努力从外部设备接收数据包 然后将数据发送到另一个设备 我有一个工作 Simulink 模型 但我不知道如何在 Matlab 中对其进行编码 Matlab 中 UDP 接收块的参数如下图所示UDP 接收参数 https i stac
  • 当 MATLAB 变得非常非常忙时,如何中断它?

    我正在运行一个长时间的模拟MATLAB http en wikipedia org wiki MATLAB我意识到我需要停下来重新运行 然而 MATLAB 确实对这种计算很感兴趣 并且它停止了响应 如何在不终止 MATLAB 的情况下中断此

随机推荐