给你一排圆,然后一排一排网上叠,求最上面那个圆的圆心,
求上面那排圆的圆心可以用旋转然后求直线的交点
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
#define eps 1e-10
struct point
{
double x, y;
point (double xx = 0, double yy = 0)
{
x =xx, y = yy;
}
point operator - (const point &b) const
{
return point(x - b.x, y - b.y);
}
double operator ^ (const point &b) const
{
return x*b.y - b.x*y;
}
double operator * (const point &b) const
{
return x*b.x + y*b.y;
}
};
int sgn(double x)
{
if(fabs(x) < eps) return 0;
if(x > 0) return 1;
return -1;
}
struct Line
{
point s, e;
Line(){};
Line(point a, point b)
{
s = a, e = b;
}
point operator &(const Line &b) const
{
point res = s;
if(sgn((s - e)^(b.s - b.e)) == 0)
return res;
double t = ((s - b.s)^(b.s - b.e))/((s - e)^(b.s - b.e));
res.x += (e.x - s.x)*t;
res.y += (e.y - s.y)*t;
return res;
}
};
vector<point> sta[11];
int cmp(point a, point b)
{
return a.x < b.x;
}
double getdis(point a, point b)
{
return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y));
}
point Rotate(point p, double angle)
{
point res;
res.x = p.x*cos(angle) - p.y*sin(angle);
res.y = p.x*sin(angle) + p.y*cos(angle);
return res;
}
void solve(int n)
{
for( int i = n - 1; i > 0; i--)
{
sta[i].clear();
for( int j = 0; j < i; j++)
{
point a = sta[i+1][j];
point b = sta[i+1][j+1];
// cout<<a.x<<" -- "<<a.y<<endl;
//cout<<b.x<<" -- "<<b.y<<endl;
double len = getdis(a, b);
double angle = acos(len/4.0);
// cout<<" -- "<<angle<<endl;
point aa = Rotate(a-b,-angle);
aa.x += b.x, aa.y += b.y;
point bb = Rotate(b-a, angle);
bb.x += a.x, bb.y += a.y;
Line l1 = Line(aa,b);
Line l2 = Line(bb,a);
point p = l1&l2;
// cout<<p.x<<" -- "<<p.y<<endl;
sta[i].push_back(p);
}
}
}
int main()
{
int n;
while(scanf("%d",&n) != EOF && n)
{
point res;
sta[n].clear();
for( int i = 0; i < n; i++)
{
scanf("%lf",&res.x);
res.y = 1;
sta[n].push_back(res);
}
sort(sta[n].begin(), sta[n].end(), cmp);
solve(n);
printf("%.4f %.4f\n",sta[1][0].x, sta[1][0].y);
}
return 0;
}