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;
}

 

转载于:https://www.cnblogs.com/toufu/p/3614893.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值