一个简单的几何题,自己在纸上列出方程解出结果的表达式,再用程序表达出来就行了。
不过老司机(老司机的woodcoding)说用旋转向量法比较简单,有时间要去看一看。
大致题意:一个圆心在原点的圆,半径未知,现在给你圆上的一点,让你在这个圆上找到另外两点,使得这三点构成的三角形的周长最长。
样例输入:(第一行为一个整数N,表示后面有N组案例,每个案例给出一组圆上点的坐标)
2
1.500 2.000
563.585 1.251
样例输出:(其他两个点的坐标)
0.982 -2.299 -2.482 0.299
-280.709 -488.704 -282.876 487.453
主要思路:首先,一个圆的内接三角形周长最长的是正三角形。设给出的为点A(x,y),圆的半径为R,连接AO,反向延长AO与圆交于点O',以O'为圆心,R为半径画圆,两个圆的交点坐标就是所求的答案。
记O'(a,b),(a=-x,b=-y)目的只是为了防止混淆。
联立x²+y²=R² ① 和 (x-a)²+(y-b)²=R² ②,然后自己打草稿即可。
1 #include<stdio.h> 2 #include<math.h> 3 int T; 4 int main() 5 { 6 double x,y,a,b,x1,y1,x2,y2,R,A,B,C;//R是圆半径的平方 7 scanf("%d",&T); 8 while(T--) 9 { 10 scanf("%lf %lf",&x,&y); 11 a=-x;b=-y;//(x,y)的对称点(a,b) 12 R=x*x+y*y; 13 A=R; 14 B=-R*b; 15 C=R*R/4-a*a*R; 16 y1=(-B-sqrt(B*B-4*A*C))/(2*A); 17 y2=(-B+sqrt(B*B-4*A*C))/(2*A);//求出y1,y2后还不能马上算x1,x2,防止x作除数 18 if(x==0) 19 { 20 x1=-sqrt(R-y1*y1); 21 x2=sqrt(R-y2*y2); 22 } 23 else 24 { 25 x1=(R/2-b*y1)/a; 26 x2=(R/2-b*y2)/a; 27 } 28 printf("%.3lf %.3lf %.3lf %.3lf ",x1,y1,x2,y2); 29 } 30 return 0; 31 }