Horje
Find N random points within a Circle

Given four integers N, R, X, and Y such that it represents a circle of radius R with [X, Y] as coordinates of the center. The task is to find N random points inside or on the circle. 
Examples:

Input: R = 12, X = 3, Y = 3, N = 5 
Output: (7.05, -3.36) (5.21, -7.49) (7.53, 0.19) (-2.37, 12.05) (1.45, 11.80)
Input: R = 5, X = 1, Y = 1, N = 3 
Output: (4.75, 1.03) (2.57, 5.21) (-1.98, -0.76)

Approach: To find a random point in or on a circle we need two components, an angle(theta) and distance(D) from the center. After that Now, the point (xi, yi) can be expressed as:

xi = X + D * cos(theta)
yi = Y + D * sin(theta)

Below is the implementation of the above approach:

C++

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
#define PI 3.141592653589
 
// Return a random double between 0 & 1
double uniform()
{
    return (double)rand() / RAND_MAX;
}
 
// Function to find the N random points on
// the given circle
vector<pair<double, double> > randPoint(
    int r, int x, int y, int n)
{
    // Result vector
    vector<pair<double, double> > res;
 
    for (int i = 0; i < n; i++) {
 
        // Get Angle in radians
        double theta = 2 * PI * uniform();
 
        // Get length from center
        double len = sqrt(uniform()) * r;
 
        // Add point to results.
        res.push_back({ x + len * cos(theta),
                        y + len * sin(theta) });
    }
 
    // Return the N points
    return res;
}
 
// Function to display the content of
// the vector A
void printVector(
    vector<pair<double, double> > A)
{
 
    // Iterate over A
    for (pair<double, double> P : A) {
 
        // Print the N random points stored
        printf("(%.2lf, %.2lf)\n",
               P.first, P.second);
    }
}
 
// Driver Code
int main()
{
    // Given dimensions
    int R = 12;
    int X = 3;
    int Y = 3;
    int N = 5;
 
    // Function Call
    printVector(randPoint(R, X, Y, N));
    return 0;
}

Java

// Java program for the above approach
import java.util.*;
 
class GFG{
     
static final double PI = 3.141592653589;
static class pair
{
    double first, second;
 
    public pair(double first,
                double second)
    {
        super();
        this.first = first;
        this.second = second;
    }
}
 
// Return a random double between 0 & 1
static double uniform(){return Math.random();}
 
// Function to find the N random points on
// the given circle
static Vector<pair> randPoint(int r, int x,
                              int y, int n)
{
     
    // Result vector
    Vector<pair> res = new Vector<pair>();
 
    for(int i = 0; i < n; i++)
    {
         
        // Get Angle in radians
        double theta = 2 * PI * uniform();
 
        // Get length from center
        double len = Math.sqrt(uniform()) * r;
 
        // Add point to results.
        res.add(new pair(x + len * Math.cos(theta),
                         y + len * Math.sin(theta)));
    }
     
    // Return the N points
    return res;
}
 
// Function to display the content of
// the vector A
static void printVector(Vector<pair> A)
{
 
    // Iterate over A
    for(pair P : A)
    {
         
        // Print the N random points stored
        System.out.printf("(%.2f, %.2f)\n",
                          P.first, P.second);
    }
}
 
// Driver Code
public static void main(String[] args)
{
     
    // Given dimensions
    int R = 12;
    int X = 3;
    int Y = 3;
    int N = 5;
 
    // Function call
    printVector(randPoint(R, X, Y, N));
}
}
 
// This code is contributed by Rajput-Ji

Python3

# Python program for the above approach
import math
import random
PI = 3.141592653589;
 
class pair:
 
    def __init__(self, first, second):
        self.first = first;
        self.second = second;
 
# Return a random between 0 & 1
def uniform():
    return random.random();
 
# Function to find the N random points on
# the given circle
def randPoint(r, x, y, n):
   
    # Result vector
    res = list();
 
    for i in range(n):
        # Get Angle in radians
        theta = 2 * PI * uniform();
 
        # Get length from center
        len = math.sqrt(uniform()) * r;
 
        # Add point to results.
        res.append(pair((x + len * math.cos(theta)), (y + len * math.sin(theta))));
 
    # Return the N points
    return res;
 
# Function to display the content of
# the vector A
def printVector(A):
 
    # Iterate over A
    for P in A:
        # Print the N random points stored
        print("({0:.2f}".format(P.first),", ","{0:.2f})".format(P.second));
 
# Driver Code
if __name__ == '__main__':
    # Given dimensions
    R = 12;
    X = 3;
    Y = 3;
    N = 5;
 
    # Function call
    printVector(randPoint(R, X, Y, N));
 
# This code is contributed by 29AjayKumar

C#

// C# program for the above approach
using System;
using System.Collections.Generic;
class GFG
{
     
static readonly double PI = 3.141592653589;
class pair
{
    public double first, second;
 
    public pair(double first,
                double second)
    {
        this.first = first;
        this.second = second;
    }
}
 
// Return a random double between 0 & 1
static double uniform()
{
    return new Random().NextDouble();
}
 
// Function to find the N random points on
// the given circle
static List<pair> randPoint(int r, int x,
                              int y, int n)
{
     
    // Result vector
    List<pair> res = new List<pair>();
    for(int i = 0; i < n; i++)
    {
         
        // Get Angle in radians
        double theta = 2 * PI * uniform();
 
        // Get length from center
        double len = Math.Sqrt(uniform()) * r;
 
        // Add point to results.
        res.Add(new pair(x + len * Math.Cos(theta),
                         y + len * Math.Sin(theta)));
    }
     
    // Return the N points
    return res;
}
 
// Function to display the content of
// the vector A
static void printList(List<pair> A)
{
 
    // Iterate over A
    foreach(pair P in A)
    {
         
        // Print the N random points stored
        Console.Write("({0:F2}, {1:F2})\n",
                          P.first, P.second);
    }
}
 
// Driver Code
public static void Main(String[] args)
{
     
    // Given dimensions
    int R = 12;
    int X = 3;
    int Y = 3;
    int N = 5;
 
    // Function call
    printList(randPoint(R, X, Y, N));
}
}
 
// This code is contributed by 29AjayKumar

Javascript

// JavaScript program for the above approach
 
// Return a random double between 0 & 1
function uniform()
{
    return Math.random();
}
 
// Function to find the N random points on
// the given circle
function randPoint(r, x, y, n)
{
    // Result vector
    let res = new Array();
 
    for (let i = 0; i < n; i++) {
 
        // Get Angle in radians
        let theta = 2 * Math.PI * uniform();
 
        // Get length from center
        let len = Math.sqrt(uniform()) * r;
 
        // Add point to results.
        res.push([x + len * Math.cos(theta), y + len * Math.sin(theta)]);
    }
 
    // Return the N points
    return res;
}
 
// Function to display the content of
// the vector A
function printVector(A)
{
    // Iterate over A
    for (let i = 0; i < A.length; i++) {      
        // Print the N random points stored
        console.log("(" + A[i][0].toFixed(2) + ", " + A[i][1].toFixed(2) + ")");
    }
}
 
// Driver Code
// Given dimensions
let R = 12;
let X = 3;
let Y = 3;
let N = 5;
 
// Function Call
printVector(randPoint(R, X, Y, N));
 
// The code is contributed by gautam goel (gautamgoel962)

Output: 

(7.05, -3.36)
(5.21, -7.49)
(7.53, 0.19)
(-2.37, 12.05)
(1.45, 11.80)

Time Complexity: O(N) 
Space Complexity: O(N)
 




Reffered: https://www.geeksforgeeks.org


Geometric

Related
Check if an N-sided Polygon is possible from N given angles Check if an N-sided Polygon is possible from N given angles
Find side of Square which makes minimal area to fit two identical rectangles inside it Find side of Square which makes minimal area to fit two identical rectangles inside it
Maximum distance between two points in coordinate plane using Rotating Caliper&#039;s Method Maximum distance between two points in coordinate plane using Rotating Caliper&#039;s Method
Check if the given point lies inside given N points of a Convex Polygon Check if the given point lies inside given N points of a Convex Polygon
Find the angle of Rotational Symmetry of an N-sided regular polygon Find the angle of Rotational Symmetry of an N-sided regular polygon

Type:
Geek
Category:
Coding
Sub Category:
Tutorial
Uploaded by:
Admin
Views:
11