欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Points on Cycle

程序员文章站 2022-03-29 17:52:58
...
There is a cycle with its center on the origin. 
Now give you a point on the cycle, you are to find out the other two points on it, to maximize the sum of the distance between each other
you may assume that the radius of the cycle will not exceed 1000.
 
Input

There are T test cases, in each case there are 2 decimal number representing the coordinate of the given point.
 
Output

For each testcase you are supposed to output the coordinates of both of the unknow points by 3 decimal places of precision 
Alway output the lower one first(with a smaller Y-coordinate value), if they have the same Y value output the one with a smaller X. 

NOTE
when output, if the absolute difference between the coordinate values X1 and X2 is smaller than 0.0005, we assume they are equal.
 
Sample Input

 2
1.500 2.000
563.585 1.251 
 
Sample Output

 0.982 -2.299 -2.482 0.299
-280.709 -488.704 -282.876 487.453 

给出一个以原点为圆心的圆上的一点,问其内接等边三形另外两个点的坐标
刚开始想直接利用三角函数角度的偏移来计算,但是在c中通过反三角函数求出来的角度只能是在-90到90度之间,并不是0到360度,所以无法准确定位角在哪一个向限。所以只能通过向量a向量b,a*b=1/2*|a||b|;a*a+b*b=r*r  x^2+y^2=r^2,这三个公式进行计算


#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
 
int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        double x1,y1,r;
        scanf("%lf%lf",&x1,&y1);
        r = x1*x1+y1*y1;
        double a = 1;
        double b = y1;
        double c = r/4-x1*x1;
        double delta = b*b-4*a*c;
        double ansy1 = (-b-sqrt(delta))/2/a;
        double ansy2 = (-b+sqrt(delta))/2/a;
        double ansx1,ansx2;
        if(fabs(x1)<=1e-7){
            ansx1 = -sqrt(r-ansy1*ansy1);
            ansx2 =  sqrt(r-ansy2*ansy2);
        }
        else{
            ansx1 = (-r/2-y1*ansy1)/x1;
            ansx2 = (-r/2-y1*ansy2)/x1;
        }
        printf("%.3lf %.3lf %.3lf %.3lf\n",ansx1,ansy1,ansx2,ansy2);
    }
    return 0;
}