




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、利用矩陣進行坐標轉換之前做拓撲圖,本來打算整一套坐標系統在里面的,后來因為時間原因暫時用了最原始的方法實現。現在稍稍得閑,重新開始思考這個問題。不過在搜索的時候,意外發現.Net Framework類庫中自帶的有實現坐標系轉換功能的類。Reflector了一把,發現代碼看不懂了都是利用矩陣操作的。矩陣這玩意兒,幾年沒用早忘完了。于是認真學習了一把,順便把如何用矩陣進行坐標轉換的過程記錄和注解一下。文中部分內容摘取自MSDN,搜索“變換的矩陣表示形式”即可找到。首先review一下矩陣的基礎知識:m×n 矩陣是排列在 m 行和 n 列中的一系列數。下圖顯示幾個矩陣。 可以通過
2、將單個元素相加來加合兩個尺寸相同的矩陣。下圖顯示了兩個矩陣相加的示例。 m×n 矩陣可與一個 n×p 矩陣相乘,結果為一個 m×p 矩陣。第一個矩陣的列數必須與第二個矩陣的行數相同。例如,一個 4×2 矩陣與一個 2×3 矩陣相乘,產生一個 4×3 矩陣。矩陣的行列的平面點可視為矢量。例如,(2, 5) 是具有兩個組件的矢量,(3, 7, 1) 是具有三個組件的矢量。兩個矢量的點積定義如下:(a, b) ? (c, d) = ac + bd(a, b, c) ? (d, e, f) = ad + be + cf例如,(2,
3、3) 和 (5, 4) 的點積是 (2)(5) + (3)(4) = 22。(2, 5, 1) 和 (4, 3, 1) 的點積是 (2)(4) + (5)(3) + (1)(1) = 24。請注意,兩個矢量的點積是數字,而不是另一個矢量。另外請注意,只有當兩個矢量的組件數相同時,才能計算點積。將 A(i, j) 作為矩陣 A 中第 i 行、第 j 列的項。例如,A(3, 2)是矩陣 A 中第 3 行、第 2 列的項。假定 A、B 和 C 是矩陣,且 AB = C,則 C 的項計算如下:C(i, j) =(A 的第 i 行)?(B 的第 j 列)下圖顯示了矩陣相乘的幾個示例。以第二個等式為例,假
4、設等式兩邊的矩陣分別是a、b、c,1*3的矩陣和3*2的矩陣相乘,得到的結果為1*2的矩陣。其中c00 = a00*b00+a01*b10+a02*b20,c01=a00*b01+a01*b11+a02*b21。矩陣的加法、乘法,可以用來做坐標轉換。我們通常使用3*3(如果不需要旋轉,則2*2的矩陣即可)的矩陣來做平面上的各種坐標轉換,包括x/y軸的平移、旋轉。現在來看一個簡單的坐標系轉換的例子:假設我們的客戶區分辨率是100*100,要在客戶區中心點畫一個點,這個點的坐標是(x, y)。現在如果我們調整了客戶區分辨率為400*300,此時如果還需要保持這個點的相對位置不變,計算他的坐標應該是
5、(x * 400 / 100, y * 300 / 100)。這個計算過程很簡單,那么用矩陣操作應該如何來實現呢?我們將這個點視為一個1*2的矩陣,將其乘以一個2*2的矩陣,得出的仍然是一個1*2的矩陣,就是新的坐標了。由于屏幕分辨率在x、y軸分別擴大為原來的4倍和3倍,那么我們只要將點的x、y軸坐標都擴大到原來的4、3倍即可。公式如下: 等式左邊的第二個矩陣,就是用來實現坐標轉換的矩陣。其中b00就是x軸的擴大倍數,b11就是在y軸上的擴大倍數。這里面b01和b10永遠是0。坐標系的這種轉換,叫做線性變換。OK。看完這個例子,是不是覺得用矩陣比直接計算還麻煩?嗯,對于這種簡單的情況
6、是這樣的。不過別急,繼續看坐標系旋轉的情況,如果現在要求這個客戶區逆時針旋轉30度,要保持這個點的相對位置不變,他的新坐標應該是多少呢?普通的計算的公式就不陳述了,這就是個初中幾何題目。我們直接來看怎樣通過矩陣操作實現。首先看公式:在二維空間中,旋轉可以用一個單一的角 定義。作為約定,正角表示逆時針旋轉。關于原點逆時針旋轉 的矩陣是: 也就是說,逆時針旋轉30度的新坐標就是:當然,除此之外,坐標系還有平移,但是這個就簡單了,只是一個簡單的矩陣加法。比如(x, y)向右平移一個單位,用矩陣就是x, y + 1, 0就是是(x + 1, y)。下圖顯示了應用于點 (2, 1) 的幾個變換
7、: 前圖中顯示的所有變換都是線性變換。某些其他變換(如平移)不是線性的,不能表示為與 2×2 矩陣相乘的形式。假定您要從點 (2, 1) 開始,將其旋轉 90 度,在 x 方向將其平移 3 個單位,在 y 方向將其平移 4 個單位。可通過先使用矩陣乘法再使用矩陣加法來完成此操作。后面跟一平移(與 1×2 矩陣相加)的線性變換(與 2×2 矩陣相乘)稱為仿射變換,如上圖所示。放射變換(先乘后加)可以通過乘以一個3*3的矩陣來實現,若要使其起作用,平面上的點必須存儲于具有虛擬第三坐標的 1×3 矩陣中。通常的方法是使所有的第三坐標等于 1。例如,矩
8、陣 2 1 1 代表點 (2, 1)。下圖演示了表示為與單個 3×3 矩陣相乘的仿射變換(旋轉 90 度;在 x 方向上平移 3 個單位,在 y 方向上平移 4 個單位): 在前面的示例中,點 (2, 1) 映射到了點 (2, 6)。請注意,3×3 矩陣的第三列包含數字 0,0,1。對于仿射變換的 3×3 矩陣而言,情況將總是如此。重要的數字是列 1 和列 2 中的 6 個數字。矩陣左上角的 2×2 部分表示變換的線性部分,第 3 行中的前兩項表示平移。在使用3*3的矩陣做仿射變換時候,表示點的矩陣變成了一個1*3矩陣,這個矩陣中的最后一個值(
9、a02)必須設置成1。對于3*3矩陣b,其最后一列的值是多少是沒有關系的,因為他們不會影響結果中的前兩列。不過如上,經常將他們設置為0,0,1。這一列對于坐標轉換的結果并沒有任何影響,但是他們是必須的,因為矩陣相乘必須滿足開篇所講的“相乘的兩個矩陣第一個矩陣的列數必須與第二個矩陣的行數相同”。 在.Net Framework中,又一個矩陣類“Matrix”。其內置了點坐標轉換(TransformPoints)、平移(Translate)、縮放(Scale)、旋轉(Rotate)方法。下面的示例創建了復合變換(先旋轉 30 度,再在 y 方向上縮放 2 倍,然后在 x 方向平移 5 個
10、單位)的矩陣:Matrix myMatrix = new Matrix();myMatrix.Rotate(30);myMatrix.Scale(1, 2, MatrixOrder.Append);myMatrix.Translate(5, 0, MatrixOrder.Append); 除了Matrix類以外,.Net Framework中也有其他用于坐標系轉換的類,比如System.Drawing.Graphics。具體用法請查閱相關文檔。 以上只是利用矩陣進行平面坐標系轉換的方法。如果是三位坐標系,也是可以利用矩陣來操作的,但Ma
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年水產捕撈勞動合同3篇
- 司機聘用勞動合同5篇
- 普通房屋出租合同范本4篇
- 鍋爐管道維修合同3篇
- 增資擴股托管申請協議8篇
- 飛龍陽光城D影視合同4篇
- 用友服務合同4篇
- 文本從下向上飛入動畫設計規范
- T/ZJSEE 0012-2023分布式光伏驗收規范
- 健康促進建設課件
- 江蘇蘇州國家歷史文化名城保護區、蘇州市姑蘇區區屬國資集團招聘筆試題庫2025
- 居間合同代持協議
- 安眠藥用藥知識培訓課件
- 2025屆北京市朝陽區高三2月模擬(三)數學試題
- 火爆世界的DeepSeek(時政猜想)-2025年中考道德與法治時政熱點專練 (解析版)
- 2025年安全教育培訓考試試題-駕駛員交通安全知識提升測試
- 2025年高考歷史三輪復習之宋元時期
- 2025年安徽省C20教育聯盟中考一模物理試題(原卷版+解析版)
- 小區違章裝修培訓
- 疫情防控消毒培訓課件
- 江蘇鹽城歷年中考作文題與審題指導(2002-2024)
評論
0/150
提交評論