本發(fā)明涉及繪圖軟件領(lǐng)域,尤其涉及一種用圖元的鏡像參數(shù)、旋轉(zhuǎn)參數(shù)來描述圖元坐標(biāo)變換矩陣的方法。
背景技術(shù):
在繪圖軟件中,會對圖元進(jìn)行鏡像操作、旋轉(zhuǎn)操作。一般的繪圖軟件會用圖元的坐標(biāo)變換矩陣來對此進(jìn)行描述,因為坐標(biāo)變換矩陣非常方便,能夠處理各種縮放、鏡像、旋轉(zhuǎn)、平移、傾斜等情況而且也支持疊加操作。一般的繪圖軟件中不會用到傾斜。平移操作可以用圖元的坐標(biāo)來記錄,縮放可以直接用縮放系數(shù)進(jìn)行記錄。當(dāng)圖元的旋轉(zhuǎn)是直角旋轉(zhuǎn)(即90°,180°,270°,360°)時;唯一需要關(guān)注的就是鏡像、旋轉(zhuǎn)這兩個參數(shù)的順序問題。在實際繪圖時,繪圖人員永遠(yuǎn)是在屏幕的正前方觀看圖形,這時對圖元進(jìn)行操作:先鏡像后旋轉(zhuǎn)還是先旋轉(zhuǎn)后鏡像,這兩種操作順序得到的顯示效果是不一樣的。而圖元的坐標(biāo)變換矩陣記錄的是一個斷面,無法體現(xiàn)鏡像操作與旋轉(zhuǎn)操作的先后順序。如果我們無法確定這個順序,那么我們得到的鏡像參數(shù)、旋轉(zhuǎn)參數(shù)可能是錯誤的。因此,我們需要一種方法,既可以記錄圖元的鏡像參數(shù)、旋轉(zhuǎn)參數(shù),又能夠正確還原鏡像、旋轉(zhuǎn)后的圖元顯示狀態(tài)。
技術(shù)實現(xiàn)要素:
針對上述問題,本發(fā)明提供一種既可以記錄圖元的鏡像參數(shù)、旋轉(zhuǎn)參數(shù),又能夠正確還原鏡像、旋轉(zhuǎn)的操作順序的用圖元的鏡像、旋轉(zhuǎn)參數(shù)來描述圖元坐標(biāo)變換矩陣的方法。
為解決上述問題,本發(fā)明提供的技術(shù)方案為:用圖元的鏡像、旋轉(zhuǎn)參數(shù)來描述圖元坐標(biāo)變換矩陣的方法,包括如下步驟:用圖元的鏡像、旋轉(zhuǎn)參數(shù)來描述圖元坐標(biāo)變換矩陣的方法,包括如下步驟:
步驟一、在圖元內(nèi)部增設(shè)用來記錄圖元在x方向鏡像標(biāo)志的變量m_bMirrorX、用來記錄圖元在y方向鏡像標(biāo)志的變量m_bMirrorY、用來記錄圖元旋轉(zhuǎn)方向的變量m_direction以及用來記錄圖元是否處于克隆狀態(tài)的變量m_bClone并進(jìn)行圖元初始化;
設(shè)置并將m_bMirrorX設(shè)置為false;設(shè)置并將m_bMirrorY設(shè)置為false,設(shè)置并將m_direction設(shè)置為0,m_direction取值為為0、1、2、3分別代表原始位置、順時針旋轉(zhuǎn)90°、順時針旋轉(zhuǎn)180°、順時針旋轉(zhuǎn)270°;設(shè)置m_bClone并將其初始化為false;
步驟二、對圖元進(jìn)行鏡像操作,具體可分為如下步驟:
a、接口調(diào)用者傳入兩個bool型數(shù)值:x方向鏡像標(biāo)志bMx;y方向鏡像標(biāo)志bMy;這兩個數(shù)值分別表示是否要對指定圖元進(jìn)行x方向鏡像操作或y方向鏡像操作;定義用來記錄x、y方向的縮放系數(shù)的兩個變量sx=1,sy=1;定義存放坐標(biāo)變換矩陣的臨時變量:matrix;
b、判斷圖元是否處于克隆狀態(tài),是則執(zhí)行c,否則執(zhí)行d;
c、將bMx、bMy保存到圖元的變量中,并根據(jù)bMx、bMy的值修改x、y方向的縮放系數(shù)sx、sy;用新得到的坐標(biāo)變換矩陣覆蓋原有的圖元坐標(biāo)變換矩陣,鏡像操作結(jié)束;
d、首先根據(jù)圖元旋轉(zhuǎn)方向是否為順時針90°或順時針270°判斷是否需要交換bMx、bMy的值;再根據(jù)新的bMx、bMy的值修改m_bMirrorX、m_bMirrorY的值并重新計算圖元旋轉(zhuǎn)方向m_direction;然后根據(jù)接口調(diào)用者傳入的數(shù)值bMx、bMy,修改x、y方向的縮放系數(shù)sx、sy;用新得到的坐標(biāo)變換矩陣覆蓋原有的圖元坐標(biāo)變換矩陣,鏡像操作結(jié)束;
步驟三、對圖元進(jìn)行旋轉(zhuǎn)操作,具體可分為如下步驟:
a、接口傳入?yún)?shù):將要對圖元進(jìn)行旋轉(zhuǎn)操作的方向direction;定義用來記錄x、y方向的縮放系數(shù)的兩個臨時變量sx=1,sy=1;定義存放坐標(biāo)變換矩陣的臨時變量matrix;
b、根據(jù)旋轉(zhuǎn)操作的類型,疊加到m_direction上,得到新的旋轉(zhuǎn)方向值;判斷圖元是否處于克隆狀態(tài),是則執(zhí)行c,否則執(zhí)行d;
c、將direction轉(zhuǎn)換為旋轉(zhuǎn)角度并用新得到的坐標(biāo)變換矩陣覆蓋原有的圖元坐標(biāo)變換矩陣,旋轉(zhuǎn)操作結(jié)束;
d、根據(jù)bMx、bMy的值修改x、y方向的縮放系數(shù)sx、sy;并重新計算圖元旋轉(zhuǎn)方向,用新得到的坐標(biāo)變換矩陣覆蓋原有的圖元坐標(biāo)變換矩陣,旋轉(zhuǎn)操作結(jié)束。
將圖元的坐標(biāo)變換矩陣導(dǎo)出為圖元的鏡像標(biāo)志、旋轉(zhuǎn)角度時,導(dǎo)出的參數(shù)含義是圖元要先鏡像,后旋轉(zhuǎn);圖元的鏡像標(biāo)志可以不用處理直接導(dǎo)出,圖元的旋轉(zhuǎn)角度=m_direction*90。
從圖形文件中加載圖元時,從圖形文件中按順序依次讀?。簃_bMirrorX、m_bMirrorY、m_direction。
保存圖元時,將m_bMirrorX、m_bMirrorY、m_direction依次保存到圖形文件中。
通過本發(fā)明所描述的方式,用圖元在x方向鏡像標(biāo)志、圖元在y方向鏡像標(biāo)志、圖元旋轉(zhuǎn)方向這三個參數(shù)描述圖元的轉(zhuǎn)置矩陣時,按照固定的先鏡像后旋轉(zhuǎn)的方式進(jìn)行描述,并且每次鏡像或旋轉(zhuǎn)之后都重新計算這三個參數(shù),這樣就只需要三個參數(shù)就可以準(zhǔn)確還原圖元的真實狀態(tài),同其他廠家的圖形方便的進(jìn)行互操作。
附圖說明
圖1是本發(fā)明實施方式中圖元初始化的流程圖。
圖2是本發(fā)明實施方式中從圖形文件中加載單個圖元的流程圖。
圖3是本發(fā)明實施方式中保存單個圖元到文件的流程圖。
圖4是本發(fā)明實施方式中圖元鏡像操作功能接口的流程圖。
圖5是本發(fā)明實施方式中圖元旋轉(zhuǎn)操作功能接口的流程圖。
具體實施方式
用圖元的鏡像、旋轉(zhuǎn)參數(shù)來描述圖元坐標(biāo)變換矩陣的方法,包括如下步驟:步驟一、在圖元中增設(shè)變量并進(jìn)行圖元初始化,如圖1所示;
設(shè)置用來記錄圖元在x方向鏡像標(biāo)志的bool型變量m_mirrorX并將其設(shè)置為false;設(shè)置用來記錄圖元在y方向鏡像標(biāo)志的bool型變量m_mirrorY并將其設(shè)置為false,設(shè)置用來記錄圖元旋轉(zhuǎn)方向的整數(shù)型變量m_direction并將其設(shè)置為0,圖元旋轉(zhuǎn)方向取值為為0、1、2、3分別代表原始位置、順時針旋轉(zhuǎn)90°、順時針旋轉(zhuǎn)180°、順時針旋轉(zhuǎn)270°;設(shè)置用來記錄圖元是否處于克隆狀態(tài)的變量m_bClone并將其初始化為false;
步驟二、將對圖元在x方向鏡像操作標(biāo)志bMx、圖元在y方向鏡像操作標(biāo)志bMy作為參數(shù)調(diào)用圖元的鏡像操作接口;將圖元旋轉(zhuǎn)方向direction作為參數(shù)調(diào)用圖元的旋轉(zhuǎn)操作接口;
步驟三、對圖元進(jìn)行鏡像操作,具體可分為如下步驟,如圖4所示:
S1、圖元鏡像操作功能接口開始;
S2、接口調(diào)用者傳入兩個數(shù)值:x方向鏡像標(biāo)志:bMx;y方向鏡像標(biāo)志:bMy;用來表明鏡像操作的類型是x方向鏡像還是y方向鏡像;
S3、定義用來記錄x、y方向的縮放系數(shù)的兩個臨時浮點數(shù)變量sx=1,sy=1;定義存放坐標(biāo)變換矩陣的臨時變量:matrix;
S4、判斷圖元是否處于克隆狀態(tài),是則執(zhí)行S5,否則執(zhí)行S12;
S5、將接口調(diào)用者傳入的數(shù)值保存到圖元的變量中:
m_mirrorX=bMx,
m_mirrorY=bMy;
S6、判斷bMx是否為true,是則執(zhí)行S7,否則執(zhí)行S8;
S7、設(shè)置sx=-1;
S8、判斷bMy是否為true,是則執(zhí)行S9,否則執(zhí)行S10;
S9、設(shè)置sy=-1;
S10、matrix.scale(sx,sy),用matrix覆蓋圖元的坐標(biāo)變換矩陣;
轉(zhuǎn)S25;
S12、如果m_direction為1或3時,交換bMx、bMy的值;否則不需要交換;
S13、判斷bMx是否為true,是則執(zhí)行S13,否則執(zhí)行S14;
S14、m_mirrorX取反;
S15、如果m_direction為1或3則執(zhí)行S16,否則執(zhí)行S17;
S16、m_direction=(m_direction+2)%4;
S17、判斷bMy為true,是則執(zhí)行S18,否則執(zhí)行S19;
S18、m_mirrorY取反;
S19、如果m_direction為1或3則執(zhí)行S20,否則執(zhí)行S21;
S20、m_direction=(m_direction+2)%4;
S21、判斷bMx是否為true,是則執(zhí)行S23,否則執(zhí)行S24;
S22、設(shè)置sx=-1;
S23、判斷bMy是否為true,是則執(zhí)行S25,否則執(zhí)行S26;
S24、設(shè)置sy=-1;
S25、matrix.scale(sx,sy);
angle=(m_direction*90)%360;
matrix.rotate(angle)
用新得到的坐標(biāo)變換矩陣覆蓋原有的圖元的坐標(biāo)變換矩陣;
S26、圖元鏡像操作功能接口結(jié)束;
步驟四、對圖元進(jìn)行旋轉(zhuǎn)操作,具體可分為如下步驟,如圖5所示:
S1、圖元旋轉(zhuǎn)操作功能接口開始;
S2、接口傳入?yún)?shù):將要對圖元進(jìn)行旋轉(zhuǎn)操作的方向direction;
S3、定義用來記錄x、y方向的縮放系數(shù)的兩個臨時變量sx=1,sy=1;定義存放坐標(biāo)變換矩陣的臨時變量:matrix;
S4、將傳入?yún)?shù)對4取模,direction=direction%4;
S5、m_direction=(m_direction+direction)%4;根據(jù)旋轉(zhuǎn)操作的類型,疊加到圖元當(dāng)前的m_direction上,得到新的m_direction值。
S6、判斷圖元是否處于克隆狀態(tài),是則執(zhí)行S7,否則執(zhí)行S10;
S7、設(shè)置坐標(biāo)變換矩陣matrix的旋轉(zhuǎn)的角度:matrix.rotate(圖元旋轉(zhuǎn)方向*90);
S8、用matrix疊加到圖元的坐標(biāo)變換矩陣上,轉(zhuǎn)S17;
S10、判斷m_mirrorX是否為true,是則執(zhí)行S11,否則執(zhí)行S13;
S11、設(shè)置sx=-1;
S12、m_direction=(m_direction+2)%4;
S13、判斷m_mirrorY是否為true,是則執(zhí)行S14,否則執(zhí)行S16;
S14、設(shè)置sy=-1;
S15、m_direction=(m_direction+2)%4;根據(jù)旋轉(zhuǎn)操作的類型,疊加到圖元當(dāng)前的m_direction上,得到新的m_direction值。
S16、matrix.scale(sx,sy);
angle=(m_direction*90)%360;
matrix.rotate(angle)
用新得到的坐標(biāo)變換矩陣覆蓋原有的圖元的坐標(biāo)變換矩陣;
S17、圖元旋轉(zhuǎn)操作功能接口結(jié)束。
從圖形文件中加載圖元時,從圖形文件中按順序依次讀取:m_bMirrorX、m_bMirrorY、m_direction。
保存圖元時,將m_bMirrorX、m_bMirrorY、m_direction依次保存到圖形文件中。