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