hdu 1700 向量旋转

题意:给出一个圆,以及给出一个圆上的点,求出另外的圆上两点使得三点两两之和最大

题解:向量旋转
当三个点组成正三角形时,和最大(其中的证明不知道,只是从样例输出看出来的),然后知道
其中一个点,只要围绕原点分别选择120度,240度即可。

 

#include <cstdio>
#include <cmath>
#include <algorithm>

const double PI = acos(-1);

struct point
{
    double x,y;
};

//向量cen->ori绕cen旋转逆时针旋转angle弧度
point getnp(point ori, point cen, double angle)  
{
    //复数平面向量旋转
    point v;
    v.x = ori.x - cen.x;
    v.y = ori.y - cen.y;
    point res;
    res.x = v.x*cos(angle) - v.y*sin(angle) + cen.x;
    res.y = v.x*sin(angle) + v.y*cos(angle) + cen.y;
    return res;
}


int main(void)
{
    int t;
    point src;
    scanf("%d",&t);
    while (t--)
    {
        scanf("%lf%lf",&src.x, &src.y);
        point a,b,o;
        o.x = 0;
        o.y = 0;
        a = getnp(src,o,PI*2.0/3.0);
        b = getnp(src,o,PI*4.0/3.0);
        if (a.y > b.y)
            std::swap(a,b);
        else if (a.y == b.y && a.x > b.x)
            std::swap(a,b);
        printf("%.3lf %.3lf %.3lf %.3lf\n",a.x,a.y,b.x,b.y);
    }
    return 0;
}

 

posted @ 2014-03-20 23:22  辛力啤  阅读(186)  评论(0编辑  收藏  举报