给定一个正整数R表示圆的半径和圆心(X1, Y1)以及笛卡尔平面中的另一个点(X2, Y2) ,任务是找到从将(X2, Y2)指向圆。
例子:
Input: R = 6, (X1, Y1) = (5, 1), (X2, Y2) = (6, 9)
Output: 96.1851
Input: R = 4, (X1, Y1) = (7, 12), (X2, Y2) = (3, 4)
Output: 53.1317
方法:根据以下观察可以解决给定的问题:
- 半径与切线和圆的接触点处的切线成90 度角。此外,一对切线 (θ) 所对的角度被连接圆心和外点的线平分。
- 因此,中心和外部点之间的距离可以使用距离公式计算为:
Distance =
Now, consider d as the distance between the two given points, then In the right-angled triangle OAB,
=>
=>
=>
=>
因此,使用上面的公式,可以计算从点(X2,Y2)到圆的切线对之间的角度。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
#include
using namespace std;
// Function to find the distance between
// center and the exterior point
double point_distance(int x1, int y1,
int x2, int y2)
{
// Find the difference between
// the x and y coordinates
int p = (x2 - x1);
int q = (y2 - y1);
// Using the distance formula
double distance = sqrt(p * p
+ q * q);
return distance;
}
// Function to find the angle between
// the pair of tangents drawn from the
// point (X2, Y2) to the circle.
void tangentAngle(int x1, int y1,
int x2, int y2,
double radius)
{
// Calculate the distance between
// the center and exterior point
double distance = point_distance(
x1, y1, x2, y2);
// Invalid Case
if (radius / distance > 1
|| radius / distance < -1) {
cout << -1;
}
// Find the angle using the formula
double result
= 2 * asin(radius / distance) * 180
/ 3.1415;
// Print the resultant angle
cout << result << " degrees";
}
// Driver Code
int main()
{
int radius = 4;
int x1 = 7, y1 = 12;
int x2 = 3, y2 = 4;
tangentAngle(x1, y1, x2, y2, radius);
return 0;
}
Java
// java program for the above approach
import java.io.*;
import java.lang.*;
import java.util.*;
class GFG
{
// Function to find the distance between
// center and the exterior point
static double point_distance(int x1, int y1,
int x2, int y2)
{
// Find the difference between
// the x and y coordinates
int p = (x2 - x1);
int q = (y2 - y1);
// Using the distance formula
double distance = Math.sqrt(p * p
+ q * q);
return distance;
}
// Function to find the angle between
// the pair of tangents drawn from the
// point (X2, Y2) to the circle.
static void tangentAngle(int x1, int y1,
int x2, int y2,
double radius)
{
// Calculate the distance between
// the center and exterior point
double distance = point_distance(
x1, y1, x2, y2);
// Invalid Case
if (radius / distance > 1
|| radius / distance < -1) {
System.out.println(-1);
}
// Find the angle using the formula
double result
= 2 * Math.asin(radius / distance) * 180
/ 3.1415;
// Print the resultant angle
System.out.println(String.format("%.4f", result) + " degrees");
}
// Driver Code
public static void main(String[] args)
{
int radius = 4;
int x1 = 7, y1 = 12;
int x2 = 3, y2 = 4;
tangentAngle(x1, y1, x2, y2, radius);
}
}
// This code is contributed by susmitakundugoaldanga.
Python3
# Python 3 program for the above approach
import math
# Function to find the distance between
# center and the exterior point
def point_distance(x1, y1,
x2, y2):
# Find the difference between
# the x and y coordinates
p = (x2 - x1)
q = (y2 - y1)
# Using the distance formula
distance = math.sqrt(p * p
+ q * q)
return distance
# Function to find the angle between
# the pair of tangents drawn from the
# point (X2, Y2) to the circle.
def tangentAngle(x1, y1,
x2, y2,
radius):
# Calculate the distance between
# the center and exterior point
distance = point_distance(
x1, y1, x2, y2)
# Invalid Case
if (radius / distance > 1
or radius / distance < -1):
print(-1)
# Find the angle using the formula
result = 2 * math.asin(radius / distance) * 180 / 3.1415
# Print the resultant angle
print(result, " degrees")
# Driver Code
if __name__ == "__main__":
radius = 4
x1 = 7
y1 = 12
x2 = 3
y2 = 4
tangentAngle(x1, y1, x2, y2, radius)
# This code is contributed by ukasp.
C#
// C# program for the above approach
using System;
class GFG{
// Function to find the distance between
// center and the exterior point
static double point_distance(int x1, int y1,
int x2, int y2)
{
// Find the difference between
// the x and y coordinates
int p = (x2 - x1);
int q = (y2 - y1);
// Using the distance formula
double distance = Math.Sqrt(p * p + q * q);
return distance;
}
// Function to find the angle between
// the pair of tangents drawn from the
// point (X2, Y2) to the circle.
static void tangentAngle(int x1, int y1, int x2,
int y2, double radius)
{
// Calculate the distance between
// the center and exterior point
double distance = point_distance(x1, y1, x2, y2);
// Invalid Case
if (radius / distance > 1 ||
radius / distance < -1)
{
Console.WriteLine(-1);
}
// Find the angle using the formula
double result = 2 * Math.Asin(
radius / distance) *
180 / 3.1415;
// Print the resultant angle
Console.WriteLine(
String.Format("{0:0.0000}", result) +
" degrees");
}
// Driver code
static void Main()
{
int radius = 4;
int x1 = 7, y1 = 12;
int x2 = 3, y2 = 4;
tangentAngle(x1, y1, x2, y2, radius);
}
}
// This code is contributed by abhinavjain194
Javascript
输出:
53.1317 degrees
时间复杂度: O(1)
辅助空间: O(1)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。