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

数据类设计_图片类设计之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博客里有求下载链接,如果您感觉有所帮助,请帮忙点击,下载,提高等级

相关文章:

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

前言 学的东西多了,要想办法用出来.C和C是偏向底层的语言,直接与数据打交道.尝试做一些和数据方面相关的内容 引入 图形在底层是怎么表示的,用C来表示 认识图片 图片是个风景,动物,还是其他内容,人是可以看出来的.那么计算机是怎么看懂的呢?在有自主意识的人工智能被设计出来…...

C++:入门详解(关于C与C++基本差别)

目录 一.C的第一个程序 二.命名空间&#xff08;namespace&#xff09; 1.命名空间的定义与使用&#xff1a; &#xff08;1&#xff09;命名空间里可以定义变量&#xff0c;函数&#xff0c;结构体等多种类型 &#xff08;2&#xff09;命名空间调用&#xff08;&#xf…...

GC安全点导致停顿时间过长的案例

GC安全点导致停顿时间过长的案例 前言安全点的概念案例分析解决方法如有需要收藏的看官&#xff0c;顺便也用发财的小手点点赞哈&#xff0c;如有错漏&#xff0c;也欢迎各位在评论区评论&#xff01; 前言 前段时间在使用G1垃圾收集时&#xff0c;因服务读写压力过大&#xf…...

linux下 jq 截取json文件信息

背景&#xff1a;通过‘登录名‘ 获取该对象的其他个人信息如名字。 环境准备&#xff1a;麒麟操作系统V10 jq安装包 jq安装包获取方式&#xff1a;yum install jq 或 使用附件中的rpm 或 git自行下载 https://github.com/stedolan/jq/releases/download/ 实现过程介绍&am…...

git lfs使用方法指南【在github保存100M以上大文件】

为了在 GitHub 仓库中存储超过 100MB 的大文件并避免推送失败&#xff0c;使用 Git LFS&#xff08;Large File Storage&#xff09; 是最佳解决方案。以下是详细步骤&#xff1a; 一、安装 Git LFS 下载并安装 Git LFS&#xff1a; 访问 Git LFS 官网 下载对应系统的安装包。或…...

躲藏博弈:概率论与博弈论视角下的最优策略选择

躲藏博弈&#xff1a;概率论与博弈论视角下的最优策略选择 1. 问题引入 想象这样一个场景&#xff1a;你在厕所里藏了一部手机&#xff0c;一周过去了&#xff0c;它仍未被发现。现在你面临一个决策&#xff1a; 选项A&#xff1a;继续将手机留在原处选项B&#xff1a;将手机…...

类加载器加载过程

今天我们就来深入了解一下Java中的类加载器以及它的加载过程。 一、什么是类加载器&#xff1f; 在Java中&#xff0c;类加载器&#xff08;Class Loader&#xff09;是一个非常重要的概念。它负责将类的字节码文件&#xff08;.class文件&#xff09;加载到Java虚拟机&#x…...

Python中dump、dumps和load、loads的异同

Python中dump、dumps和load、loads的异同 Python中dump、dumps和load、loads的异同 1. json.dump()和json.dumps() 1.1 json.dump()1.1 json.dumps() 2. json.load()和json.loads() 2.1 json.load()2.2. json.loads() 3. 总结对比4. 区分5. 完整代码 1. json.dump()和json.dum…...

Spring Boot整合ArangoDB教程

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、环境准备 JDK 17Maven 3.8Spring Boot 3.2ArangoDB 3.11&#xff08;本地安装或Docker运行&#xff09; Docker启动ArangoDB docker run -d --name ar…...

vue3框架的响应式依赖追踪机制

当存在一个响应式变量于视图中发生改变时会更新当前组件的所以视图显示&#xff0c;但是没有视图中不写这个响应式变量就就算修改该变量也不会修改视图&#xff0c;这是为什么&#xff1f;我们能否可以理解宽泛的理解为vue组件的更新就是视图的更新&#xff0c;单当视图中不存在…...

软件工程:软件需求之需求分析方法

目录 前言 需求分析方法 工具和方法 具体分析方法 对运行环境的影响 ​编辑 前言 本文重点介绍开展软件需求分析的方法。 需求分析方法 工具和方法 软件需求可以维护在ALM系统中&#xff0c;譬如&#xff1a;doors&#xff0c;codeBeamer等&#xff0c;JIRA适合互联网行…...

【网络编程】WSAAsyncSelect 模型

十、基于I/O模型的网络开发 接着上次的博客继续分享&#xff1a;select模型 10.8 异步选择模型WSAAsyncSelect 10.8.1 基本概念 WSAAsyncSelect模型是Windows socket的一个异步I/O 模型&#xff0c;利用这个模型&#xff0c;应用程序 可在一个套接字上接收以Windows 消息为基…...

视觉-语言模型-出发点CLIP--(精读论文)

阅读建议&#xff1a;配合这个源码分析阅读效果更加 研究背景和目的 介绍当前计算机视觉系统依赖固定类别标签训练的局限性&#xff0c;以及自然语言监督作为一种有潜力替代方式的研究现状。强调论文旨在探索从自然语言监督中学习可迁移视觉模型&#xff0c;实现零样本学习&a…...

docker本地部署RagFlow

1.安装 克隆仓库 git clone https://github.com/infiniflow/ragflow.git构建预建的Docker映像并启动服务器 cd ragflow/docker chmod x ./entrypoint.sh docker compose -f docker-compose.yml -p ragflow up -d修改ragflow/docker/.env文件 #RAGFLOW_IMAGEinfiniflow/ragfl…...

机器学习数学基础:44.多元线性回归

一、文字内容详解 1. 多重共线性的判断——皮尔逊相关系数 皮尔逊相关系数用于衡量自变量间的线性相关程度&#xff0c;取值范围为 ([-1, 1])&#xff1a; 绝对值越接近 (1)&#xff0c;变量间线性相关性越强&#xff1b;越接近 (0)&#xff0c;相关性越弱。在多重共线性判断…...

GetWindowLongPtr函数分析

第一部分&#xff1a; #ifdef UNICODE FUNCLOG2(LOG_GENERAL, LONG_PTR, APIENTRY, GetWindowLongPtrW, HWND, hwnd, int, nIndex) #else FUNCLOG2(LOG_GENERAL, LONG_PTR, APIENTRY, GetWindowLongPtrA, HWND, hwnd, int, nIndex) #endif // UNICODE LONG_PTR APIENTRY GetWin…...

大语言模型(LLM)和嵌入模型的统一调用接口

ChatModelFactory、EmbeddingModelFactory 讲解代码&#xff1a;import os from dotenv import load_dotenv, find_dotenv_ load_dotenv(find_dotenv())from langchain_openai import ChatOpenAI, OpenAIEmbeddings, AzureChatOpenAI, AzureOpenAIEmbeddingsclass ChatModelF…...

大白话html语义化标签优势与应用场景

大白话html语义化标签优势与应用场景 大白话解释 语义化标签就是那些名字能让人一看就大概知道它是用来做什么的标签。以前我们经常用<div>来做各种布局&#xff0c;但是<div>本身没有什么实际的含义&#xff0c;就像一个没有名字的盒子。而语义化标签就像是有名…...

Scala:在哪里写类的属性?类的属性必须私有吗?类的必须初始化吗?

哪里写类的属性 直接在类体中定义属性 class Circle {private var _radius: Double 0.0def radius: Double _radiusdef radius_(newRadius: Double): Unit {_radius newRadius}def area: Double scala.math.Pi * _radius * _radius } 可以在类体内部直接定义属性。例如&am…...

Android源码编译命令详解

一、引言 先看下面几条指令&#xff0c;相信编译过Android源码的人都再熟悉不过的。 source setenv.sh lunch make -j8记得最初刚接触Android时&#xff0c;同事告诉我用上面的指令就可以编译Android源码&#xff0c;指令虽短但过几天就记不全或者忘记顺序&#xff0c;每次编…...

任务11:路由器配置与静态路由配置

目录 一、概念 二、路由器配置 三、配置静态路由CSDN 原创主页&#xff1a;不羁https://blog.csdn.net/2303_76492156?typeblog 一、概念 1、路由器的作用&#xff1a;通过路由表进行数据的转发。 2、交换机的作用&#xff1a;通过学习和识别 MAC 地址&#xff0c;依据 M…...

Unity之如何实现哔哩哔哩直播弹幕游戏

前言 什么是直播间互动? 当我们使用哔哩哔哩进行直播或者观看视频时,我们可以通过接入哔哩哔哩提供的 直播&互动玩法SDK,让直播和视频可以与Unity3D游戏客户端或者游戏服务器进行互动。 环境要求 Unity 2020.x或更高版本 依赖库:Newtonsoft Json Unity Package 在P…...

Python实例:PyMuPDF实现PDF翻译,英文翻译为中文,并按段落创建中文PDF

基于PyMuPDF与百度翻译的PDF翻译处理系统开发:中文乱码解决方案与自动化排版实践 一 、功能预览:将英文翻译为中文后创建的PDF 二、完整代码 from reportlab.lib.pagesizes import letter from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle...

LeeCode题库第四十六题

46.全排列 项目场景&#xff1a; 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&am…...

LangChain4j开发RAG入门示例

本文将详细介绍如何基于Java语言&#xff0c;使用Langchain4j开源框架、Milvus向量数据、阿里Qwen大模型&#xff0c;开发一个RAG入门级简单示例。本示例虽然简单&#xff0c;但涉及到多个知识点&#xff0c;包括&#xff1a;Milvus初始化、Embedding模型、文档切片、Springboo…...

快速从C过度C++(一):namespace,C++的输入和输出,缺省参数,函数重载

&#x1f4dd;前言&#xff1a; 本文章适合有一定C语言编程基础的读者浏览&#xff0c;主要介绍从C语言到C过度&#xff0c;我们首先要掌握的一些基础知识&#xff0c;以便于我们快速进入C的学习&#xff0c;为后面的学习打下基础。 这篇文章的主要内容有&#xff1a; 1&#x…...

课程《Deep Learning Specialization》

在coursera上&#xff0c;Deep Learning Specialization 课程内容如下图所示&#xff1a;...

微服务与消息队列RabbitMQ

简介 同步模式 异步模式 内容 解决方案RabbitMQ 同步调用的优缺点 同步调用的优势是什么&#xff1f; 时效性强&#xff0c;等待到结果后才返回。 同步调用的问题是什么&#xff1f; 拓展性差性能下降级联失败问题...

苹果 M3 Ultra 芯片深度解析:AI 时代的性能革命

2025 年 3 月 5 日&#xff0c;苹果正式发布了其史上最强 PC 芯片 ——M3 Ultra。这款基于 UltraFusion 封装技术的旗舰级 SoC&#xff0c;不仅延续了苹果芯片在能效比上的传统优势&#xff0c;更通过架构创新与硬件升级&#xff0c;将 AI 计算能力推向了新高度。本文将从性能突…...

通义千问:Qwen2.5-0.5B模型架构解释

通义千问:Qwen2.5-0.5B模型架构解释 1. 模型权重文件 .mdl、.msc:存储模型核心参数,是模型训练后学习到的知识载体,包含神经网络各层权重,加载后模型才能执行推理、生成等任务。 .mdl文件:通常是模型的核心权重数据文件,存储神经网络各层的权重参数、张量等关键数据,是…...