数据类设计_图片类设计之4_规则类图形混合算法(前端架构)

news2025/3/13 22:03:16

前言

        学的东西多了,要想办法用出来.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博客里有求下载链接,如果您感觉有所帮助,请帮忙点击,下载,提高等级

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

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

相关文章

从零使用docker并安装部署mysql8.3.0容器

在开始使用docker到完成mysql的安装部署&#xff0c;中间有很多的坑等着 安装docker并配置 sudo yum install docker-ce 启动docker并设置开机启动项 sudo systemctl start docker sudo systemctl enable docker查看docker是否启动 sudo systemctl status docker 或者直接…

cpu 多级缓存L1、L2、L3 与主存关系

现代 CPU 的多级缓存&#xff08;L1、L2、L3&#xff09;和主存&#xff08;DRAM&#xff09;构成了一个层次化的内存系统&#xff0c;旨在通过减少内存访问延迟和提高数据访问速度来优化计算性能。以下是对多级缓存和主存的详细解析&#xff1a; 1. 缓存层次结构 现代 CPU 通…

基于Python+SQLite实现校园信息化统计平台

一、项目基本情况 概述 本项目以清华大学为预期用户&#xff0c;作为校内信息化统计平台进行服务&#xff0c;建立网页端和移动端校内信息化统计平台&#xff0c;基于Project_1的需求实现。 本项目能够满足校内学生团体的几类统计需求&#xff0c;如活动报名、实验室招募、多…

[多线程]基于阻塞队列(Blocking Queue)的生产消费者模型的实现

标题&#xff1a;[多线程]基于阻塞队列(Blocking Queue)的生产消费者模型的实现 水墨不写bug 文章目录 一、生产者消费者模型特点&#xff1a;二、实现2.1详细解释1. 成员变量2. 构造函数3. Isfull 和 Isempty4. Push 函数5. Pop 函数6. 析构函数7. GetSize 函数 三、总结与多线…

vue组件库el-menu导航菜单设置index,地址不会变更的问题

请先确认 1.路由已配置好 route-index.js如下&#xff0c; 2.view-ProHome.vue中已预留路由展示位 3.导航菜单复制组件库&#xff0c;并做修改 其中index与路由配置的地址一致 运行后发现点击菜单&#xff0c;url地址还是不变&#xff0c;查看组件库 Element - The worlds …

MySQL 优化方案

一、MySQL 查询过程 MySQL 查询过程是指从客户端发送 SQL 语句到 MySQL 服务器&#xff0c;再到服务器返回结果集的整个过程。这个过程涉及多个组件的协作&#xff0c;包括连接管理、查询解析、优化、执行和结果返回等。 1.1 查询过程的关键组件 连接管理器&#xff1a;管理…

智能对话小程序功能优化day1-登录鉴权

目录 1.数据库表构建。 2.完善登录相关的实例对象。 3.登录相关功能实现。 4.小程序效果。 最近尝试下trae加入claude3.7后的读图生成代码功能&#xff0c;可以看到简单的页面一次性生成确实准确率高了不少&#xff0c;想起来之前笔记中开发的智能问答小程序功能还是有些简…

MinIO的预签名直传机制

我们传统使用MinIo做OSS对象存储的应用方式往往都是在后端配置与MinIO的连接和文件上传下载的相关接口&#xff0c;然后我们在前端调用这些接口完成文件的上传下载机制&#xff0c;但是&#xff0c;当并发量过大&#xff0c;频繁访问会对后端的并发往往会对服务器造成极大的压力…

Qt开源控件库(qt-material-widgets)的编译及使用

项目简介 qt-material-widgets是一个基于 Qt 小部件的 Material Design 规范实现。 项目地址 项目地址&#xff1a;qt-material-widgets 本地构建环境 Win11 家庭中文版 VS2019 Qt5.15.2 (MSVC2019) 本地构建流程 克隆后的目录结构如图&#xff1a; 直接使用Qt Crea…

用python批量生成文件夹

问题描述 当批量生成文件夹时&#xff0c;手动右键创建文件夹是一个繁琐的过程&#xff0c;尤其是文件夹的命名过程。假设从3月10日到3月19日&#xff0c;每天要为某个日常工作创建一个名为2025031x的文件夹&#xff0c;手动创建文件夹并命名费时费力。 百度给出了以下四种方法…

【MySQL】基本操作 —— DDL

目录 DDLDDL 常用操作对数据库的常用操作查看所有数据库创建数据库切换、显示当前数据库删除数据库修改数据库编码 对表的常用操作创建表数据类型数值类型日期和时间类型字符串类型 查看当前数据库所有表查看指定表的创建语句查看指定表结构删除表 对表结构的常用操作给表添加字…

游戏引擎学习第152天

仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾昨天的内容 这个节目展示了我们如何从零开始制作一款完整的游戏。我们不使用任何游戏引擎或库&#xff0c;而是从头开始创建一款游戏&#xff0c;整个开发过程都会呈现给大家。你将能够看到每一行代码的编写&#xff0c;了解…

考研数学非数竞赛复习之Stolz定理求解数列极限

在非数类大学生数学竞赛中&#xff0c;Stolz定理作为一种强大的工具&#xff0c;经常被用来解决和式数列极限的问题&#xff0c;也被誉为离散版的’洛必达’方法&#xff0c;它提供了一种简洁而有效的方法&#xff0c;使得原本复杂繁琐的极限计算过程变得直观明了。本文&#x…

故障诊断——neo4j入门

文章目录 neo4jQuickStartDemo neo4j QuickStart 详情可见博客&#xff1a;https://www.cnblogs.com/nhdlb/p/18703804&#xff0c;使用docker拉取最近的一个版本进行创建 docker run -it -d -p 7474:7474 -p 7687:7687 \ -v /disk5/neo4j_docker/data:/data \ -v /disk5/ne…

【JavaWeb】快速入门——HTMLCSS

文章目录 一、 HTML简介1、HTML概念2、HTML文件结构3、可视化网页结构 二、 HTML标签语法1、标题标签2、段落标签3、超链接4、换行5、无序列表6、路径7、图片8、块1 盒子模型2 布局标签 三、 使用HTML表格展示数据1、定义表格2、合并单元格横向合并纵向合并 四、 使用HTML表单收…

若依框架-给sys_user表添加新字段并获取当前登录用户的该字段值

目录 添加字段 修改SysUser类 修改SysUserMapper.xml 修改user.js 前端获取字段值 添加字段 若依框架的sys_user表是没有age字段的&#xff0c;但由于业务需求&#xff0c;我需要新添加一个age字段&#xff1a; 修改SysUser类 添加age字段后&#xff0c;要在SysUser类 …

前端监测窗口尺寸和元素尺寸变化的方法

前端监测窗口尺寸变化和元素尺寸变化的方法 window.resize 简介 window.resize事件是浏览器提供的一种事件&#xff0c;用于监听窗口大小的改变。这意味着当用户调整浏览器窗口大小时&#xff0c;相关的JavaScript代码将被触发执行。这为开发者提供了一种机制&#xff0c;可…

ubuntu 部署deepseek

更新 apt update 升级 apt upgrade 格式化硬盘 mkfs.ext4 /dev/sdb 安装nginx 查看端口 一、安装Ollama Ollama是一个开源的大型语言模型&#xff08;LLM&#xff09;推理服务器&#xff0c;为用户提供了灵活、安全和高性能的语言模型推理解决方案。 ollama/docs/linux.m…

MySQL库和表的操作详解:从创建库到表的管理全面指南

目录 一、MySQL库的操作详解 〇、登录MySQL 一、数据库的创建与字符集设置 1. 创建数据库的语法 2. 创建数据库示例 查看创建出来的文件: bash下查看MySQL创建的文件 二、字符集与校验规则 1. 查看系统默认设置 2. 查看支持的字符集与校验规则 3. 校验规则对查询的影响…

PyTorch 系列教程:使用CNN实现图像分类

图像分类是计算机视觉领域的一项基本任务&#xff0c;也是深度学习技术的一个常见应用。近年来&#xff0c;卷积神经网络&#xff08;cnn&#xff09;和PyTorch库的结合由于其易用性和鲁棒性已经成为执行图像分类的流行选择。 理解卷积神经网络&#xff08;cnn&#xff09; 卷…