一个点绕另一个点旋转a度 问题

公式如下,(x1,y1)为要转的点,(x2,y2)为中心点,如果是顺时针角度为-,


x=(x1-x2)cosθ-(y1-y2)sinθ+x2

y=(y1-y2)cosθ+(x1-x2)sinθ+y2

eg:bnu4226神技•八方鬼缚阵

就是简单的模拟加上点的旋转

在网络预赛中我们简单介绍了东方系列的格斗游戏,然而,东方系列( Tohou Project )最为经典的是它的纵卷轴弹幕射击游戏( Lsy 和小陆同学却于此无爱~)。此类游戏中,弹幕被精心安排成特定几何形状,具有高度的视觉冲击力;音乐动感十足,与弹幕节奏配合得恰到好处;另外,符卡系统也是游戏的一大特色,只有玩家不放 Bomb (雷,放出后有较大杀伤力并且此段时间内即使被弹幕击中也不会掉一条命)、不被弹幕击中且在规定时间内击破 Boss 才算成功破解此种符卡。以下是某些 BOSS 的弹幕:

  

 

 
好的,现在问题来了。有这么一种符卡,叫做八方鬼缚阵(呃,其实叫什么都无所谓),为了描述方便,我们现在以 Boss 的位置为原点建立一个直角坐标系, boss 在第 1 秒的时候放出两颗子弹,位于( 0 0 ),( 1 0 )。
2 秒时,除( 1 0 )点外所有子弹会复制自身,复制出来的子弹绕( 1 0 )点顺时针旋转 90 度到达新位置,新的弹幕组中最后一颗子弹位于( 1 1 )。
3 秒时,除( 1 1 )点外所有子弹复制自身,复制出来的子弹绕( 1 1 )再次顺时针旋转 90 度。因此类推,下图给出了 5s 后的子弹分布:红点标出了每次旋转的中心,红色的( 0 0 )点表示原点。
 
下面请你输出 n 秒后所有子弹的位置以便 XsugarX 能成功地挑战这张符卡。

代码:

/*I believe xiaoxuzizhucan*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;
#define MOD 10000000
typedef struct
{
    int x;
    int y;
} node;
node q[1000005];


int  main()
{

    int cos=0;
    int sin=-1;
//printf("%d\n",suan(0,0,1,0);
//
//    int cos=0;
//    int sin=1;
//    int x=1;
//    int y=1;
//    int tx=0;
//    int ty=0;
//    int zx=tx*cos-ty*sin;
//    int zy=tx*sin+ty*cos;
//    printf("%d %d",zx,zy);
    int test;
    scanf("%d",&test);
    while(test--)

    {
        int n;

        scanf("%d",&n);
        n--;
        q[0].x=0;
        q[0].y=0;
        q[1].x=1;
        q[1].y=0;
        int count=2;
        int xia=1;
        while(n--)
        {
            int x2=q[xia].x;
            int y2=q[xia].y;
            int sbcount=count-1;

            for(int i=sbcount-1; i>=0; i--)
            {

                int x1=q[i].x;
                int y1=q[i].y;
                if(x1==x2&&y1==y2)
                    continue;
                if(i==0)
                {


                    //q[count].x= x2+y1-y2;
                    q[count].x=(x1-x2)*cos-(y1-y2)*sin+x2;

                    // q[count].y=x2+y2-x1;
                    q[count].y= (y1-y2)*cos+(x1-x2)*sin+y2;
                    xia=count;
                    count++;

                }
                else
                {
                    q[count].x=(x1-x2)*cos-(y1-y2)*sin+x2;

                    // q[count].y=x2+y2-x1;
                    q[count].y= (y1-y2)*cos+(x1-x2)*sin+y2;
                    count++;
                }

            }
        }
        for(int i=0; i<count; i++)
            printf("%d %d\n",q[i].x,q[i].y);
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值