Yesterday i was participating in a contest and faced a nice geometry problem named View Angle. After the contest i managed to solve this problem and here are the problem statement and my solution.
Flatland has recently introduced a new type of an eye check for the driver's licence. The check goes like that: there is a plane with mannequins standing on it. You should tell the value of the minimum angle with the vertex at the origin of coordinates and with all mannequins standing inside or on the boarder of this angle. As you spend lots of time "glued to the screen", your vision is impaired. So you have to write a program that will pass the check for you.
Input
The first line contains a single integer n (1 ≤ n ≤ 105) — the number of mannequins. Next n lines contain two space-separated integers each: xi, yi (|xi|, |yi| ≤ 1000) — the coordinates of the i-th mannequin. It is guaranteed that the origin of the coordinates has no mannequin. It is guaranteed that no two mannequins are located in the same point on the plane.
Output
Print a single real number — the value of the sought angle in degrees. The answer will be considered valid if the relative or absolute error doesn't exceed 10 - 6.
Sample test(s)
Input
2 2 0 0 2
Output
90.0000000000
Input
3 2 0 0 2 -2 2
Output
135.0000000000
Input
4 2 0 0 2 -2 0 0 -2
Output
270.0000000000
Input
2 2 1 1 2
Output
36.8698976458
Solution for first test case
Solution for third test case
Solution for forth test case
Solution
In order to solve this problem its obvious we need to get the angles between every two adjacent points and getting the max angle say A, and the answer will be 360-A "The angle that will include all other points".
C++ Solution
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include<iostream> | |
#include<cmath> | |
#include<algorithm> | |
#include<vector> | |
#include<cstdio> | |
using namespace std; | |
int main() { | |
int n; | |
cin >> n; | |
vector<double> angles; | |
int i, x, y; | |
for(i = 0; i < n; i++) { | |
cin >> x >> y; | |
angles.push_back(atan2(y, x)); | |
} | |
sort(angles.begin(), angles.end()); | |
double mx_diff = 0; | |
for(i = 0; i < n-1; i++) | |
mx_diff = max(mx_diff, angles[i+1]-angles[i]); | |
double diff = angles[0]-angles[n-1]; | |
if(diff < 1e-7) diff += 360*M_PI/180; | |
mx_diff = max(mx_diff, diff); | |
printf("%.10lf\n", 360-(mx_diff*180/M_PI)); | |
} | |
Keep up the great writing.
ReplyDeleteFlow Wrap Machine
Food Packaging Equipment
Bread Packing Machine
Flow Wrap Machine
Good post! We are linking to this particularly great post on our website.
ReplyDeleteglass tile manufacturers
porcelain mosaic
Custom mosaic tiles
pool mosaics