线性变换

 写了个能验证线性变换的程序,主要是用来验证https://www.bilibili.com/video/av5987715/

这个教学视频的线性代数内容,学习和实践相结合,知行合一嘛~

原始就是一个正方形,随便按一个按键就能够进行旋转操作,旋转后的画面不重绘,所以就出现了这样连续的图形。

绘图采用的windows经典图形架构,不罗嗦了。

主要写了这样的几个类,实现图形描述,画图,旋转等操作。

先介绍MyPoint这个类。原本想用CPoint的,结果VS2017中不包含那个头文件,所以没办法了,只能自己写一个。

就是用来描述点的,数据做了点封装,具体如下:

 1 class MyPoint
 2 {
 3 private:
 4     int x;
 5     int y;
 6 public:
 7     MyPoint() :x(0),y(0){};
 8     MyPoint(int xval, int yval) :x(xval), y(yval) {};
 9     inline void SetX(int xval) { x = xval; };
10     inline void SetY(int yval) { y = yval; };
11     int GetX() { return x; };
12     int GetY() { return y; };
13     void SetXY(int xval, int yval) 
14     {
15         SetX(xval);
16         SetY(yval);
17     }
18     MyPoint & operator += (MyPoint & Offset)
19     {
20         x += Offset.x;
21         y += Offset.y;
22         return *this;
23     };
24     MyPoint & operator = (MyPoint & Offset)
25     {
26         x = Offset.x;
27         y = Offset.y;
28         return *this;
29     };
30     ~MyPoint() {};
31 };

BasicShape这个类数据主要包含了多个点,,然后按照顺寻,将这些点依次连接起来,形成一个图形闭环。

这个类还不完善,目前实现自我旋转的函数是在画图的时候画出来的,没有在类的内部进行封装。因此这部分还要改善。

 1 class BasicShape
 2 {
 3 private:
 4     std::vector<MyPoint> ShapeData;
 5 public:
 6     BasicShape();
 7     /*位置调整*/
 8     void SetPosition(MyPosition & NewPosition);
 9     int DrawShape(HDC hdc);
10     int RotateShape(float angle);
11     ~BasicShape();
12 };

Rotate类是实现数据旋转的,其实就是个描述矩阵。

Switchto函数的主要功能是根据输入的角度生成对应的矩阵,然后在调用RotatePoint函数对单独的点进行线性变换。

 1 class Rotater
 2 {
 3 private:
 4     float x_i, x_j;
 5     float y_i, y_j;
 6 public:
 7     Rotater():x_i (1), y_i(0), x_j(0), y_j(1){};
 8     void Switchto(float angle);
 9     void RotatePoint( MyPoint & Point );
10 };

 

posted @ 2018-01-07 20:34  Matrix_R  阅读(790)  评论(0编辑  收藏  举报