hdu4998(几何----平面 旋转)

本文探讨了如何通过旋转平面并求解旋转中心的问题,详细解释了旋转角度、旋转中心和旋转过程的数学原理,提供了具体的算法实现和代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:给一个平面,将平面旋转n次,每次旋转都是围绕一个点,得到平面D,求围绕一个点转rad弧度得到平面D。

思路分析:每次旋转平面,平面上的点都会跟着一起转动,旋转角度可以确定,等于每次旋转的弧度之和。在平面上任取一个点,模拟每次旋转得到终点。然后初始点、终点、弧度确定,然后求旋转中心。解一个方程就可以了

代码如下:

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<math.h>
#include<cstring>
#include<string>

#define inf 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 10e-6
using namespace std;
struct point
{
    double x,y;
    point(double a = 0,double b = 0):x(a),y(b){ }
};
typedef point vector;
vector operator -(point a,point b)
{
    return vector(a.x-b.x,a.y-b.y);
}
vector rotation(vector A,double rad)//向量A旋转rad个弧度
{
    return vector(A.x*cos(rad)-A.y*sin(rad), A.x*sin(rad)+A.y*cos(rad) );
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
         int n,i;
         scanf("%d",&n);
         point a(0,0);
         double sum = 0;
         for(i = 0; i < n; i++)
         {
                point b;
                double rad;
                scanf("%lf%lf%lf",&b.x,&b.y,&rad);
                sum += rad;
                vector A = b-a;
                vector B = rotation(A,rad);
                a = b-B;
         }
         while(sum-2*pi > eps) sum-=2*pi;
         double c = a.x - a.y*sin(sum)/(1-cos(sum));
         double d = 1 - cos(sum) + sin(sum)*sin(sum)/(1-cos(sum));
         double resx = c/d;
         double resy = (resx*sin(sum) + a.y)/(1-cos(sum));
         printf("%.9lf %.9lf %.9lf\n",resx,resy,sum);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值