数据类设计_图片类设计之4_规则类图形混合算法(前端架构)
前言
学的东西多了,要想办法用出来.C和C++是偏向底层的语言,直接与数据打交道.尝试做一些和数据方面相关的内容
引入
接续上一篇,讨论图片类型设计出来后在场景中如何表达,以及图片的混合算法.前面的内容属于铺垫和基础,这篇内容和实际联系起来了.
背景图和前景图
这里笔者想先引入两个概念:背景图和前景图.
实际表达的图片中,都是以图片混合而存在的,一片色的图几乎没有存在的空间,例如在当前页面截取一张图:
![]()
他外面是个矩阵图,里面有一些字符,还有一个跑道图.此时矩阵图被称作背景图,字符和跑道图是前景图.
在跑道图中,跑道图是背景图,"去查看"这三个字是前景图.
图片的混合
前面的图片类设计出来后,只是说明了图片由一堆点组成,还没有实际显示(当然这里的显示也不是在屏幕上显示,还需要调用虚拟内存写到显卡的寄存器中才行,本贴暂不讨论).
思考:图片作为一个对象或者散点集合,调取后出现在新空间中,最重要的是什么?答案是:位置
而怎样才方便把位置表达出来?答案是:矩阵类对象Matrix作背景图.
示意图:

前面提到过每张图片都有着一个隐藏属性:基点.他其实表示了两个属性:在原来坐标系中x坐标原点和y坐标原点.所以一张图可以被看作:以矩阵类对象为背景图,混合跑道图,生成图a;再以图a(仍然是矩阵类对象)混合"发布博客"这四个字符图.即:图片生成=两次混合
混合算法--规则型图形
借助基点,一个矩阵类对象作辅助,写出对应代码.
形式选择:用全局函数还是类方法来写?如果是Java,纯面向对象的语言,无疑用工具类方法来写.C++可在两者中选择.笔者不想用类方法,因为他能表达更多东西(比如作动画时需要覆盖原有图片),这里就用全局函数来表达了.
注意:每种类型的图,混合算法不一样.以上述图片为例,写出圆角矩阵类和矩阵图混合的代码如下:
//混合圆角矩阵类对象
Matrix& mix_fillet_matrix(short x_ref,short y_ref,Matrix & mx,Fillet_Matrix& fm)
{//得到指向前景圆角矩阵的迭代器vector<vector<Reg_Point>>::iterator itfm=fm.fillet_matrix.begin(); vector<vector<Reg_Point>>::iterator itfm_end=fm.fillet_matrix.end(); //得到圆角矩阵总行数 //得到指向背景矩阵的迭代器(指针)//标记下一行是开始写的,不对,用的是C语言中的方法,即指向二维数组的指针化成指向一维数组的指针//vector<vector<Reg_Point>>::iterator itmx=mx.matrix.begin()+x_ref*mx.height+y_ref; //x_ref是圆角矩阵基点,传入背景矩阵时的坐标,因此指向背景矩阵的迭代器,应指向偏移后的那一行vector<vector<Reg_Point>>::iterator itmx=mx.matrix.begin()+x_ref;for(int n=0;itfm<itfm+fm.radius;itfm++,n++) //圆角矩阵前r行//背景矩阵每列指针生成,背景矩阵列指针,需加上偏移量vector<Reg_Point>::iterator itmxs=(*itmx).begin()+y_ref; for(itfms=(*itfm).begin();itfms!=(*itfm).end();itfms++){//背景矩阵指针偏移,第一次前进n个点,以后每行减少1个itmxs=itmxs+radius-n; //点信息写入(*itmxs).red=(*itfms).red; (*itmxs).green=(*itfms).green; (*itmxs).blue=(*itfms).blue; itmxs++; }itmx++; //背景矩阵向下偏移一行}for(itfm=itfm+fm.radius;itfm<itfm_end-radius;itfm++) //圆角矩阵中间也是矩阵 vector<Reg_Point>::iterator itmxs=(*itmx).begin()+y_ref; for(itfms=(*itfm).begin();itfms!=(*itfm).end();itfms++){(*itmxs).red=(*itfms).red; (*itmxs).green=(*itfms).green; (*itmxs).blue=(*itfms).blue; itmxs++; }itmx++; //背景矩阵向下偏移一行}for(int n=0,itfm=itfm_end-radius;itfm!=itfm_end;itfm++,n++) //圆角矩阵后r行vector<Reg_Point>::iterator itmxs=(*itmx).begin()+y_ref; for(itfms=(*itfm).begin();itfms!=(*itfm).end();itfms++){//背景矩阵指针偏移,第一次进1个点,最后进r个点itmxs=itmxs+n+1;(*itmxs).red=(*itfms).red; (*itmxs).green=(*itfms).green; (*itmxs).blue=(*itfms).blue; itmxs++; }itmx++; //背景矩阵向下偏移一行}return mx;
}
代码说明:
1.x_ref和y_ref是圆角矩阵写入矩阵类对象时的坐标偏移,影响矩阵类对象迭代器的位置
1.看起来有些杂乱,大段重复代码一般不会出现在工程中,只是为了看得清楚一些.就算工程代码出现了较大量重复,只要没人说也没关系(笔者臆想)
2.因为没有实际验证,所以可能有点数错误,但问题应该不大,很好改正不用纠结
3.代码有一个看点:二维数组的遍历,如何从一个二维数组写入另一个二维数组:两边指针偏移,看起来时间复杂度高,但运算量不大.而且既然选择了二维数组无可避免.
4.注意:预设的圆角矩形尺寸小于矩阵类对象,也就是完全能被包括进去
预告
不规则图片的混合算法,混合类图形类型建立
鸣谢
笔者另一篇帖子数据在硬件和软件中的表示-CSDN博客里有求下载链接,如果您感觉有所帮助,请帮忙点击,下载,提高等级
相关文章:
数据类设计_图片类设计之4_规则类图形混合算法(前端架构)
前言 学的东西多了,要想办法用出来.C和C是偏向底层的语言,直接与数据打交道.尝试做一些和数据方面相关的内容 引入 接续上一篇,讨论图片类型设计出来后在场景中如何表达,以及图片的混合算法.前面的内容属于铺垫和基础,这篇内容和实际联系起来了. 背景图和前景图 这里笔者想先…...
从零使用docker并安装部署mysql8.3.0容器
在开始使用docker到完成mysql的安装部署,中间有很多的坑等着 安装docker并配置 sudo yum install docker-ce 启动docker并设置开机启动项 sudo systemctl start docker sudo systemctl enable docker查看docker是否启动 sudo systemctl status docker 或者直接…...
【从零开始学习计算机科学】编译原理(二)高级编程语言及其语法描述
【从零开始学习计算机科学】编译原理(二)高级编程语言及其语法描述 高级语言及其语法描述程序语言的定义形式语言与自动机文法的类型语言的类型自动机词法规则语法规则四则运算的语法描述布尔表达式语法描述赋值、分支、循环、程序块语句语法描述数组说明语句过程调用语句语义…...
STM32全系大阅兵(2)
接前一篇文章:STM32全系大阅兵(1) 本文内容参考: STM32家族系列的区别_stm32各个系列区别-CSDN博客 STM32--STM32 微控制器详解-CSDN博客...
cpu 多级缓存L1、L2、L3 与主存关系
现代 CPU 的多级缓存(L1、L2、L3)和主存(DRAM)构成了一个层次化的内存系统,旨在通过减少内存访问延迟和提高数据访问速度来优化计算性能。以下是对多级缓存和主存的详细解析: 1. 缓存层次结构 现代 CPU 通…...
MyBatis 的核心配置文件是干什么的? 它的结构是怎样的? 哪些是必须配置的,哪些是可选的?
MyBatis 的核心配置文件(通常命名为 mybatis-config.xml)是 MyBatis 应用程序的入口点,它定义了 MyBatis 的全局配置信息 。 核心配置文件的作用: 配置 MyBatis 的运行时行为: 通过 <settings> 标签设置全局参数ÿ…...
哪些业务场景更适合用MongoDB?何时比MySQL/PostgreSQL好用?
哪些业务场景更适合用MongoDB?何时比MySQL/PostgreSQL好用? 就像淘宝的个性化推荐需要灵活调整商品标签,MongoDB这种"变形金刚"式的数据库,在处理以下三类中国特色业务场景时更具优势: 一、动态数据就像&q…...
Java学习——day20
文章目录 1. 异常处理与优化1.1 在文件操作中使用 try-catch1.2 try-with-resources 语法1.3 使用 finally 块关闭资源1.4 代码健壮性与优化 2. 实践任务2.1 改进思路2.2 示例改进要点2.3 检查点 3. 总结3.1 改进后的完整代码: 4. 今日生词 今日学习目标:…...
基于Python+SQLite实现校园信息化统计平台
一、项目基本情况 概述 本项目以清华大学为预期用户,作为校内信息化统计平台进行服务,建立网页端和移动端校内信息化统计平台,基于Project_1的需求实现。 本项目能够满足校内学生团体的几类统计需求,如活动报名、实验室招募、多…...
[多线程]基于阻塞队列(Blocking Queue)的生产消费者模型的实现
标题:[多线程]基于阻塞队列(Blocking Queue)的生产消费者模型的实现 水墨不写bug 文章目录 一、生产者消费者模型特点:二、实现2.1详细解释1. 成员变量2. 构造函数3. Isfull 和 Isempty4. Push 函数5. Pop 函数6. 析构函数7. GetSize 函数 三、总结与多线…...
vue组件库el-menu导航菜单设置index,地址不会变更的问题
请先确认 1.路由已配置好 route-index.js如下, 2.view-ProHome.vue中已预留路由展示位 3.导航菜单复制组件库,并做修改 其中index与路由配置的地址一致 运行后发现点击菜单,url地址还是不变,查看组件库 Element - The worlds …...
JavaScript通过文件地址获取文件名称
在 JavaScript 中,可以通过文件链接地址提取文件名称。文件名称通常是链接中最后一个 / 之后的部分,可能还包含查询参数或哈希片段。以下是几种常见的提取文件名称的方法: 方法 1:使用 URL 对象和 pathname URL 对象可以解析链接…...
MySQL 优化方案
一、MySQL 查询过程 MySQL 查询过程是指从客户端发送 SQL 语句到 MySQL 服务器,再到服务器返回结果集的整个过程。这个过程涉及多个组件的协作,包括连接管理、查询解析、优化、执行和结果返回等。 1.1 查询过程的关键组件 连接管理器:管理…...
智能对话小程序功能优化day1-登录鉴权
目录 1.数据库表构建。 2.完善登录相关的实例对象。 3.登录相关功能实现。 4.小程序效果。 最近尝试下trae加入claude3.7后的读图生成代码功能,可以看到简单的页面一次性生成确实准确率高了不少,想起来之前笔记中开发的智能问答小程序功能还是有些简…...
【架构艺术】Go语言微服务monorepo的代码架构设计
近期因为项目架构升级原因,笔者着手调研一些go项目monorepo的代码架构设计,目标是长期把既有微服务项目重要的部分都转移到monorepo上面,让代码更容易维护,协作开发更加方便。虽然经验不多,但既然有了初步的调研&#…...
MinIO的预签名直传机制
我们传统使用MinIo做OSS对象存储的应用方式往往都是在后端配置与MinIO的连接和文件上传下载的相关接口,然后我们在前端调用这些接口完成文件的上传下载机制,但是,当并发量过大,频繁访问会对后端的并发往往会对服务器造成极大的压力…...
谈谈List,Set,Map的区别
List、Set 和 Map 是 Java 集合框架(Java Collections Framework)中的三种主要接口,它们各自有不同的特点和用途。以下是它们的区别和使用场景的详细解释: 1. List(列表) 1.1 特点 有序集合:Li…...
投资晚报 3.12
一、 晚间要闻 1、CME美联储观察:美联储3月降息25个基点的概率为3% 3 月 12 日,据 CME「美联储观察」数据,美联储 3 月降息 25 个基点的概率为 3%,维持不变的概率为 97%。 2、美国劳工统计局将于今晚20:30公布2月CPI数据 3 月…...
蓝桥 2109统计子矩阵
问题描述 给定一个NM 的矩阵 A, 请你统计有多少个子矩阵 (最小 11, 最大 NM) 满足子矩阵中所有数的和不超过给定的整数 K ? 输入格式 第一行包含三个整数 N,M 和 K. 之后 NN 行每行包含 M 个整数, 代表矩阵 A. 输出格式 一个整数代表答案。 样例输入 3 4 10 1 2 3 4 5…...
Qt开源控件库(qt-material-widgets)的编译及使用
项目简介 qt-material-widgets是一个基于 Qt 小部件的 Material Design 规范实现。 项目地址 项目地址:qt-material-widgets 本地构建环境 Win11 家庭中文版 VS2019 Qt5.15.2 (MSVC2019) 本地构建流程 克隆后的目录结构如图: 直接使用Qt Crea…...
vue的 props 与 $emit 以及 provide 与 inject 的 组件之间的传值对比
好的,下面是 props 与 $emit 以及 provide 与 inject 的对比: 1. props 与 $emit props:父组件通过 props 向子组件传递数据,子组件接收后不可修改。子组件只能读取 props 传递给它的数据。如果需要修改或更新父组件的状态&#…...
用python批量生成文件夹
问题描述 当批量生成文件夹时,手动右键创建文件夹是一个繁琐的过程,尤其是文件夹的命名过程。假设从3月10日到3月19日,每天要为某个日常工作创建一个名为2025031x的文件夹,手动创建文件夹并命名费时费力。 百度给出了以下四种方法…...
Json 转义符号处理(Mongo changeStream op log)
使用mongo-kafka组件订阅mongo的changeStream得到 一个带有很多转义符号的json字符串 "{\"_id\": {\"_data\": \"8267D0F733000001502B022C0100296E5A1004366730C56F7E41A790BDA4CF23259A4F46645F6964006467B91713A024A00E32CDF6800004\"},…...
懒加载(Lazy Loading):原理、实现与优化策略
懒加载(Lazy Loading) 是一种优化网页性能的技术,主要用于延迟加载非关键资源(如图片、视频、脚本等),直到它们真正需要被使用时才加载。懒加载可以显著减少页面初始加载时间,降低带宽消耗&…...
dns劫持是什么?常见的劫持类型有哪些?如何预防?
DNS劫持的定义 DNS劫持(Domain Name System Hijacking)是一种网络攻击手段,攻击者通过篡改域名解析的过程,将用户对某个域名的访问请求重定向到错误或恶意的IP地址。这种攻击可能导致用户访问到钓鱼网站、恶意广告页面࿰…...
蓝桥杯省赛真题C++B组2024-握手问题
一、题目 【问题描述】 小蓝组织了一场算法交流会议,总共有 50 人参加了本次会议。在会议上,大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手(且仅有一次)。但有 7 个人,这 7 人彼此之间没有进行握手(但这…...
【MySQL】基本操作 —— DDL
目录 DDLDDL 常用操作对数据库的常用操作查看所有数据库创建数据库切换、显示当前数据库删除数据库修改数据库编码 对表的常用操作创建表数据类型数值类型日期和时间类型字符串类型 查看当前数据库所有表查看指定表的创建语句查看指定表结构删除表 对表结构的常用操作给表添加字…...
XML语法
一、XML简介 (一)定义 XML(eXtensible Markup Language,可扩展标记语言)是一种简单的文本格式,用于标记电子文件使其具有结构性的标记语言。它与HTML(HyperText Markup Language,超…...
游戏引擎学习第152天
仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾昨天的内容 这个节目展示了我们如何从零开始制作一款完整的游戏。我们不使用任何游戏引擎或库,而是从头开始创建一款游戏,整个开发过程都会呈现给大家。你将能够看到每一行代码的编写,了解…...
考研数学非数竞赛复习之Stolz定理求解数列极限
在非数类大学生数学竞赛中,Stolz定理作为一种强大的工具,经常被用来解决和式数列极限的问题,也被誉为离散版的’洛必达’方法,它提供了一种简洁而有效的方法,使得原本复杂繁琐的极限计算过程变得直观明了。本文&#x…...
