Android 座標系及轉化

2021-09-08 12:27:10 字數 4527 閱讀 4018

一、座標系

android應用層座標系原點在左上角,座標範圍(0,0)——(width,height)。

android底層座標系原點在螢幕**,座標範圍(-1000,,1000)——(1000,1000)。

二、scale縮放

matrix3*3的矩陣結構如下

1

scale就是縮放,我們呼叫matrix的setscale、prescale、postscale,實際在內部,就是通過修改mscale_x和mscale_y來實現的。

rotate,數值為正,順時針旋轉;數值為負,逆時針旋轉

1 matrix matrix = new

matrix();23

//縮放動作

4matrix.postscale(scalewidth, scaleheight);5//

建立新的

6 bitmap resizedbitmap = bitmap.createbitmap(bitmaporg, 0, 0,

7 width, height, matrix, true);8

9i1.setimagebitmap(resizedbitmap);

1011

//縮放動作

12matrix.postscale(scalewidth2, scaleheight2);

13//

建立新的

14 resizedbitmap = bitmap.createbitmap(bitmaporg2, 0, 0,

15 width2, height2, matrix, true

);16

17 i2.setimagebitmap(resizedbitmap);

而後對原矩陣進行矩陣相乘完成縮放。

三、translate

matrix.setscale(interpolatedtime, interpolatedtime);

matrix.pretranslate(-centerx, -centery);

matrix.posttranslate(centerx, centery);

pretranslate是指在setscale前,平移,posttranslate是指在setscale後平移

注意他們引數是平移的距離,而不是平移目的地的座標!

由於縮放是以(0,0)為中心的,所以為了把介面的中心與(0,0)對齊,就要pretranslate(-centerx, -centery),

四、set....、pre....、post...的區別

setscale(sx,sy),首先會將該matrix設定為對角矩陣,即相當於呼叫reset()方法,然後在設定該matrix的mscale_x和mscale_y直接設定為sx,sy的值

prescale(sx,sy),不會重置matrix,而是直接與matrix之前的mscale_x和mscale_y值結合起來(相乘),m' = m * s(sx, sy)。

postscale(sx,sy),不會重置matrix,而是直接與matrix之前的mscale_x和mscale_y值結合起來(相乘),m' = s(sx, sy) * m。

(1)pre的執行順序

1 matrix matrix=new

matrix(); 23

float points=new

float; 45

67 matrix.prescale(2.0f, 3.0f);//

8 matrix.pretranslate(8.0f,7.0f);//910

1112 log.i("test", points[0]+"");

1314 log.i("test", points[1]+"");

結果為點座標為(36.0,51.0)

可以得出結論,進行變換的順序是先執行pretranslate(8.0f,7.0f),在執行的prescale(2.0f,3.0f)。這也是為什麼有的人比喻為pre...是向後生長的,即對於乙個matrix的設定中,

所有pre....是倒著向後執行的。

(2)post的執行順序

1 matrix matrix=new

matrix(); 23

float points=new

float; 45

67 matrix.postscale(2.0f, 3.0f);//

89 matrix.posttranslate(8.0f,7.0f);//

1011

1213 log.i("test", points[0]+"");

1415 log.i("test", points[1]+"");

結果為點座標為(28.0,37.0)

可以得出結論,進行變換的順序是先執行postscale(2.0f,3.0f),在執行的posttranslate(8.0f,7.0f)。這 也是為什麼有的人比喻為post...是向前生長的,即對於乙個matrix的設定中,所有post....是順著向前執行的。

(3)pre與post交替

1 matrix matrix=new

matrix(); 23

float points=new

float; 45

67 matrix.postscale(2.0f, 3.0f);

89 matrix.prerotate(90);

1011

1213 log.i("test", points[0]+"");

1415 log.i("test", points[1]+"");

結果為點座標為(-20.0,30.0)。先旋轉方向再縮放。

1 matrix matrix=new

matrix(); 23

float points=new

float; 45

67 matrix.prerotate(90);

89 matrix.postscale(2.0f, 3.0f);

1011

1213 log.i("test", points[0]+"");

1415 log.i("test", points[1]+"");

結果為點座標依舊為為(-20.0,30.0)

(4)

1 matrix matrix = new

matrix(); 23

float points = new

float ; 45

67 matrix.postscale(2.0f, 3.0f);//

第1步

89 matrix.prerotate(90);//

第2步

1011 matrix.posttranslate(8.0f, 7.0f);//

第3步

1213 matrix.prescale(1.5f, 2.5f);//

第4步

1415

1617 log.i("test", points[0] + "");

1819 log.i("test", points[1] + "");

結果為點座標依舊為為(-42.0,52.0)

經過前面的結論和推算,可以發現執行的順序是   4----2----1---3

(5)

1 matrix matrix = new

matrix(); 23

float points = new

float ; 45

67 matrix.postscale(2.0f, 3.0f);//

第1步

89 matrix.prerotate(90);//

第2步

1011 matrix.setscale(1.4f, 2.6f);//

第3步

1213 matrix.posttranslate(8.0f, 7.0f);//

第4步

1415 matrix.prescale(1.5f, 2.5f);//

第5步

1617

1819 log.i("test", points[0] + "");

2021 log.i("test", points[1] + "");

結果為點座標依舊為為(29.0,72.0)

經過計算,可以發現,在第3步setscale之前的第1、2步根本就沒有用了,直接被第3步setscale覆蓋,在從第3開始執行的。

順序為2---1----3----5----4,因為2、1被覆蓋了,所以沒有效果,相當於直接執行3-----5----4

總結:最後可以得出結論,在對matrix該次變換之前的所有設定中,先檢測有沒有setscale,如果有,直接跳到setscale那一步開始 執行變換,然後在倒著執行下面所有的pre...變換,在順著執行所有post....的變換。所以在對matrix變換設定的時候,一定要注意順序,不 同的順序,會有不同的結果。

參考:

導航座標系和大地座標系的轉化程式

導航座標系和大地座標系的轉化程式 主要目的 實現了 站心座標系和大地座標系的轉化 有什麼用?為了實現由gps座標獲得相對距離 什麼是站心座標系呢?以你為座標原點,xyz座標系。什麼是大地座標系呢?wg 84座標系 gps的輸出座標系,和地心座標系不同。本 考慮了橢球修正,實測比較準確。encodin...

MFC控制項程式設計 座標系轉化

假定point為螢幕座標系中的一點,求取實際影象中的對應點。1 螢幕座標系轉化為使用者座標系 this clienttoscreen point 點的座標就轉化為使用者座標系中的乙個點。舉例來說,如果是基於對話方塊程式設計,那麼使用者區就是整個對話方塊的範圍。2 使用者座標系轉化為實際控制項座標系 ...

詳解座標系及座標變換 大地座標系(一)

以前讀大學的時候,沒有好好的把座標系學一下,到工作的時候才發現座標系是如此的重要。如果說資料是gis的血肉 那麼座標系就是gis的靈魂。離開這個靈魂gis就是乙個空殼,毫無意義。在gis中座標系被分為兩大類,大地座標系 地理座標系 和投影座標系。大地座標系屬於參心座標系,座標系中的點位於球面上,如w...