版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、利用矩陣進(jìn)行坐標(biāo)轉(zhuǎn)換利用矩陣進(jìn)行坐標(biāo)轉(zhuǎn)換之前做拓?fù)鋱D,本來(lái)打算整一套坐標(biāo)系統(tǒng)在里面的,后來(lái)因?yàn)闀r(shí)間原因暫時(shí)用了最原始的方法實(shí)現(xiàn)。現(xiàn)在稍稍得閑,重新開(kāi)始思考這個(gè)問(wèn)題。不過(guò)在搜索的時(shí)候,意外發(fā)現(xiàn).net framework類庫(kù)中自帶的有實(shí)現(xiàn)坐標(biāo)系轉(zhuǎn)換功能的類。reflector了一把,發(fā)現(xiàn)代碼看不懂了都是利用矩陣操作的。矩陣這玩意兒,幾年沒(méi)用早忘完了。于是認(rèn)真學(xué)習(xí)了一把,順便把如何用矩陣進(jìn)行坐標(biāo)轉(zhuǎn)換的過(guò)程記錄和注解一下。文中部分內(nèi)容摘取自msdn,搜索“變換的矩陣表示形式”即可找到。首先review一下矩陣的基礎(chǔ)知識(shí):m×n 矩陣是排列在 m 行和 n 列中的一系列數(shù)。下圖顯示幾個(gè)矩陣。
2、 可以通過(guò)將單個(gè)元素相加來(lái)加合兩個(gè)尺寸相同的矩陣。下圖顯示了兩個(gè)矩陣相加的示例。 m×n 矩陣可與一個(gè) n×p 矩陣相乘,結(jié)果為一個(gè) m×p 矩陣。第一個(gè)矩陣的列數(shù)必須與第二個(gè)矩陣的行數(shù)相同。例如,一個(gè) 4×2 矩陣與一個(gè) 2×3 矩陣相乘,產(chǎn)生一個(gè) 4×3 矩陣。矩陣的行列的平面點(diǎn)可視為矢量。例如,(2, 5) 是具有兩個(gè)組件的矢量,(3, 7, 1) 是具有三個(gè)組件的矢量。兩個(gè)矢量的點(diǎn)積定義如下:(a, b) (c, d) = ac + bd(a, b, c) (d, e, f) = ad + be + cf例
3、如,(2, 3) 和 (5, 4) 的點(diǎn)積是 (2)(5) + (3)(4) = 22。(2, 5, 1) 和 (4, 3, 1) 的點(diǎn)積是 (2)(4) + (5)(3) + (1)(1) = 24。請(qǐng)注意,兩個(gè)矢量的點(diǎn)積是數(shù)字,而不是另一個(gè)矢量。另外請(qǐng)注意,只有當(dāng)兩個(gè)矢量的組件數(shù)相同時(shí),才能計(jì)算點(diǎn)積。將 a(i, j) 作為矩陣 a 中第 i 行、第 j 列的項(xiàng)。例如,a(3, 2)是矩陣 a 中第 3 行、第 2 列的項(xiàng)。假定 a、b 和 c 是矩陣,且 ab = c,則 c 的項(xiàng)計(jì)算如下:c(i, j) =(a 的第 i 行)(b 的第 j 列)下圖顯示了矩陣相乘的幾個(gè)示例。以第二個(gè)等
4、式為例,假設(shè)等式兩邊的矩陣分別是a、b、c,1*3的矩陣和3*2的矩陣相乘,得到的結(jié)果為1*2的矩陣。其中c00 = a00*b00+a01*b10+a02*b20,c01=a00*b01+a01*b11+a02*b21。矩陣的加法、乘法,可以用來(lái)做坐標(biāo)轉(zhuǎn)換。我們通常使用3*3(如果不需要旋轉(zhuǎn),則2*2的矩陣即可)的矩陣來(lái)做平面上的各種坐標(biāo)轉(zhuǎn)換,包括x/y軸的平移、旋轉(zhuǎn)?,F(xiàn)在來(lái)看一個(gè)簡(jiǎn)單的坐標(biāo)系轉(zhuǎn)換的例子:假設(shè)我們的客戶區(qū)分辨率是100*100,要在客戶區(qū)中心點(diǎn)畫(huà)一個(gè)點(diǎn),這個(gè)點(diǎn)的坐標(biāo)是(x, y)?,F(xiàn)在如果我們調(diào)整了客戶區(qū)分辨率為400*300,此時(shí)如果還需要保持這個(gè)點(diǎn)的相對(duì)位置不變,計(jì)算他的
5、坐標(biāo)應(yīng)該是(x * 400 / 100, y * 300 / 100)。這個(gè)計(jì)算過(guò)程很簡(jiǎn)單,那么用矩陣操作應(yīng)該如何來(lái)實(shí)現(xiàn)呢?我們將這個(gè)點(diǎn)視為一個(gè)1*2的矩陣,將其乘以一個(gè)2*2的矩陣,得出的仍然是一個(gè)1*2的矩陣,就是新的坐標(biāo)了。由于屏幕分辨率在x、y軸分別擴(kuò)大為原來(lái)的4倍和3倍,那么我們只要將點(diǎn)的x、y軸坐標(biāo)都擴(kuò)大到原來(lái)的4、3倍即可。公式如下: 等式左邊的第二個(gè)矩陣,就是用來(lái)實(shí)現(xiàn)坐標(biāo)轉(zhuǎn)換的矩陣。其中b00就是x軸的擴(kuò)大倍數(shù),b11就是在y軸上的擴(kuò)大倍數(shù)。這里面b01和b10永遠(yuǎn)是0。坐標(biāo)系的這種轉(zhuǎn)換,叫做線性變換。ok??赐赀@個(gè)例子,是不是覺(jué)得用矩陣比直接計(jì)算還麻煩嗯,對(duì)于這種簡(jiǎn)
6、單的情況是這樣的。不過(guò)別急,繼續(xù)看坐標(biāo)系旋轉(zhuǎn)的情況,如果現(xiàn)在要求這個(gè)客戶區(qū)逆時(shí)針旋轉(zhuǎn)30度,要保持這個(gè)點(diǎn)的相對(duì)位置不變,他的新坐標(biāo)應(yīng)該是多少呢普通的計(jì)算的公式就不陳述了,這就是個(gè)初中幾何題目。我們直接來(lái)看怎樣通過(guò)矩陣操作實(shí)現(xiàn)。首先看公式:在二維空間中,旋轉(zhuǎn)可以用一個(gè)單一的角 定義。作為約定,正角表示逆時(shí)針旋轉(zhuǎn)。關(guān)于原點(diǎn)逆時(shí)針旋轉(zhuǎn) 的矩陣是: 也就是說(shuō),逆時(shí)針旋轉(zhuǎn)30度的新坐標(biāo)就是:當(dāng)然,除此之外,坐標(biāo)系還有平移,但是這個(gè)就簡(jiǎn)單了,只是一個(gè)簡(jiǎn)單的矩陣加法。比如(x, y)向右平移一個(gè)單位,用矩陣就是x, y + 1, 0就是是(x + 1, y)。下圖顯示了應(yīng)用于點(diǎn) (2, 1) 的幾
7、個(gè)變換: 前圖中顯示的所有變換都是線性變換。某些其他變換(如平移)不是線性的,不能表示為與 2×2 矩陣相乘的形式。假定您要從點(diǎn) (2, 1) 開(kāi)始,將其旋轉(zhuǎn) 90 度,在 x 方向?qū)⑵淦揭?3 個(gè)單位,在 y 方向?qū)⑵淦揭?4 個(gè)單位??赏ㄟ^(guò)先使用矩陣乘法再使用矩陣加法來(lái)完成此操作。后面跟一平移(與 1×2 矩陣相加)的線性變換(與 2×2 矩陣相乘)稱為仿射變換,如上圖所示。放射變換(先乘后加)可以通過(guò)乘以一個(gè)3*3的矩陣來(lái)實(shí)現(xiàn),若要使其起作用,平面上的點(diǎn)必須存儲(chǔ)于具有虛擬第三坐標(biāo)的 1×3 矩陣中。通常的方法是使所有的第三坐標(biāo)等于 1。例
8、如,矩陣 2 1 1 代表點(diǎn) (2, 1)。下圖演示了表示為與單個(gè) 3×3 矩陣相乘的仿射變換(旋轉(zhuǎn) 90 度;在 x 方向上平移 3 個(gè)單位,在 y 方向上平移 4 個(gè)單位): 在前面的示例中,點(diǎn) (2, 1) 映射到了點(diǎn) (2, 6)。請(qǐng)注意,3×3 矩陣的第三列包含數(shù)字 0,0,1。對(duì)于仿射變換的 3×3 矩陣而言,情況將總是如此。重要的數(shù)字是列 1 和列 2 中的 6 個(gè)數(shù)字。矩陣左上角的 2×2 部分表示變換的線性部分,第 3 行中的前兩項(xiàng)表示平移。在使用3*3的矩陣做仿射變換時(shí)候,表示點(diǎn)的矩陣變成了一個(gè)1*3矩陣,這個(gè)矩陣中的最后一
9、個(gè)值(a02)必須設(shè)置成1。對(duì)于3*3矩陣b,其最后一列的值是多少是沒(méi)有關(guān)系的,因?yàn)樗麄儾粫?huì)影響結(jié)果中的前兩列。不過(guò)如上,經(jīng)常將他們?cè)O(shè)置為0,0,1。這一列對(duì)于坐標(biāo)轉(zhuǎn)換的結(jié)果并沒(méi)有任何影響,但是他們是必須的,因?yàn)榫仃囅喑吮仨殱M足開(kāi)篇所講的“相乘的兩個(gè)矩陣第一個(gè)矩陣的列數(shù)必須與第二個(gè)矩陣的行數(shù)相同”。 在.net framework中,又一個(gè)矩陣類“matrix”。其內(nèi)置了點(diǎn)坐標(biāo)轉(zhuǎn)換(transformpoints)、平移(translate)、縮放(scale)、旋轉(zhuǎn)(rotate)方法。下面的示例創(chuàng)建了復(fù)合變換(先旋轉(zhuǎn) 30 度,再在 y 方向上縮放 2 倍,然后在 x 方向平移 5 個(gè)單位)的矩陣:matrix mymatrix = new matrix();(30);(1, 2, (5, 0, 除了matrix類以外,.net framework中也有其他用于坐標(biāo)系轉(zhuǎn)換的類,比如。具體用法請(qǐng)查閱相關(guān)文檔。 以上只是利用矩陣進(jìn)行平面坐標(biāo)系轉(zhuǎn)換的方法。如果是三位坐標(biāo)系,也是可以利用矩陣來(lái)操作的,但matrix類不行
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年淘寶天貓電商代運(yùn)營(yíng)服務(wù)合同范本解讀9篇
- 2024年幼兒園大班數(shù)學(xué)教案 (一)
- 清淤施工方案匯報(bào)
- 2025年度出租車(chē)車(chē)輛安全檢測(cè)認(rèn)證合同3篇
- 年度火災(zāi)報(bào)警控制系統(tǒng)產(chǎn)業(yè)分析報(bào)告
- 2004年山西太原中考滿分作文《夢(mèng)里花落知多少》2
- 年度智能化塑殼斷路器競(jìng)爭(zhēng)策略分析報(bào)告
- 部編版七年級(jí)語(yǔ)文上冊(cè)《論語(yǔ) 十二章》教學(xué)設(shè)計(jì)(第三課時(shí))
- 2025年度中式餐廳承包管理合同示范文本4篇
- 賓語(yǔ)從句連詞課程設(shè)計(jì)
- C及C++程序設(shè)計(jì)課件
- 帶狀皰疹護(hù)理查房
- 公路路基路面現(xiàn)場(chǎng)測(cè)試隨機(jī)選點(diǎn)記錄
- 平衡計(jì)分卡-化戰(zhàn)略為行動(dòng)
- 國(guó)家自然科學(xué)基金(NSFC)申請(qǐng)書(shū)樣本
- 幼兒教師干預(yù)幼兒同伴沖突的行為研究 論文
- 湖南省省級(jí)溫室氣體排放清單土地利用變化和林業(yè)部分
- 材料設(shè)備驗(yàn)收管理流程圖
- 培訓(xùn)機(jī)構(gòu)消防安全承諾書(shū)范文(通用5篇)
- (完整版)建筑業(yè)10項(xiàng)新技術(shù)(2017年最新版)
- 第8期監(jiān)理月報(bào)(江蘇版)
評(píng)論
0/150
提交評(píng)論