Minimum revolutions to move center of a circle to a target
Last Updated :
14 Sep, 2023
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
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++
#include<bits/stdc++.h>
using namespace std;
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));
}
int main()
{
int r = 2, x1 = 0, y1 = 0, x2 = 0, y2 = 4;
cout << minRevolutions(r, x1, y1, x2, y2);
return 0;
}
|
Java
class GFG {
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));
}
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));
}
}
|
Python3
import math
def minRevolutions(r,x1,y1,x2,y2):
d = math.sqrt((x1 - x2) * (x1 - x2) +
(y1 - y2) * (y1 - y2))
return math.ceil(d / ( 2 * r))
r = 2
x1 = 0
y1 = 0
x2 = 0
y2 = 4
print (minRevolutions(r, x1, y1, x2, y2))
|
C#
using System;
class GFG {
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));
}
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));
}
}
|
PHP
<?php
function minRevolutions( $r , $x1 , $y1 ,
$x2 , $y2 )
{
$d = sqrt(( $x1 - $x2 ) * ( $x1 - $x2 ) +
( $y1 - $y2 ) * ( $y1 - $y2 ));
return ceil ( $d / (2 * $r ));
}
$r = 2; $x1 = 0; $y1 = 0; $x2 = 0; $y2 = 4;
echo minRevolutions( $r , $x1 , $y1 , $x2 , $y2 );
?>
|
Javascript
<script>
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));
}
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)
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...