hdu 1700 Points on circle(三角函数应用)

题目链接:点击打开链接


题意:给定一个圆上的点,找另外两个圆上的点,使这三个点互相间距离最大

就是找一个等边三角形,用角度算,先算出半径r和给定的点的角度,再转120度找到另一个点的角度,然后有公式可得:

以O点为圆心的圆上内接等边三角形中x1+x2=-x3;   y1+y2=-y3


此题卡了一天

首先cmath中的atan cos等函数返回值是弧度制。

atan的返回值范围是pi/2至-pi/2,所以假如角度是170度结果会返回-10度,这样再用cos,sin求点就错了,结果需要加一个pi。

还有当x<0&&y==0时,应返回-pi,但返回的是-0。

所以需要特判的就是y!=0&&x<0和y==0&&x<0的两种情况


还有本题判相等是小于0.0005要注意,有数据会卡y1>y2&&y1-y2<0.0005


本题也可以解方程做


代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#define pi acos(-1.0)
using namespace std;

int main(){
    int T;
    cin>>T;
    while(T--){
        double x,y;
        scanf("%lf%lf",&x,&y);
        double r=sqrt(x*x+y*y);
        double a=atan(y/x);
        if(x<0&&y!=0)a+=pi;
        if(x<0&&y==0)a=-pi;
        a+=(pi*2*1.0/3);
        double x1=r*cos(a);
        double y1=r*sin(a);
        double x2=-(x+x1);
        double y2=-(y+y1);
        if((fabs(y1-y2)<0.0005&&x1<x2)||fabs(y1-y2)>=0.0005&&y1<y2)
             printf("%.3lf %.3lf %.3lf %.3lf\n",x1,y1,x2,y2);
        else printf("%.3lf %.3lf %.3lf %.3lf\n",x2,y2,x1,y1);

    }
    return 0;
}


你可能感兴趣的:(hdu 1700 Points on circle(三角函数应用))