题目链接:点击打开链接
题意:给定一个圆上的点,找另外两个圆上的点,使这三个点互相间距离最大
就是找一个等边三角形,用角度算,先算出半径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; }