C++利用矩阵让某一线段绕原点旋转实现代码(EasyX图形库)

一.预备知识

1.相关的矩阵

在一个二维直角坐标系中,有一个点在坐标(x,y)处,它与原点之间的连线与x轴正半轴的夹角为α,

此时它绕原点旋转\theta度并落在(x1,y1)处,即:

此时x1,y1,x,y存在以下关系: 

\begin{bmatrix} x1\\y1 \end{bmatrix} = \begin{bmatrix} cos\theta &-sin\theta \\ sin\theta &cos\theta \end{bmatrix}\begin{bmatrix} x\\y \end{bmatrix} 


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);
}

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WqyEnergetic

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值