本文目錄一覽:
利用java實現圖片翻轉的代碼
重載渲染控制項的paintComponent(Graphics g)方法.
設你當前圖像實例為img,已初始化,需要旋轉的角度為ang
public void paintComponent(Graphics g){
super.paintCompoent(g);
Graphics2D g2d = (Graphics2D)g;
g2d.rotate(-angle);
g2d.drawImage(img,0,0,this.getWidth(),this.getHeight(),null);
}
Graphics,Graphics2D 類中有對當前描繪環境進行仿射變換的方法,包括translate,scale,rotate,也可以直接設置仿射變換矩陣,利用這點就可以根據所需要的實現方式來進行描繪.
2. threejs源碼閱讀——math/matrix
與 Vector介面 一樣,threejs也在 Matrix3.d.ts 文件中提供了一個 Matrix 介面,並且在 Matrix3 (3×3矩陣類)和 Maxtrix4 (4×4矩陣類)中實現了該介面。
我們可以看到,矩陣中的元素是用數組的方式儲存的。由於不同維度的矩陣內所用的元素個數不同,所以Matrix3和Matrix4的set方法是分開聲明在每個類中的。這裡我們以Matrix3.set為例:
可以看到,在set時是以行優先的順序進行傳值的,也就是第一行第一個,第一行第二個,第一行第三個,第二行第一個,第二行第二個…
但是在set方法的實現中,可以看到elements數組內是以列優先的順序進行存儲的:
簡單點說,這裡只是 存儲方式的不同 。由於大多數人都習慣以行優先的方式考慮矩陣,所以threejs中所有的文檔都是以行優先的方式表示的。但如果我們想要閱讀源碼,就要注意到[n11, n12, n13, n21 … n33]並不是按順序儲存在elements中。事實上如果我們按順序讀取elements中的元素並以行優先的方式組成矩陣,它將是原本矩陣的轉置矩陣。
如同Vector的類型,Matrix類型中所有返回值為自身類對象的方法也是原地修改該對象。例如 Transpose轉置
所有的Matrix也提供了clone和copy方法,用於深拷貝不同Matrix對象。
那麼threejs中的向量與矩陣進行計算是以什麼形式進行的呢?這裡我們舉一個例子。
在Vector3類中提供了appyMatrix3這個方法,這個方法以一個3×3的矩陣作為參數,相乘後原地修改向量的值。
如果我們將Vector3看做 三行一列的矩陣(3×1) 的話,那麼就需要左乘3×3矩陣,最後得到列向量:
如果我們將Vecot3看做 一行三列的矩陣(1×3) 的話,那麼就需要右乘3×3矩陣,最後得到行向量:
接下來,我們再假設一個向量
加入齊次坐標w=1,來表示三維空間中的一個點(1,2,3)
然後我們構建一個仿射變換矩陣做縮放+平移運算
即沿著xyz軸均縮放2倍,然後沿著xyz移動5個單位距離。最終結果是:
這個計算我們會使用Vector3.applyMatrix4
接下來驗證一下:
控制台列印結果:
threejs中的矩陣以 行優先 的形式初始化,以 列優先 的形式儲存。
threejs中的向量採用 列向量 ,與矩陣做 左乘運算 。
threejs中一個三維向量與4×4的矩陣進行運算時,會先給三維向量補充第四個值w,也就是齊次坐標,w值與矩陣的第四行有關係:
在上面的例子中,我們使用了一個縮放+平移的 仿射變換矩陣 作為例子,此時w為1。
labview怎麼對圖片仿射變換
使用視覺運動控制軟體對圖片仿射變換。
仿射變換,是指在幾何中一個向量空間進行一次線性變換並接上一個平移,變換為另一個向量空間,即在幾何上定義為兩個向量空間之間的一個仿射變換或者仿射映射,由一個非奇異的線性變換接上一個平移變換組成。
LabVIEW是一種程序開發環境,由美國國家儀器NI公司研製開發,與其他計算機語言的顯著區別是,其他計算機語言都是採用基於文本的語言產生代碼,而LabVIEW使用的是圖形化編輯語言G編寫程序,產生的程序是框圖的形式。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/301675.html