开始的想法是暴力求解:
- 先通过
x
和r
以及随机数生成 随机的 横坐标的值 - 在通过 横坐标 以及 半径和圆心的位置 确定 有效的
y
的值,然后产生随机数
可能能实现,但是实现太繁琐,负责度也很高。
拒绝采样
将 圆 扩展成 正方形, 然后再矩形内确定 x
,y
,再将不符合条件的排除出去。
如上图所示,将绿松石色内的采样数据排除即可得到圆形内的数据。
class Solution {
public r: number
public x: number
public y: number
constructor(radius: number, x_center: number, y_center: number) {
this.r = radius
this.x = x_center
this.y = y_center
}
// 拒绝采样
randPoint(): number[] {
while (true) {
// 这种方式比 调用两次Math.random()来区分正负更有效
// Math.random() * this.r * (Math.random() > 0.5 ? 1 : -1)
let x = Math.random() * (2 * this.r) - this.r
let y = Math.random() * (2 * this.r) - this.r
if (x * x + y * y <= this.r * this.r) {
return [this.x + x, this.y + y]
}
}
}
}