若要实现某几个点都绕固定一点90°旋转,可以用下面方法实现。
#注意#坐标方向是以窗口坐标方向为例
分析以上旋转过程:
①变化过程为:
X变化:X2=X0+(Y1-Y0).
该过程是X坐标减小的过程,且Y1-Y0 < 0,因此符合情况。
Y变化:Y2=Y0+0.
为什么要加一个零?,因为零可以用X0-X1表示。
即 Y2=Y0+(X0-X1).
②变化过程为:
X变化:X3=X0+0.
同上,这里的零也可以用(Y2-Y0)表示,
即X3=X0+(Y2-Y0).
Y变化:Y3=Y0+(X0-X2).
该过程是Y坐标增大的过程,且X0-X2 > 0,因此也符合情况。
最后,分析上述情况,可总结为:
Xa Ya表示90°旋转之后的坐标。
Xb Y0表示90°旋转之前的坐标。
Xa= X0+(Yb-Y0).
Ya= Y0+(X0-Xb).
用C语言演示:
#include#define Ox 1 //要绕固定旋转点的X坐标 #define Oy 2 //要绕固定旋转点的Y坐标 char Array[4][4] = { { 0, 0, 0, 0 }, { 0, 1, 0, 0 }, { 1, 1, 1, 0 }, { 0, 0, 0, 0 } }; char Buff[4][4] = { 0 }; void Print() { for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { if (Array[i][j]) printf("#"); else printf("*"); } printf("n"); } } int main() { //旋转之前输出 Print(); //旋转(坐标变换) for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { if (Array[i][j] == 1) { Buff[Oy+(Ox-j)][Ox+(i-Oy)] = Array[i][j]; } } } //将旋转之后存放在Buff中的值再赋值给原数组Array for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { Array[i][j] = Buff[i][j]; } } //换行 printf("n"); //旋转之后输出 Print(); return 0; }
运行结果:
END



