/*
1012.Stacking Cylinders 简单计算几何 (判两线段是否重叠?应该不是)
题目大意:
如图所示,给出最底层的n个球的位置,求最顶层的球的位置。
1<=n<=10
解题思路:
关键点在于已知两个圆的圆心坐标,求放在这两个圆上的圆的圆心坐标。
向量+勾股定理。
*/
#include <stdlib.h>
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
struct Center{
double x;
double y;
};
bool cmp(Center a, Center b){
return a.x < b.x;
}
//求C与A B两个球相切的第三个球的x,y坐标。 通过勾股定理得到
void Cal(double x1,double y1,double x2,double y2,double& x3,double& y3){
//AB两球心的距离
double dis=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
//三个球心构成的等腰三角形的中线长
double len=sqrt((2*2) - (dis/2)*(dis/2));
double s,c;
//中线与垂直线的夹角的sin值
s=(y2-y1)/dis;
//中线与垂直线的夹角的cos值
c=(x2-x1)/dis;
//球心C的x坐标 = AB球心连线的中点x坐标 - 多出的长度
x3=(x1+x2)/2-len*s;
//球心C的y坐标 = AB球心连线的中点y坐标 + 少的长度
y3=(y1+y2)/2+len*c;
}
int main()
{
int n;
Center center[10];
while(1){
scanf("%d", &n);
//cin >> n;
if(n == 0)
break;
for(int i=0; i<n; i++){
//cin >> center[i].x;
scanf("%lf", ¢er[i].x);
center[i].y = 1.0;
}
//重点1:题目并未排好序,故需要对数组排序。
sort(center, center+n, cmp);
while(n>1){
//重点2:迭代一次获得上面一行圆筒中心坐标
for( int k=0; k<n-1; k++){
Cal(center[k].x, center[k].y, center[k+1].x, center[k+1].y, center[k].x, center[k].y);
}
n--;
}
//重点3:格式输出需要使用C语言
printf("%.4lf %.4lf\n", center[0].x, center[0].y);
//cout << center[0].x << " " << center[0].y << endl;
}
//system("pause");
return 0;
}