一、座標系
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 = newmatrix();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=newmatrix(); 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=newmatrix(); 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=newmatrix(); 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=newmatrix(); 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 = newmatrix(); 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 = newmatrix(); 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...