若要实现某几个点都绕固定一点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 <stdio.h>
#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