Transform仿射變換和原理

2021-08-15 20:20:35 字數 2649 閱讀 2725

uiview有乙個transform屬性,cgaffinetransform 可以操控二維平面內控制項的平移、旋轉和縮放。

這三種型別的圖形變換可以使用 cgaffinetransformmake

(, , , , , )

通過設定引數實現(其實為矩陣中的引數設定)。但ios開發中,蘋果為我們提供了更加方便的介面,如下:

/*

cgaffinetransformmaketranslation:

以初始位置為基準進行平移變換

cgaffinetransformtranslate:

實現以乙個已經存在的形變為基準,在x軸方向上平移x單位,在y軸方向上平移y單位

初始化:

cgaffinetransform transform = cgaffinetransformidentity;

cgaffinetransformidentity是系統提供的乙個常量,

the identity transform: [1 0 0 1 0 0] (和原圖一樣的transform)

*/self.imgview.transform = cgaffinetransformmaketranslation(100, 100);

self.imgview.transform = cgaffinetransformtranslate(cgaffinetransformidentity, 100, 100);

// 在x、y軸平移100也可以這樣設定

self.imgview.transform = cgaffinetransformmake(1, 0, 0, 1, 100, 100);

cgaffinetransform transform = cgaffinetransformmakerotation(-m_pi_2);

self.imgview.transform = cgaffinetransformrotate(transform, m_pi_2);

self.imgview.transform = cgaffinetransformscale(cgaffinetransformidentity, 2.0, 2.0);

self.imgview.transform = cgaffinetransformmakescale(2.0, 2.0);

了解仿射變換矩陣計算原理,回顧一下線性代數:

參考文章:

初始化: cgaffinetransform  transform = cgaffinetransformidentity;

cgaffinetransformidentity是系統提供的乙個常量,/* the identity transform: [ 1 0 0 1 0 0 ]. */(和原圖一樣的transform);

cgaffinetransform transform  = cgaffinetransformmake(cgfloat a,cgfloat b,

cgfloat c,cgfloa td,cgfloat tx,cgfloat ty)

下面是原始的(預設的)transform

uiview預設的

引數結構

人後我們再來看它的計算公式:3 x 3矩陣合成得到(x`,y`,1)

(x`,y`,1)公式

矩陣演算法公式:

演算法公式

x' 和 y' 是我們轉換後的目標座標值,x、y是已知原始位置的座標值。

我們建立兩個大小和位置一樣的檢視,保持背景檢視恆定不變,並將上層的檢視做伸縮變換:    

nslog(@"變換前座標----> x:%f y:%f w:%f h:%f", self.testview.frame.origin.x, self.testview.frame.origin.y, self.testview.frame.size.width, self.testview.frame.size.height);

[uiview animatewithduration:2 animations:^ completion:^(bool finished) ];

將設定的引數帶入方程可得:

x' = 0.2*x 

y' = y

所以該引數是將testview檢視橫向x軸伸縮為原來的0.2倍:

檢視列印前後座標:

只有寬度和x座標點發生了變化。

仿射變換transform

void viewdidload void clickmeaction 2 仿射變換比例 uiview animatewithduration 1animations 3 仿射變換旋轉 uiview animatewithduration 1animations 4 三種變換的結合 1 transl...

剛性仿射變換演算法 仿射變換

哎慢慢來吧,感覺一大堆東西看不懂.仿射變換就是affine transformation 這是乙個跟影象相關的變換,影象變換是通過矩陣變換來實現的。影象的幾個基本變換有平移 縮放 旋轉 仿射 透視。剛性變換 就像這個題目這樣顯示的,就是非常強硬的變換,在這個二維平面上開始是怎麼樣,後來就是怎麼樣 仿...

warpAffine OPENCV 仿射變換原理

在opencv中,目前並沒有現成的函式直接用來實現影象旋轉,它是用仿射變換函式cv warpaffine來實現的,此函式目前支援4種插值演算法,最近鄰 雙線性 雙三次 蘭索斯插值,如果傳進去的引數為基於畫素區域關係插值演算法 inter area 則按雙線性插值。通常使用2 3矩陣來表示仿射變換 其...