题目描述 在圆内随机生成点
给定圆的半径和圆心的 x、y 坐标,写一个在圆中产生均匀随机点的函数 randPoint 。
说明:
输入值和输出值都将是浮点数。
圆的半径和圆心的 x、y 坐标将作为参数传递给类的构造函数。
圆周上的点也认为是在圆中。
randPoint 返回一个包含随机点的x坐标和y坐标的大小为2的数组。
示例
输入: ["Solution","randPoint","randPoint","randPoint"]
[[1,0,0],[],[],[]]
输出: [null,[-0.72939,-0.65505],[-0.78502,-0.28626],[-0.83119,-0.19803]]
解题思路
参考 https://www.jianshu.com/p/c8ab26becbb4
我们可以获取的信息为:圆心坐标(x,y),半径。 所以,我们可以取得随机点的坐标范围:
x : [x-r, x+r]
y : [y-r, y+r]
从图形上表示,我们可以获取一个正方形的范围,如下图所示
因此通过rand()我们可以生成正方形内(包括边上)的随机点。但题目要求的是生成圆内的随机点, 于是生成随机点后可以通过点到圆心的距离来判断随机点是否在圆内,如果不在圆内,就抛弃该结果,重新生成。
代码
class Solution {
private:
double r,x,y;
public:
Solution(double radius, double x_center, double y_center) {
x = x_center;
y = y_center;
r = radius;
}
vector<double> randPoint() {
while(true){
double x1 = (2*(double)rand()/RAND_MAX - 1.0)*r;
double y1 = (2*(double)rand()/RAND_MAX - 1.0)*r;
if(x1*x1 + y1*y1<=r*r) return {x+x1,y+y1};
}
}
};