假设旋转角度为theta,theta的取值范围为-180<=theta<=180,当theta>0时表示逆时针选择,当theta<0时表示顺时针旋转,那么旋转矩阵R为
对于一个NxN阶矩阵,其中心点C坐标为(N/2, N/2),假设任意元素的坐标P1为(x1,y1),旋转旋转后的坐标P2为(x2,y2),那么P2 = R(P1-C)+C。
计算出旋转后的坐标值后,可以把坐标值向最接近的整数取整(即四舍五入)
旋转后矩阵大小的问题:
如果旋转后矩阵任然保持和原来矩阵一样大小,那么可以舍弃那些旋转后坐标值在[0,N)之外的元素,根据坐标映射拷贝矩阵元素到新矩阵中,而没有被映射到的元素应该事先初始化为一个给定值,比如0。
如果想保留所有的旋转后的元素,那么旋转后的矩阵大小可以根据原矩阵四个角点的坐标经过上面旋转计算得到的坐标值的差值得出。还要再做一次坐标映射,根据中心点不动,矩阵原点(左上角)从原矩阵挪到新矩阵。
---------上面是之前一位网友回复的,我有写出代码:
#define Juzhen_Big_N 24
#define JUZHEN_Big_M 13
#define Pai_Pi 3.1415926
#define XUAN_ZHUAN_DU (-10)
typedef struct _Led_Mode_XUANZHUAN_
{
short int X_Postion;
short int Y_Postion;
}_Led_Mode_XUANZHUAN;
_Led_Mode_XUANZHUAN Led_Zuo_Biao[Juzhen_Big_N][JUZHEN_Big_M];
_Led_Mode_XUANZHUAN Led_Zuo_Biao_Buf[Juzhen_Big_N][JUZHEN_Big_M];
_Led_Mode_XUANZHUAN Led_Mode_Xuan_Zhuan_Fun(_Led_Mode_XUANZHUAN Old_Postion , U8 C_X , U8 C_Y )
{
_Led_Mode_XUANZHUAN Postion_Buff ;
short int X_buf = 0 , Y_Buf = 0 ;
X_buf = Old_Postion.X_Postion - C_X;
Y_Buf = Old_Postion.Y_Postion - C_Y;
Postion_Buff.X_Postion= (X_buf*cos(XUAN_ZHUAN_DU*Pai_Pi/180)- Y_Buf*sin(XUAN_ZHUAN_DU*Pai_Pi/180)+ C_X);
Postion_Buff.Y_Postion= ( X_buf*sin(XUAN_ZHUAN_DU*Pai_Pi/180)+Y_Buf*cos(XUAN_ZHUAN_DU*Pai_Pi/180)+ C_Y);
return Postion_Buff;
}
void Change_Led_Postion(void)
{
U8 i = 0 , j = 0 ;
for(i=0; i<Juzhen_Big_N ;i++)
{
for(j=0;j<JUZHEN_Big_M;j++)
{
Led_Zuo_Biao[i][j] = Led_Mode_Xuan_Zhuan_Fun(Led_Zuo_Biao_Buf[i][j] , (Juzhen_Big_N/2) , (JUZHEN_Big_M/2));
}
}
for(i=0; i<Juzhen_Big_N ;i++)
{
for(j=0;j<JUZHEN_Big_M;j++)
{
Led_Zuo_Biao_Buf[i][j].X_Postion = Led_Zuo_Biao[i][j].X_Postion;
Led_Zuo_Biao_Buf[i][j].Y_Postion = Led_Zuo_Biao[i][j].Y_Postion;
}
}
}
但是代码写出来后,运行起来怪怪的,感觉还是有不对的地方,按照我的设想,
应该是这个网址这样:http://www.zhangxinxu.com/study/201206/css3-transform-matrix-rotate.html
但实际上,好像不对 ,请问有人可以帮我看看吗。