數據類設計_圖片類設計之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.pswp.cn/web/71722.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71722.shtml
英文地址,請注明出處:http://en.pswp.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…