一.预备知识
1.相关的矩阵
在一个二维直角坐标系中,有一个点在坐标(x,y)处,它与原点之间的连线与x轴正半轴的夹角为α,
此时它绕原点旋转度并落在(x1,y1)处,即:
此时x1,y1,x,y存在以下关系:
2.Easyx图形库相关函数
//1.这个函数用于初始化绘图窗口
initgraph(600, 600, NULL);
void setbkcolor(COLORREF color);//函数用于设置当前设备绘图背景色
void cleardevice();//这个函数使用当前背景色清空绘图设备。
void setorigin(int x, int y);//这个函数用于设置坐标原点。
void setlinecolor(COLORREF color);//这个函数用于设置当前设备画线颜色。
//setlinestyle函数用于设置当前设备画线样式。
setlinestyle(PS_SOLID, 5);//此代码意为设置画线样式为宽度 10 像素的实线
//这个函数用于画直线。
//
//void line(
// int x1,
// int y1,
// int x2,
// int y2
//);
//参数
//x1
//直线的起始点的 x 坐标。
//
//y1
//直线的起始点的 y 坐标。
//
//x2
//直线的终止点的 x 坐标。
//
//y2
//直线的终止点的 y 坐标。
line(-300, 0, 300, 0);
二.代码实现
实现代码如下:
#include<iostream>
#include<cmath>
#include<graphics.h>
#define X 20
#define Y 20
constexpr bool LIMITLESS = true;
//通过矩阵相乘的公式计算坐标(x1,y1)
void multiply(double(*v)[1], double(*changev)[2], double& _x, double& _y) {
_x = changev[0][0] * v[0][0] + changev[0][1] * v[1][0];
_y = changev[1][0] * v[0][0] + changev[1][1] * v[1][0];
}
//经过一次旋转后线的位置
void setnewline(double& _x, double& _y) {
setlinecolor(DARKGRAY);//设置线的颜色
setlinestyle(PS_SOLID, 4);//设置线的样式
line(0, 0, _x, _y);//旋转后的线
}
int main() {
initgraph(600, 600, NULL);//加载窗口
setbkcolor(LIGHTBLUE);//设置背景颜色
cleardevice();//清空绘图设备
setorigin(300, 300);//将原来(300,300)的位置设置为原点
//绘制XY轴(居中显示XY坐标)
setlinecolor(RED);
setlinestyle(PS_SOLID, 5);
line(0, -300, 0, 300);
line(-300, 0, 300, 0);
//theta += ...可控制旋转的快慢
for (double theta = 0.01; LIMITLESS; theta += 0.01) {
double x = 0, y = 0;
//列向量
double vector[2][1] = { {200},
{200} };
//旋转矩阵
double matrix[2][2] = {
{cos(theta),-sin(theta)},
{sin(theta),cos(theta)}
};
//通过相乘得到新的矩阵
multiply(vector, matrix, x, y);
//休息0.1s
Sleep(100);
//经过一次旋转后线的位置
setnewline(x,y);
}
return 0;
}
如果想让原来的线条消失,只需将setbkcolor和cleardevice两个函数加到setnewline函数最上面,并在最后加上Sleep函数,即可达到效果,即:
void setnewline(double& _x, double& _y) {
setbkcolor(LIGHTBLUE);//设置背景颜色
cleardevice();//清空绘图设备
setlinecolor(RED);
setlinestyle(PS_SOLID, 5);
line(0, -300, 0, 300);
line(-300, 0, 300, 0);
setlinecolor(DARKGRAY);//设置线的颜色
setlinestyle(PS_SOLID, 4);//设置线的样式
line(0, 0, _x, _y);//旋转后的线
Sleep(100);
}