2

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

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

一个椭圆形状,以黑色显示该区域以在内部生成点

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

4

1 回答 1

2

现在是凌晨 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/

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

于 2013-04-02T01:41:54.000 回答