数据类设计_单色矩阵类/图像矩阵类&引申内容_缓存机制_3D模型

前言

编程核心工作在于数据的表达.数据表达的重点在于数据类型的设计.

引入

前面的帖子中讲过矩阵图形类的设计,分析利弊,再通过几个数据类型设计谈一点思路.

原帖中的不足

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模型需要对各种曲线方程或曲面方程有深入的理解.更多内容不在此讨论.

小结

矩阵类对象的细分,以及一些解决问题思路.

相关推荐
jllws19 个月前
数据类设计_图片类设计_矩阵图类型和像素图类型设计的补充
前端·c++·矩阵·数据类设计
jllws110 个月前
数据类设计_图片类设计之8_自由图形类设计_(前端架构)
前端·c++·数据类设计
jllws110 个月前
数据类设计_图片类设计之7_矩阵图形类设计更新_实战之页面简单设计(前端架构)
前端·数据类设计·c++实战
jllws110 个月前
数据类设计_图片类设计之4_规则类图形混合算法(前端架构)
c++·计算机图形学·前端架构·数据类设计