2016HUAS_ACM暑假集训2L

一个简单的几何题,自己在纸上列出方程解出结果的表达式,再用程序表达出来就行了。

不过老司机(老司机的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 }
View Code
原文地址:https://www.cnblogs.com/ankelen/p/5686025.html