Cho bán kính R và tâm (x_c, y_c). Hàm randPoint() sinh điểm ngẫu nhiên đều trong hình tròn (bao gồm đường tròn).
Thuật toán (Extreme tọa độ cực)
- Sinh góc
theta = 2π * random(). - Sinh bán kính
r = sqrt(random())(để phân bố đều theo diện tích). - Tọa độ:
x = x_c + r*R*cos(theta),y = y_c + r*R*sin(theta).
Mã nguồn C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
const double PI = 3.14159265358979323846;
double R, xc, yc;
double uniform() { return (double)rand() / RAND_MAX; }
public:
Solution(double radius, double x_center, double y_center)
: R(radius), xc(x_center), yc(y_center) { srand(time(NULL)); }
vector randPoint() {
double theta = 2 * PI * uniform();
double r = sqrt(uniform());
return {xc + r * R * cos(theta), yc + r * R * sin(theta)};
}
};
int main() {
Solution ob(10, 5, 7);
for (int i=0; i<3; i++) {
auto p = ob.randPoint();
cout << "[" << p[0] << ", " << p[1] << "]" << endl;
}
return 0;
}
Đầu ra mẫu
[1.5441, 9.14912], [-1.00029, 13.9072], [10.2384, 6.49618]