当前位置: 首页 > news >正文

数据类设计_图片类设计之9_图标类设计_C++实战_(前端架构)

前言

        学的东西多了,要想办法用出来.C和C++是偏向底层的语言,直接与数据打交道.尝试做一些和数据方面相关的内容

引入

        前面写了矩阵图形类对象和像素图形类对象,本贴通过一个快捷方式图标类的设计,来继续数据类型设计的一些讨论.

        快捷方式图标是这个样子:

                                                    

属性分析

        首先,快捷方式的图标是能够拖动的.所以他是像素图形类对象(Pixel_pic).

         如前所述,属性是类型所有对象的共有特征.对抽出的几个对象特征分析如下:

         1)Word图标:第一层多个Matrix对象,第二层一个混合了w的Matrix对象,一个箭头图标,一个字符串

         2)PowerPoint图标:第一层一个圆形对象(未定义),第二层一个混合了p的Matrix对象,一个箭头图标,一个字符串

         3)Excel图标和Word图标类似.

===========================内容分割线↓=====================================

        在写代码的过程中,需要不断反思以提高分析和解决问题的能力.

        分析问题通常有两种途径:

                1.以现有的"已知"去完成"未知"

                2.预设结果反推条件

===========================内容分割线↑=====================================

        第一个已知

        在前一篇帖子数据类设计_图片类设计之8_自由图形类设计_(前端架构)-CSDN博客中已有两个函数build_in和build_out表达"像素图"的混合.与之关联的类型定义及算法同样在链接贴子里.

//像素混合器定义
class Pixel_pic_Builder {
public:
    Assistant_matrix& build_in(short x_ref, short y_ref, Assistant_matrix& ax, Pixel_pic& source) {
        //辅助矩阵类对象的初始行指针,定位到被放入像素图的基点位置
        auto axd = ax.aps.begin() + x_ref;
        //遍历像素图
        for (auto pcd = source.pps.begin(); pcd != source.pps.end(); pcd++) {
            axd = axd + (*pcd).x_cord;                    //行指针偏移
            //*axd表示得到该行,行仍然是一个vector对象,所以调用begin()基点位置,并计算坐标
            auto axdd = (*axd).begin() + y_ref + (*pcd).y_cord;
            (*axdd).red = (*pcd).red;
            (*axdd).green = (*pcd).green;
            (*axdd).blue = (*pcd).blue;
            (*axdd).is_choosed = true;                   //该点已被选中
        }
        //返回辅助矩阵类对象
        return ax;
    }
    Pixel_pic& build_out(Assistant_matrix& ax) {
        //生成一个空的对象表示结果
        Pixel_pic result;
        short i = 0,j=0;
        for ( auto axd=ax.aps.begin() ; axd!=ax.aps.end();axd++,i++)
            for (auto axdd = (*axd).begin(); axdd != (*axd).end();axdd++, j++) {
                //如果显示被标记
                if ((*axdd).is_choosed) {
                    result.pps.push_back(Pixel_point{ i,j,(*axdd).red,(*axdd).green,(*axdd).blue });
                }
            }
        return result;
    }
};

        第二个已知

        图标类对象是像素图.

类型设计

        有了上述准备,大致对快捷方式图标类有了以下的草稿:

//快捷方式图标类----伪代码,草稿
struct ShortCut{
    vector<Pixel_pic>& resource;        //源像素图集合
    string text;                       //文本
    Pixel_pic    shortcut;             //像素图,结果---核心属性
    ShortCut(vector<Pixel_pic>& re,Pixel_pic& arrow,vector<Pixel_pic> &zifu_pic)
    {.......}                           //混合算法 
}

         1>矩阵图形类对象转换成像素图形类对象

           前面的像素图混合算法要求把像素图放入辅助矩阵类对象中.所以本身矩阵类图形对象需要转换成像素图对象.可以把这个函数写入工具类Pixel_pic_Builder中,代码如下:

Pixel_pic & matrix_change_pixelpic(Matrix& mx){
    short i,j=0;
    //声明一个对象接收
    Pixel_pic receive;
    for(auto mxd=mx.begin();mxd!=mx.end();mxd++,i++)
        for(auto mxdd=(*mxd).begin();mxdd!=mxd.end();mxdd++,j++){
            receive.pps.push_back(Pix_point{i,j,(*mxdd).red,(*mxdd).green,(*mxdd).blue});
        }
    return receive;
}

        2>字符串"做成"字符图

        在数据类设计_图片类设计之5_不规则类图形混合算法(前端架构)-CSDN博客中,字符的定义


//字符图形类定义
struct Zifu{
    vector<Zifu_point> zps;
}
//字符点类定义
struct Zifu_point{
    short x_cord;    //x坐标,相对于基点的x值
    short y_cord;    //y坐标,相对于基点的y值
}

        这里需要把字符做成图,颜色取白色(255,255,255),可以把他写入工具类Pixel_pic_Builder中

//字符转成白色的点
Pixel_pic & zifu_change_pixelpic(Zifu& zf){
    Pixel_pic receive;
    for(auto zfd=zf.zps.begin();zfd!=zf.zps.end();zfd++){
        receive.pps.push_back(Pix_point{(*zfd).x_cord,(*zfd).y_cord},255,255,255});
    }
}

         3>混合时注意事项

        字符的多少和辅助矩阵大小有关系,如图:

                                        

        选中后外面的矩形框,就是辅助矩阵类对象的长和高.可以看出,他们是不一样的.所以在写混合算法时要注意开来.稍后在代码中说明.

              4>类型的完整定义

        注意:第一步在外面把图形混合了,就是除了箭头和字符的那部分,不管用多少次build_in,他会得到一个Pixel_pic对象,将其传入resource里.

//快捷方式图标类
struct ShortCut{
    Pixel_pic    shortcut;                              //像素图,结果---核心属性
    //构造函数
    ShortCut(Pixel_pic& resource,Pixel_pic& arrow,vector<Pixel_pic> &zifu_pic){
        /限制10字符的文本输入
        if(zifu_pic.size()<=10){   
            Assistant_matrix ax;                        //声明辅助矩阵类对象,就是外边框
            Pixel_pic_Builder pb;                       //生成混合器对象,工具类
            ax=pb.build_in(50,50,ax,resource);          //把外面图形混合进去,硬编码50,50
            Pixel_pic ar=pb.matrix_change_pixelpic(ax); //把箭头从矩阵图形类对象转成像素图
            ax=pb.build_in(80,40,ax,ar);                //箭头写入,硬编码80,40
            short x_cord=60,y_cord=60;                  //第一个字符定位(60,60),以后y方向加20
            for(auto zcd=zifu_pic.begin();zcd!=zifu_pic.end();zcd++,y_cord+=20){
                ax=pb.build_in(x_cord,y_cord,ax,*zcd);  //依次添加字符
            }
         shortcut=pb.build_out(ax);                     //提取结果像素图.
        }
        else
            cout<<"请重新输入,程序终止"<<endl;            //给提示
            abort();                                    //退出
    }
}

        好了,一个并不完善的构造函数写完了.

构造函数说明

        1>只能实现字符小于10个的功能.

        像word,excel,powerpoint,在10个字符以内,是可以的.像上面举例的"操作系统OperationSystem"实现不了.强制退出了.笔者偷懒了,毕竟不是要真的写图标,图个省事.

        如果要写的话,后面的辅助矩阵类对象 Assistant_matrix ax的尺寸要修改,并且添加字符图的算法也要做修改.

        2>关于硬编码

        硬编码一般情况是禁止出现的.哪怕用const变量取替代.但硬编码不是绝对不行的,试想如果其他尺寸被限制了,硬编码是不是达到的效果是一样的呢?

        3>核心属性

        笔者把类型中的属性分为核心属性冗余属性两种.

        核心属性表示对象正是被核心属性所组成.而冗余属性表示对象的内容需要被外界所获得(加api).所以这里只给了核心属性Pixel_pic    shortcut;如果要给vector<Pixel_point> pps;也是可以的.

        4>关于arrow箭头图标

        箭头图标是个事实上的对象,所以直接作为构造函数的参数写进来.这是表现的重点.如果下次写个左上角有朵花的图标,同样的操作.

问题

        始终有个觉得不顺畅的是矩阵类对象的长高,以及像素图的尺寸长高应该有所表现.这个问题暂时没发现,可能会出bug.如果有,那把这两个属性定义在类对象上面,并且在算法中给出限制,想来可以解决.

类型设计的小结

        平常看来,类型设计只要把属性是上面弄清楚,写上去就行了.这里做了些拓展,共分为4个部分:

        1>组成        

Pixel_pic& resource,
Pixel_pic& arrow,
vector<Pixel_pic> &zifu_pic

         这三个属性表示图标内元素的组成,且用了混合算法合在了一起.

        2>终极形态

        也就是核心属性

        3>特征

        特征是arrow,箭头图标.区别于其他类型的关键因素

        

        

相关文章:

  • 插值查找和斐波那契查找
  • 金桔网桥连载5-详解
  • pikachu靶场实战记录
  • OrangePi 5B 内核开启 CONFIG_CIFS 通过 Samba 挂载 NAS 路径
  • 文件上传绕过的小点总结(3)
  • C++效率掌握之STL库:stack queue函数全解
  • C++ 利用类模板实现一个数组类封装
  • 《数字图像处理》第三章 3.7 混合空间增强法笔记:原理、实现与Python实战
  • 【赵渝强老师】达梦数据库的物理存储结构
  • 使用Langchain4J整合springboot+流式数据响应示例
  • # Ubuntu 软件包管理:apt、snap 和 Flatpak 如何选择
  • GitHub 上的 Khoj 项目:打造你的专属 AI 第二大脑
  • MySQL 的索引类型有哪些?应该怎么选择?
  • React - LineChart组件编写(用于查看每日流水图表)
  • AI日报 - 2025年3月25日
  • 外观模式 (Facade Pattern)
  • 单片机串口打印调试信息②
  • 数据不外传!通过内网穿透实现绿联NAS远程访问的安全配置方案
  • 基于python的租房网站-房屋出租租赁系统(python+django+vue)源码+运行步骤
  • 第四天 开始Unity Shader的学习之旅之Unity中的基础光照
  • 以总理:在加沙地带扩大的军事行动将是“高强度”的
  • 普京称俄中关系对维护世界稳定具有战略意义
  • 旧宫新语|瑞琦:再探《古玩图》——清宫艺术品的前世与今生
  • 英伟达:美国无法操纵监管机构在AI领域取胜,美企应专注创新而不是编造荒诞谣言
  • 五一假期上海多个景点人流如织,警方多措并举确保秩序
  • “五一”假期首日:国铁南宁局发送旅客81.7万人次