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

来源:互联网 发布:Linux tail查找 编辑:程序博客网 时间:2024/05/27 14:14

题目链接:点击打开链接


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

就是找一个等边三角形,用角度算,先算出半径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;}


0 0
原创粉丝点击