leetcode第478题 在圆内随机生成点
方法一(不知道为啥过不了)
先在半径上任意取一个点,到圆心的距离为x,然后用勾股定理,根据半径和x的值,可以算出来在从x到圆上的最大距离y_max,再在这上面随便选一个点y,然后加上原来的圆心坐标,就是所取到的点
class Solution {
public:
double radius, x_center,y_center;
Solution(double radius, double x_center, double y_center) {
this->radius=radius;
this->x_center=x_center;
this->y_center=y_center;
}
vector<double> randPoint() {
//在半径上生成一个点
double rx=(2.0*rand()/RAND_MAX-1)*radius;
//根据半径上的点算出y可以到的最大值
double yMax=sqrt(radius*radius-rx*rx);
//随机生成一个y的点,在y的范围内
double ry=(2.0*rand()/RAND_MAX-1)*yMax;
return {rx+x_center,ry+y_center};
}
};
/**
* Your Solution object will be instantiated and called as such:
* Solution* obj = new Solution(radius, x_center, y_center);
* vector<double> param_1 = obj->randPoint();
*/
方法二
随机在0-r之间生成x和y,如果对应的坐标(x,y)在以半径为r,圆心为(0,0)的圆上,就在圆内,加上原来的圆心值就是要求的值
class Solution {
public:
double xc, yc, rad;
Solution(double radius, double x_center, double y_center) {
srand(1);
rad = radius;
xc = x_center;
yc = y_center;
}
vector<double> randPoint() {
while (true) {
double x = 2 * (double)rand() / RAND_MAX - 1; // 产生[-1, 1]之间的随机数
double y = 2 * (double)rand() / RAND_MAX - 1;
if (x * x + y * y <= 1) {
return {xc + x * rad, yc + y * rad}; // 对半径进行放缩
}
}
}
};