【问题标题】:Generate Random Points Within the Area of Two Overlapping Ellipse Shapes在两个重叠的椭圆形状区域内生成随机点
【发布时间】:2013-04-01 23:31:00
【问题描述】:

使用 JavaScript、PHP 或伪代码,有人可以展示如何在两个重叠椭圆形状之间的区域内生成随机点吗?如果你看一下下面的图片,黑色标记的区域就是要填充的区域。

如果您假设两个椭圆形状都与其中心在 0、0 处对齐,并且我们将内部椭圆的 x 轴大小设为 200,y 轴大小设为 150,则椭圆越大(黑色区域的外边缘) x 轴大小为 300,y 轴大小为 250。

我知道我可以只取一个矩形区域并生成随机点,然后检查它们与中心的距离,看看它们是否落入黑色区域,但我想要一个更复杂、更少浪费的方法来使用一些不错的数学来做到这一点,如果可能!

【问题讨论】:

  • 即使您确实需要均匀分布,极坐标似乎也是正确的方向。椭圆是否同心(您已经对此表示同意)并且长轴或短轴沿/平行于 X 轴?其次两个椭圆是否相似(意思是彼此成比例)?

标签: javascript math random shapes


【解决方案1】:

现在是凌晨 4 点,所以我建议仔细检查我写的所有内容。也就是说,变换中出现雅可比行列式,

x = √r * cosθ
y = √r * sinθ

是 det( cosθ / 2√r, - √r * sinθ ; sinθ / 2√r, √r * cosθ ) = (cosθ)^2 / 2 + (sinθ)^2 /2 = 1/2。这意味着它是恒定的。因此,笛卡尔坐标中区域 A 的任何区域都映射到新坐标系中的“变形区域”A/2 区域。由于原始区域的位置完全独立,因此我们得出结论,如果原始区域是,那么这个(和均匀的延伸)必须是均匀分布。这意味着您只需统一采样以匹配您所在的地区:

var r = 80,
    R = 120,
    _r = Math.sqrt(Math.random()*(R*R-r*r)+r*r),
    theta = Math.random()*2*Math.PI;
plot(_r*Math.cos(theta),_r*Math.sin(theta)/4);

http://jsfiddle.net/SQERh/

这与您的描述略有不同,因为您的内椭圆不是外椭圆的均匀拉伸,这使得类似的极坐标变换更加复杂,因为半径成为角度的函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 2012-03-30
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    相关资源
    最近更新 更多