Skip to content
Related Articles

Related Articles

Improve Article
Save Article
Like Article

Minimum revolutions to move center of a circle to a target

  • Difficulty Level : Medium
  • Last Updated : 18 May, 2021

Given a circle of radius r and center in point(x1, y1) and given a point(x2, y2). The task is move center of circle from given center (x1, y1) to target (x2, y2) using minimum number of steps. In one step, we can put a pin on the border of the circle at any point, then rotate the circle around that pin by any angle and finally remove the pin. 
Examples : 
 

Input : r = 2 
        x1 = 0, y1 = 0
        x2 = 0, y2 = 4
Output :1

Input  : r = 1
         x1 = 1, y1 = 1,
         x2 = 4, y2 = 4 
Output : 3

 

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.

Let’s consider a straight line between the two centers. Clearly to move the center with maximum distance we need to rotate it around the line and with 180 degrees. So the maximum distance we can move the center each time is 2 * r. Let’s continue moving the center with 2 * r distance each time until the two circles intersects. Now obviously we can make the center moves into its final position by rotating it around one of the intersection points of the two circles until it reaches the final destination.
Every time we make the circle moves 2 * r times except the last move it’ll be < 2 * r. Let the initial distance between the two points be d. Solution to the problem will be ceil(d/2*r).
 

C++




// C++ program to find minimum number of
// revolutions to reach a target center
#include<bits/stdc++.h>
using namespace std;
 
// Minimum revolutions to move center from
// (x1, y1) to (x2, y2)
int minRevolutions(double r, int x1, int y1,
                             int x2, int y2)
{
    double d = sqrt((x1 - x2)*(x1 - x2) +
                    (y1 - y2)*(y1 - y2));
    return ceil(d/(2*r));
}
 
// Driver code
int main()
{
    int r = 2, x1 = 0, y1 = 0, x2 = 0, y2 = 4;
    cout << minRevolutions(r, x1, y1, x2, y2);
    return 0;
}

Java




// Java program to find minimum number of
// revolutions to reach a target center
class GFG {
     
    // Minimum revolutions to move center
    // from (x1, y1) to (x2, y2)
    static double minRevolutions(double r,
         int x1, int y1, int x2, int y2)
    {
         
        double d = Math.sqrt((x1 - x2)
                   * (x1 - x2) + (y1 - y2)
                   * (y1 - y2));
                    
        return Math.ceil(d / (2 * r));
    }
     
    // Driver Program to test above function
    public static void main(String arg[]) {
         
        int r = 2, x1 = 0, y1 = 0;
        int x2 = 0, y2 = 4;
         
        System.out.print((int)minRevolutions(r,
                              x1, y1, x2, y2));
    }
}
 
// This code is contributed by Anant Agarwal.

Python3




# Python program to find
# minimum number of
# revolutions to reach
# a target center
import math
 
# Minimum revolutions to move center from
# (x1, y1) to (x2, y2)
def minRevolutions(r,x1,y1,x2,y2):
 
    d = math.sqrt((x1 -x2)*(x1 - x2) +
         (y1 - y2)*(y1 - y2))
    return math.ceil(d/(2*r))
 
# Driver code
 
r = 2
x1 = 0
y1 = 0
x2 = 0
y2 = 4
 
print(minRevolutions(r, x1, y1, x2, y2))
 
# This code is contributed
# by Anant Agarwal.

C#




// C# program to find minimum number of
// revolutions to reach a target center
using System;
 
class GFG {
     
    // Minimum revolutions to move center
    // from (x1, y1) to (x2, y2)
    static double minRevolutions(double r,
            int x1, int y1, int x2, int y2)
    {
         
        double d = Math.Sqrt((x1 - x2)
                * (x1 - x2) + (y1 - y2)
                * (y1 - y2));
                     
        return Math.Ceiling(d / (2 * r));
    }
     
    // Driver Program to test above function
    public static void Main()
    {
        int r = 2, x1 = 0, y1 = 0;
        int x2 = 0, y2 = 4;
         
        Console.Write((int)minRevolutions(r,
                            x1, y1, x2, y2));
    }
}
 
// This code is contributed by nitin mittal.

PHP




<?php
// PHP program to find minimum
// number of revolutions to reach
// a target center
 
 
// Minimum revolutions to move
// center from (x1, y1) to (x2, y2)
function minRevolutions($r, $x1, $y1,
                            $x2, $y2)
{
    $d = sqrt(($x1 - $x2) * ($x1 - $x2) +
              ($y1 - $y2) * ($y1 - $y2));
    return ceil($d / (2 * $r));
}
 
// Driver code
$r = 2; $x1 = 0; $y1 = 0; $x2 = 0; $y2 = 4;
echo minRevolutions($r, $x1, $y1, $x2, $y2);
 
// This code is contributed by nitin mittal.
?>

Javascript




<script>
// Javascript program to find minimum number of
// revolutions to reach a target center
 
// Minimum revolutions to move center from
// (x1, y1) to (x2, y2)
function minRevolutions(r, x1, y1, x2, y2)
{
    let d = Math.sqrt((x1 - x2)*(x1 - x2) +
                    (y1 - y2)*(y1 - y2));
    return Math.ceil(d/(2*r));
}
 
// Driver code
    let r = 2, x1 = 0, y1 = 0, x2 = 0, y2 = 4;
    document.write(minRevolutions(r, x1, y1, x2, y2));
 
</script>

Output : 
 

 1

Time Complexity : O(1)
This article is contributed by Rakesh Kumar. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
 




My Personal Notes arrow_drop_up
Recommended Articles
Page :

Start Your Coding Journey Now!