数据类设计_图片类设计之1_矩阵类设计(前端架构基础)

前言

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

引入

        图形在底层是怎么表示的,用C++来表示

认识图片

        图片是个风景,动物,还是其他内容,人是可以看出来的.那么计算机是怎么看懂的呢?在有自主意识的人工智能被设计出来之前,他是看不懂图片的.他只知道那是一堆点,而且是有顺序的点,这些点有颜色(是黑白两色,或者多少位的颜色看显示器和显卡能否支持)

        图片=有顺序的点集合+点的颜色

其中点的颜色可选,就是说如果是白底黑字的图,可以没有颜色.

图片类的分类

        一开始不好说能分几类,和创造一个概念一样,需要慢慢摸索.假设图片有下面两种:一个有规则,一个没规则.左边是一个矩形,右边是一个样条曲线画的像"人"字

        

 设计两个类:Reg_pic对应左边图形 ,Unreg_pic对应右边图形.他们的点类型不一样,一个命名为Reg_point,另一个命名为Unreg_point.

//规则点类
struct Reg_point{short red;short green;short blue;
}//不规则点类
struct Unreg_point{short x_cord;    //x坐标short y_cord;    //y坐标short red;short green;short blue;
}

注意:

        在图片设计时有个默认设定,每张图左上角的坐标点作为基点存在,Reg_pic可以通过长度和宽度来描述每个点和基点的相对位置,所以不用再定义x_cord和y_cord的属性

       基点存在的意义是什么?前面说了图片里的点有顺序关系在里面,而顺序关系如何表达出来.在规则图类中无需表达(因为这里使用的是实心矩形类),而不规则图类中包含的点坐标,实际上是每个点和基点之间的坐标差值.

Reg_pic的类设计

        "规则图"类暂时还是个概念,可以先从矩形实心类开始,给他取个形象的名字Matrix(矩阵类)

         Matrix矩阵类   

          写法一:站在笔者个人角度,不大愿意用双重指针,或者双重容器的写法,所以如下代码

//规则类接口,暂未定义
struct Reg_pic{
};
//矩阵类声明
struct Matrix : public Reg_pic{           short length;                         //表示长度的点个数,冗余short height;                         //表示高度的点个数vector<Row> rows;                     //图,height多的行数集合Matrix(short Length,short Height,Row row)//构造函数{for(short i=0;i<height;i++){rows.push_back(row);}}
}
//行类声明
struct Row {short length;                         //一行有length多的点组成short red;                            //红色值,16位65536色short green;                          //绿色值,16位short blue;                           //蓝色值,16位vector<Reg_point> reg_points;         //列,点集合Row(short Length, short Red, short Green, short Blue)   //构造函数{for (short i = 0; i < length; i++) {reg_points.push_back(Reg_point{ red,green,blue });};}
};//生成黑色矩阵1000x500像素
int main(void){Row black_row(1000,0,0,0);               //生成1000点长的行(一根黑线1000点组成)Matrix black_matrix(1000,500,black_row); //生成500高的图(一张图有500根黑线)
}

这种写法意思能把层次表达清楚:即图由行集合组成,行由点集合组成.但是给人有些繁琐的感觉,特别是冗余属性(照理说颜色的几个属性也应该写在Matrix类声明里,这样一眼能看出图想表达什么).所以引出第二种写法.

        写法二:很明显矩阵类对象包含的是一个点的二维数组

//更新后的矩阵类声明
struct Matrix : public Reg_pic {short length;                             //表示长度的点个数short height;                             //表示高度的点个数short red;short green;short blue;vector<vector<Reg_point>> matrix;         //图,点的二维数组Matrix(short Length, short Height, short Red,short Green, short Blue)              //构造函数{vector<Reg_point> tmp;                //临时容器for (short i = 0; i < height; i++)for (short j = 0; j < length; j++){tmp.push_back(Reg_point{ Red,Green,Blue });}matrix.push_back(tmp);                //临时容器内容添加到矩阵对象}
};
//生成黑色矩阵1000x500像素
int main(void) {Matrix matrix(1000, 500, 0, 0, 0);         //一步生成矩阵对象
}

 和第一种写法比起来,清爽了许多

一个小问题

        如果面向对象理解的比较深,发现一个问题:属性中除了vector<vector<Reg_point>> matrix之外,都可以不要.因为matrix本身就已经包含了矩阵需要的所有元素,其余属性都可以看作冗余属性.

        笔者认为这是面向对象的特性,多一点容易理解,不在乎每个对象多10个字节.应用级别的程序毕竟不是机器指令级别或者系统级别的代码,每一个字节或者每条指令周期都想"抠"出来以提高性能(争取把使用存储减少到每个字节,指令周期能少一个就是一个).写代码首先是准确,然后命名优雅,但用不着太拘谨了,开源的精神也在于此.

        假设用C语言来定义矩阵类,他是这样写的

//C语言的矩阵类描述
struct Matrix{short length;short height;Reg_point ** rp;
}//算法略

        看起来更加清爽.

        C++牺牲了一些性能,方便构建大型程序. 

============================注意==========================================

本贴是尝试用C++描述数据类,至于应用级别的绘图软件,或许为了追求更好的性能用C语言甚至汇编语言编写的也不一定,特此声明

============================注意==========================================

小结

        矩阵类是数据类中最简单的一类,但他是计算机中用得最多的图形.不管是元素,场景(背景),或者硬件,都需要用到矩阵.在桌面端更是屡见不鲜,到处都是方块.

        题外话:底层对于理解数据有所帮助

预告

        接下来有"非规则图形"的定义

鸣谢

        笔者另一篇帖子数据在硬件和软件中的表示-CSDN博客里有求下载链接,如果您感觉有所帮助,请帮忙点击,下载,提高等级

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/71722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开发者社区测试报告(功能测试+性能测试)

功能测试 测试相关用例 开发者社区功能背景 在当今数字化时代&#xff0c;编程已经成为一项核心技能&#xff0c;越来越多的人开始学习编程&#xff0c;以适应快速变化的科技 环境。基于这一需求&#xff0c;我设计开发了一个类似博客的论坛系统&#xff0c;专注于方便程序员…

EasyRTC嵌入式音视频通话SDK:基于ICE与STUN/TURN的实时音视频通信解决方案

在当今数字化时代&#xff0c;实时音视频通信技术已成为人们生活和工作中不可或缺的一部分。无论是家庭中的远程看护、办公场景中的远程协作&#xff0c;还是工业领域的远程巡检和智能设备的互联互通&#xff0c;高效、稳定的通信技术都是实现这些功能的核心。 EasyRTC嵌入式音…

【OneAPI】网页截图API-V2

API简介 生成指定URL的网页截图或缩略图。 旧版本请参考&#xff1a;网页截图 V2版本新增全屏截图、带壳截图等功能&#xff0c;并修复了一些已知问题。 全屏截图&#xff1a; 支持全屏截图&#xff0c;通过设置fullscreentrue来支持全屏截图。全屏模式下&#xff0c;系统…

简单的 Python 示例,用于生成电影解说视频的第一人称独白解说文案

以下是一个简单的 Python 示例&#xff0c;用于生成电影解说视频的第一人称独白解说文案。这个示例使用了 OpenAI 的 GPT 模型&#xff0c;因为它在自然语言生成方面表现出色。 实现思路 安装必要的库&#xff1a;使用 openai 库与 OpenAI API 进行交互。设置 API 密钥&#…

记录小白使用 Cursor 开发第一个微信小程序(一):注册账号及下载工具(250308)

文章目录 记录小白使用 Cursor 开发第一个微信小程序&#xff08;一&#xff09;&#xff1a;注册账号及下载工具&#xff08;250308&#xff09;一、微信小程序注册摘要1.1 注册流程要点 二、小程序发布流程三、下载工具 记录小白使用 Cursor 开发第一个微信小程序&#xff08…

六轴传感器ICM-20608

ICM-20608-G是一个6轴传感器芯片&#xff0c;由3轴陀螺仪和3轴加速度计组成。陀螺仪可编程的满量程有&#xff1a;250&#xff0c;500&#xff0c;1000和2000度/秒。加速度计可编程的满量程有&#xff1a;2g&#xff0c;4g&#xff0c;8g和16g。学习Linux之SPI之前&#xff0c;…

python可應用在金融分析的那一個方面,如何部署在linux server上面。

Python 在金融分析中應用廣泛&#xff0c;以下是幾個主要方面&#xff1a; ### 1. **數據處理與分析** - 使用 **Pandas** 和 **NumPy** 等庫來處理和分析大規模數據集&#xff0c;進行清理、轉換和統計運算。 - 舉例&#xff1a;處理歷史市場數據&#xff0c;分析價格趨…

Git与GitHub:理解两者差异及其关系

目录 Git与GitHub&#xff1a;理解两者差异及其关系Git&#xff1a;分布式版本控制系统概述主要特点 GitHub&#xff1a;基于Web的托管服务概述主要特点 Git和GitHub如何互补关系现代开发工作流 结论 Git与GitHub&#xff1a;理解两者差异及其关系 Git&#xff1a;分布式版本控…

STM32全系大阅兵(1)

本文内容参考: STM32家族系列的区别_stm32各个系列区别-CSDN博客 STM32--STM32 微控制器详解-CSDN博客

clickhouse删除一条数据

在当今数据驱动的世界中&#xff0c;ClickHouse作为一种高性能的列式数据库管理系统&#xff0c;广泛应用于需要快速分析大量数据的场景。也许对于初学者来说&#xff0c;掌握如何有效地管理数据&#xff0c;包括添加、更新和删除数据&#xff0c;是使用ClickHouse进行数据分析…

std::vector的模拟实现

目录 构造函数 无参构造 用n个val来初始化的拷贝构造 拷贝构造 用迭代器初始化 析构函数 reserve resize pushback pop_back 迭代器及解引用 迭代器的实现 解引用[ ] insert erase 赋值拷贝 补充 vector底层也是顺序表&#xff0c;但是vector可以储存不同的类…

蓝桥杯刷题周计划(第二周)

目录 前言题目一题目代码题解分析 题目二题目代码题解分析 题目三题目代码题解分析 题目四题目代码题解分析 题目五题目代码题解分析 题目六题目代码题解分析 题目七题目代码题解分析 题目八题目题解分析 题目九题目代码题解分析 题目十题目代码题解分析 题目十一题目代码题解分…

clion+arm-cm3+MSYS-mingw +jlink配置用于嵌入式开发

0.前言 正文可以跳过这段 初识clion&#xff0c;应该是2015年首次发布的时候&#xff0c; 那会还是大三&#xff0c;被一则推介广告吸引到&#xff0c;当时还在用vs studio&#xff0c;但是就喜欢鼓捣新工具&#xff0c;然后下载安装试用了clion&#xff0c;但是当时对cmake规…

蓝桥杯备考:离散化详解

首先&#xff0c;为什么要有离散化呢&#xff1f; 比如这道题&#xff0c;我们应该开一个差分数组&#xff0c;但是a&#xff0c;b之间的间隔可是太大了&#xff0c;难道我们要开一个2的三十二次方大小的数组吗&#xff1f;我们也是开不了这么大的数组的 我们就需要把这些数离…

初学者快速入门Python爬虫 (无废话版)

全篇大概 5000 字(含代码)&#xff0c;建议阅读时间 40min 一、Python爬虫简介 1.1 什么是网络爬虫&#xff1f; 定义&#xff1a; 网络爬虫&#xff08;Web Crawler&#xff09;是自动浏览互联网并采集数据的程序&#xff0c;就像电子蜘蛛在网页间"爬行"。 分类&…

Day05 实例:正向反向连接内外网环境防火墙出入站

一、正反向连接 0、先将防火墙关闭 Linux&#xff1a; sudo systemctl stop firewalld Windows&#xff1a;netsh advfirewall set allprofiles state off 1、正向连接 1.1 Linux连接Windows 00x1 开启两台服务器 并且给Windows拖入nc.exe 00x2 Windows绑定自己5566端…

电力系统中各参数的详细解释【智能电表】

一、核心电力参数 电压 (Voltage) 单位&#xff1a;伏特&#xff08;V&#xff09; 含义&#xff1a;电势差&#xff0c;推动电流流动的动力 类型&#xff1a;线电压&#xff08;三相系统&#xff09;、相电压&#xff0c;如220V&#xff08;家用&#xff09;或380V&#xff…

【仿muduo库one thread one loop式并发服务器实现】

文章目录 一、项目介绍1-1、项目总体简介1-2、项目开发环境1-3、项目核心技术1-4、项目开发流程1-5、项目如何使用 二、框架设计2-1、功能模块划分2-1-1、SERVER模块2-1-2、协议模块 2-2、项目蓝图2-2-1、整体图2-2-2、模块关系图2-2-2-1、Connection 模块关系图2-2-2-2、Accep…

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_cycle_modules

声明在 src/core/ngx_module.h ngx_int_t ngx_cycle_modules(ngx_cycle_t *cycle);实现在 src/core/ngx_module.c ngx_int_t ngx_cycle_modules(ngx_cycle_t *cycle) {/** create a list of modules to be used for this cycle,* copy static modules to it*/cycle->modul…

Vue3实战学习(IDEA中打开、启动与搭建Vue3工程极简脚手架教程(2025超详细教程)、Windows系统命令行启动Vue3工程)(2)

目录 一、命令行中重新启动已搭建好的Vue3工程。(快速上手) &#xff08;0&#xff09;Windows环境下使用命令行从零到一手动搭建Vue3工程教程。 &#xff08;1&#xff09;首先找到已建Vue3工程的目录。 &#xff08;2&#xff09;无需再下载依赖包&#xff0c;直接执行npm ru…