Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 원에 임의의 점 생성

<시간/>

원의 중심에 대한 반지름과 x-y 위치가 있다고 가정하고 원에 균일한 임의의 점을 생성하는 randPoint()라는 함수를 작성해야 합니다. 따라서 명심해야 할 몇 가지 중요한 사항이 있습니다.

  • 입력 및 출력 값은 부동 소수점입니다.
  • 원 중심의 반지름 및 x-y 위치가 클래스 생성자에 전달됩니다.
  • 원의 둘레에 있는 점은 원 안에 있는 것으로 간주됩니다.
  • randPoint()는 임의의 점의 x 위치와 y 위치를 순서대로 반환합니다.

따라서 입력이 [10, 5,-7.5]와 같으면 [11.15792,-8.54781],[2.49851,-16.27854],[11.16325,-12.45479]와 같은 임의의 점을 생성할 수 있습니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • uniform()이라는 메서드를 정의합니다. 이것은 다음과 같이 작동합니다 -
  • random_number/MAX RANDOM 반환
  • 이니셜라이저를 통해 rad 및 중심 좌표를 초기화합니다.
  • randPoint는 다음과 같이 작동합니다 -
  • 세타 =2*Pi*uniform()
  • r :=uniform()의 제곱근
  • (center_x + r*radius*cos(theta), center_y + r*radius*sin(theta))와 같은 쌍을 반환

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

예시

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
   public:
   const double PI = 3.14159265358979732384626433832795;
   double m_radius, m_x_center, m_y_center;
   double uniform() {
      return (double)rand() / RAND_MAX;
   }
   Solution(double radius, double x_center, double y_center) {
      srand(time(NULL));
      m_radius = radius; m_x_center = x_center; m_y_center = y_center;
   }
   vector<double> randPoint() {
      double theta = 2 * 3.14159265358979323846264 * uniform();
      double r = sqrt(uniform());
      return vector<double>{
         m_x_center + r * m_radius * cos(theta),
         m_y_center + r * m_radius * sin(theta)
      };
   }
};
main(){
   Solution ob(10, 5, 7);
   print_vector(ob.randPoint());
   print_vector(ob.randPoint());
   print_vector(ob.randPoint());
}

입력

Pass 10, 5, 7 into constructor
Call randPoint() three times

출력

[1.5441, 9.14912, ]
[-1.00029, 13.9072, ]
[10.2384, 6.49618, ]