POJ - 2194

给你一排圆,然后一排一排网上叠,求最上面那个圆的圆心,
求上面那排圆的圆心可以用旋转然后求直线的交点

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值