前言
编程核心工作在于数据的表达.数据表达的重点在于数据类型的设计.
引入
前面的帖子中讲过矩阵图形类的设计,分析利弊,再通过几个数据类型设计谈一点思路.
原帖中的不足
Point类必须有颜色
前面设计的Point类型,有的只有坐标而没颜色.这和生产环境是不相符的.Point类型对象连接着图形对象和硬件.站在图形的角度,他由若干个Point类对象组成,这些对象要写入硬件,控制每个点的rgb寄存器以表达颜色.即便在表达图形的时候没有颜色,Point类型对象是要有的.
关于rgb寄存器,笔者想起几十年前玩过的小游戏,操作有一个八向摇杆和一个按钮,图像只有白黑(灰黑?)两色,估计其颜色长度可以被控制在一个字节之内.属于极限压缩空间.所以Point的类型统一如下:
struct Point{
short x_cord;
short y_cord;
char red;
char green;
char blue;
}
Matrix类型对象的优点和缺点
此前Matrix类型是这样的:
struct Matrix{
int width;
int length;
vector<vector<Point>> vvp;
vector<Matrix> vm;
}
这里的vm表达的是一种"延伸",随时可以往下增加内容.当时看来这是一种很好的"自顶向下"的设计方法,但仔细看来,他无法表达元素中的相对关系(位置关系),所以需要修改.
解决方法:要实现自由延伸的思路,按笔者另一篇帖子中Object类型的思路,如下所示:
struct Matrix:public Object{ //继承object,用于数据的自由延展
... //Matrix自带属性
}
单色矩阵类设计
为了更好对数据类型设计,将矩阵类设计分为单色矩阵类和图像矩阵类,再对他们进行分析
以下是单色矩阵类代码表达:
struct SingleMatrix{
int width;
int length;
char red;
char green;
char blue;
vector<vector<Point>> vvp;
}
说明:按自由扩展的原则,所有的类型应该加上继承Object类,但对于基本类型而言,可以不用
vvp有表示点的二维数组的算法,略.
单色矩形类设计
由单色矩阵类衍生出单色矩形类,读者可自行完成.
提示:基本结构是一样的,差别在vvp的算法
图像矩阵类设计
以下是图像矩阵类设计的表达
struct PixelMatrix{
int width;
int length;
vector<vector<Point>> vvp;
}
单色矩阵类和图像矩阵类的区别
回到开始的问题,为什么要做这样的区分?
举例:生成一个长100,宽50的黑色矩阵图.表达如下
struct SingleMatrix blackMatrix(100,50,0,0,0);
然而要用类似方法生成一个彩色矩阵类图像,是不可能的(当然也可以往vvp里一个个写,但谁会这么做呢?)
二者区别 :++单色矩阵类对象++ 可以通过"++数据类型+参数++ "生成对象.而++图像矩阵类对象++ 必须先有++完整的数据描述++,才可以生成对象.单色矩阵类对象是可以"主动"生成,而图像矩阵类对象只能"被动"生成.两者比较,单色矩阵类对象在不需要具体数据操作的情况下节约一些空间.
图像矩阵类对象应用场景举例
:在windows操作中,有一个"Win+Shift+s"的截屏操作,就是生成了一个图像矩阵类对象.简单描述思路如下:
1.鼠标起始位置和终点位置的坐标之间的矩形,记录下坐标,例如(x1,y1)和(x2,y2),用y2-y1,x2-x1即PixelMatrix中的width和length.
2.显示器本身也是个PixelMatrix对象,找到对应的Point集合的颜色信息,写入新对象的vvp中
算法略.
常见问题
在数据类型的设计中细分出了单色矩阵类和图像矩阵类,加上矩形类,像素图形类(见本系列前面的贴),很容易想到的问题是:如何将不同的对象混合起来.例如在Photoshop中很常见,单色矩阵类对象混合像素图形类,图像矩阵类对象混合像素图形类对象,实现生成图片和修改图片的各种效果.---将在后续帖子中讨论
延伸
本贴内容简单做一些发散思考,编程上的延伸.
缓存机制
缓存机制和本贴关系不大,关联在于++完整数据++这几个字.如上图像矩阵类对象有完整的数据描述.
数据有标识(指针或者数据对象名),数据访问通过"指向首元素的指针+偏移"进行.缓存机制是将文件数据(或者文件中的数据对象)复制到内存中.与之对应的,"清空缓存"是将复制到内存中的数据删除,只留下指向数据的指针或索引(指向数据库中的数据)
3D模型
谈论最简单的3D模型,在所有二维数据基础上加上一个高度height即可.例如:
struct ThreePixelMatrix{ //长方体
int width;
int length;
int height; //高度
vector<vector<vector<Point>>> vvvp; //三维点集
}
当然这是不成熟的做法,因为这样做处理的数据量惊人,很明显在实心3D模型外面抽个壳就行了.可以试想一下,做3D模型需要对各种曲线方程或曲面方程有深入的理解.更多内容不在此讨论.
小结
矩阵类对象的细分,以及一些解决问题思路.