将矩阵逆时针旋转90度
2011-03-06
旋转矩阵(Rotation matrix)是在乘以一个向量的时候有改变向量的方向但不改变大小的效果的矩阵。旋转矩阵不包括反演,它可以把右手坐标系改变成左手坐标系或反之。所有旋转加上反演形成了正交矩阵的集合。旋转可分为主动旋转与被动旋转。主动旋转是指将向量逆时针围绕旋转轴所做出的旋转。被动旋转是对坐标轴本身进行的逆时针旋转,它相当于主动旋转的逆操作。
下面使用齐次坐标,变换矩阵:
/*
输入一个n*n的字符矩阵,把它逆时针旋转90度后输出:
经计算n*n方阵旋转90度的变换矩阵为:
0, 1, 0, 0, -1, 0
-1, 0, 0, 其逆矩阵为, 1, 0, 0
n-1, 0, 1 0, n-1, 1
*/
#include <stdio.h>
#define N 4
char m[N][N]= {
{'a', 'b', 'c', 'd'},
{'e', 'f', 'g', 'h'},
{'i', 'j', 'k', 'l'},
{'m', 'n', 'o', 'p'}
};
int main(){
int i, j;
for(i=0; i<N; ++i){
for(j=0; j<N; ++j)
printf("%c ", m[j][N-1-i]);
printf("\n");
}
return 0;
}
比较详细的一个程序:
/*输入N阶矩阵,逆时针旋转90°*/
#include<stdio.h>
#include<stdlib.h>
#define N 20
int a[N][N];
main()
{
int i,k,n,j;
printf("Enter n<=%d\n",N);
scanf("%d",&n);//输入阶数
if(n>N)
{
printf("input error\n");
exit(0);
}
for(i=0;i<n;i++)//输入矩阵元素的值
for(j=0;j<n;j++)
{
printf("a[%d][%d]=",i,j);
scanf("%d",&a[i][j]);
printf("\n");
}
printf("Input the array is:\n");
for(i=0;i<n;i++)//打印出输入的矩阵
{
for(j=0;j<n;j++)
printf("%4d",a[i][j]);
printf("\n");
}
/*逆时针旋转90°的算法*/
for(i=0;i<n/2;i++)/*共有n/2个旋转环*/
for(k=0;k<n-1-i-i;k++)/*每个旋转环共有n-1-i-i个旋转组,每组4个元素,逐个旋转*/
{/*旋转组4个元素,分别是a[i][k+i],a[k+i][n-1-i],a[n-1-i][n-1-i-k]a[n-1-i=k][i]*/
int t;
t =a[i][k+i];
a[i][k+i] =a[k+i][n-1-i];
a[k+i][n-1-i] =a[n-1-i][n-1-i-k];
a[n-1-i][n-1-i-k]=a[n-1-i-k][i];
a[n-1-i-k][i] =t;
}
/*输出旋转后的矩阵*/
printf("After rotating the array is:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%4d",a[i][j]);
printf("\n");
}
return 0;
}
