[Geiv]第一章:靜態繪製(二) 圖元的位置變換

靜態繪製(二) 

圖元的位置變換

        這篇文章主要介紹圖元位置變換方法。

[位置變換]:

        再次提醒:默認分辨率爲800X600,這裏使用的圖形單位以分辨率爲準,而非OpenGl上下文式的座標,這點請注意。

        我們繼續使用上節中的例子:

public static void main(String[] args) {
              UESI UES = new R();
              Obj rect = UES.creatObj(UESI.BGIndex);
              rect.addGLRect("FFFFFF",0,0,300f,300f);
              rect.addGLLine("00FF00",0,0,300f,300f);
              rect.addGLOval("FFFF00",0,0,300f,300f);
              rect.show();
              rect.setDx(100);
              rect.setDy(100);
       }

        

        其實我們已經使用了位置變換方法中的setDx與setDy了,它們會將圖元位置設置在指定的座標位置,我們繪製圖形時都是以原點爲起點繪製的,之後使用set方法將其偏離原點100個像素,因爲以原點繪製圖形較爲容易。

        拋棄座標: 但沒人願意校準座標的,相信我;假如此時我們希望將這個圖元放到屏幕中心,該如何呢?計算座標麼?我在很多遊戲UI設計時花費了大量的時間校準座標,這相當不值得,因此纔有了校準API:

使用rect.setPosition(CANExPos.POS_CENTER);方法替換掉兩個set方法。

Obj rect = UES.creatObj(UESI.BGIndex);
rect.addGLRect("FFFFFF",0,0,300f,300f);
rect.addGLLine("00FF00",0,0,300f,300f);
rect.addGLOval("FFFF00",0,0,300f,300f);
rect.show();
rect.setPosition(CANExPos.POS_CENTER);
        

校準API詳解:

        

        其中,FLAG參數是CANExPos或CANRefPos接口中的靜態量。CAN開頭的接口是圖形標準,Obj已經將他們全部實現。

        在上述setPosition方法中分爲兩類,一種是絕對定位類,它定位相對於屏幕的位置,Flag使用CANExPos中的值。

另一種是相對座標類(其參數包含了rO),它用於相對其他圖元進行定位。Flag使用CANRefPos中的值。

=====================================================

絕對定位FLAG

        

        POS_CENTER:圖元中心校準在屏幕中心,也就是上例所用。

        POS_CORNER系列對應於屏幕四個角

        POS_X、Y系列對應於X、Y軸位置。

        當然,我們可以使用包含margin參數的重載進行縮進,例如,我們希望把圖形放置在屏幕右上角,並進行縮進100個單位:

        只需要將:rect.setPosition(CANExPos.POS_CENTER);

        替換爲:rect.setPosition(CANExPos.POS_CORNER_RIGHTTOP,100f);

結果:

        

        縮進指的是橫縱向縮進,而非斜向;

        setPosition除了提供margin重載外,還提供了圖形索引重載,可以對圖元中的指定圖形進行校準。

        Margin參數是float型,如果大意寫成了Int型,則會進行視圖索引重載方法,而產生潛在的越界異常。


相對定位Flag


        這些常量的名字比較容易理解:

        CORNER系列爲角相對位置,LEFTTHAN\RIGHTTHAN\BOTTOMTHAN\TOPTHAN分別對應在rO左、右、下、上的位置,當然你也可以使用margin進行相對縮進。

        相對定位需要一個相對的標準(rO),它可以是一個圖元Obj。

例子:

Obj rect =UES.creatObj(UESI.BGIndex);
rect.addGLRect("FFFFFF",0,0,300f,300f);
rect.addGLLine("00FF00",0,0,300f,300f);
rect.addGLOval("FFFF00",0,0,300f,300f);
rect.show();
rect.setPosition(CANExPos.POS_CENTER);
//以上是中心位置的例子,在下面進行拓展。
Obj rect2 = UES.creatObj(UESI.BGIndex);
rect2.addGLRect("004FFF",0,0,300f,100f);
rect2.setPosition(CANRefPos.RPO_Y_BOTTOMTHAN, rect);
rect2.show();

結果:

        

        我們創建了300X100的藍色矩形rect2,並將其放置在rect1的下方。


獲得圖元座標:

        使用setDx()\setDy()可以設置圖元座標。

        同理,使用getDx()\getDy()可以獲得圖元當前座標。

        當然,它們包含有圖元索引重載,你可以獲得圖元中某一圖形的位置座標。


除了位置座標

        一個圖元圖形如果包括了兩個以上的點,例如矩形,除了標示位置的座標DxDy外,還有其四個點座標(注意位置座標並不是第一個頂點的座標,它們僅是在未進行旋轉變換前恰巧重合着);對於多點圖形的頂點座標,可使用getDxs\getDys方法獲得,你可以使用getPointNumber方法獲得圖形的頂點數。

[例子]

        在相對定位例子中末尾,加入如下語句:

for(int i = 0;i < 4;i++){     
System.out.println(rect2.getDxs(i) +"," + rect2.getDys(i));
      }


控制檯打印結果:

250.0,450.0

550.0,450.0

550.0,550.0

250.0,550.0

        同樣,你可以使用setDxs\setDys方法設置這些座標,它們同樣具備圖元索引重載。

[總結]

        通過這一節內容,我們知道了改變圖元位置的各種方法,包括使用setDx、setDy這樣的直接設置法,也包括校準API中的絕對校準與相對校準。最後,我們介紹了獲得圖元座標或圖元內圖形座標的方法,以及除去位置座標,圖形頂點的座標的設置及獲得方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章