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