前言
? ? ? ? 學的東西多了,要想辦法用出來.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博客里有求下載鏈接,如果您感覺有所幫助,請幫忙點擊,下載,提高等級