版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、坐標(biāo)系和坐標(biāo)變換.NET Framework 4.5其他版本GDI+ 提供了世界變換和頁(yè)面變換,以便您可以變換(旋轉(zhuǎn)、縮放、平移等)所繪制的項(xiàng)。 兩種 坐標(biāo)變換還允許您使用多種坐標(biāo)系。本節(jié)內(nèi)容坐標(biāo)系類型介紹坐標(biāo)系和坐標(biāo)變換。變換的矩陣表示形式討論將矩陣用于坐標(biāo)變換。全局變換和局部變換討論全局變換和局部變換。參考Matrix封裝表示幾何變換的 3x3 仿射矩陣。相關(guān)章節(jié)在托管 GDI+ 中使用變換 提供一個(gè)主題列表,其中的主題提供有關(guān)如何使用矩陣變換的更多信息。關(guān)于 GDI+ 托管代碼包含一個(gè)主題列表,這些主題描述 .NET Framework 中可使用的圖形構(gòu)造。坐標(biāo)系類型.NET Frame
2、work 4.5其他版本GDI+ 使用三個(gè)坐標(biāo)空間: 世界、頁(yè)面和設(shè)備。 世界坐標(biāo)是用于建立特殊圖形世界模型的坐標(biāo)系, 也是在 .NET Framework 中傳遞給方法的坐標(biāo)系。 頁(yè)面坐標(biāo)系是指繪圖圖面(如窗體或控件) 使用的坐標(biāo)系。 設(shè)備坐標(biāo)系是在其上進(jìn)行繪制的物理設(shè)備 (如屏幕或紙張) 所使用的坐標(biāo)系。 當(dāng) 調(diào)用 myGraphics.DrawLine(myPen, 0, 0, 160, 80) 時(shí),傳遞給 DrawLine 方法的點(diǎn)( (0, 0) 和 (160, 80) )位于世界坐標(biāo)空間內(nèi)。 在 GDI+ 可以在屏幕上繪制線條之前,坐標(biāo)先要經(jīng) 過一系列變換。 一種稱為 “世界變換”
3、 的變換可將世界坐標(biāo)轉(zhuǎn)換為頁(yè)面坐標(biāo), 而另一種稱為 “頁(yè) 面變換”的變換可將頁(yè)面坐標(biāo)轉(zhuǎn)換為設(shè)備坐標(biāo)。變換和坐標(biāo)系 假定您想使用原點(diǎn)位于工作區(qū)的主體而非左上角的坐標(biāo)系統(tǒng)。 例如,您需要讓原點(diǎn)位于距工作 區(qū)左邊緣 100 像素、距頂部 50 像素的位置。 下圖顯示了這樣的坐標(biāo)系統(tǒng)。二口1蘭5010050 -if當(dāng)調(diào)用 myGraphics.DrawLi ne(myPe n, 0, 0,160, 80)時(shí),可得到下面的插圖中所顯示的線條。下表顯示了三種坐標(biāo)空間中線條終點(diǎn)的坐標(biāo):World(0, 0)到(160, 80)頁(yè)(100, 50) 到(260, 130)設(shè)備(100, 50) 到(260,
4、130)請(qǐng)注意,頁(yè)面坐標(biāo)空間的原點(diǎn)在工作區(qū)的左上角,情況將總是如此。另外請(qǐng)注意,由于度量單位是像素,所以設(shè)備坐標(biāo)與頁(yè)面坐標(biāo)是相同的。如果將度量單位設(shè)置為像素以外的其他單位(例如英寸),設(shè)備坐標(biāo)將不同于頁(yè)面坐標(biāo)。用于將世界坐標(biāo)映射到頁(yè)面坐標(biāo)的世界變換保存在Graphics 類的Transform屬性中。在前面的示例中,世界變換是在x方向平移100個(gè)單位、在y方向平移50個(gè)單位。下面的示例設(shè) 置了 Graphics對(duì)象的世界變換,然后使用該Graphics對(duì)象繪制前圖中顯示的線條:C#VBmyGraphics.Tra nslateTra nsform(100, 50) myGraphics.Dra
5、wLine(myPen, 0, 0, 160, 80)頁(yè)面變換將頁(yè)面坐標(biāo)映射到設(shè)備坐標(biāo)。Graphics類提供了用于操作頁(yè)面變換DpiX和DpiY,用于的PageUnit和PageScale屬性。Graphics 類還提供了兩個(gè)只讀屬性: 檢查顯示設(shè)備每英寸的水平點(diǎn)數(shù)和垂直點(diǎn)數(shù)??墒褂?Graphics 類的Page Un it屬性指定除像素以外的其他度量單位。說明不能將PageUnit屬性設(shè)置為 World,因?yàn)檫@不是物理單元,將導(dǎo)致異常。下面的示例從(0, 0) 至(2, 1) 繪制線條,其中點(diǎn)(2, 1) 位于點(diǎn)(0, 0) 的右邊2英寸和 下邊1英寸處:C#VBmyGraphics.P
6、ageU nit = GraphicsU nit .Inch myGraphics.DrawLine(myPen, 0, 0, 2, 1)說明如果在構(gòu)造鋼筆時(shí)沒有指定鋼筆的寬度,前面的示例將繪制一條一英寸寬的線 條??梢栽赑en構(gòu)造函數(shù)的第二個(gè)參數(shù)中指定鋼筆的寬度:C#VBDim myPen As NewPen(Color.Black, 1 / myGraphics.DpiX)如果我們假定顯示設(shè)備在水平方向和垂直方向每英寸都有96個(gè)點(diǎn),則上例中直線的終結(jié)點(diǎn)在三個(gè)坐標(biāo)空間中分別具有以下坐標(biāo):World(0, 0)到(2, 1)頁(yè)(0, 0)到(2, 1)設(shè)備(0, 0) 到(192, 96)請(qǐng)注
7、意,由于世界坐標(biāo)空間的原點(diǎn)在工作區(qū)的左上角,因此頁(yè)面坐標(biāo)與世界坐標(biāo)相同。您可以合并世界變換和頁(yè)面變換,以實(shí)現(xiàn)多種效果。例如,假定您想使用英寸作為度量單位,并且想讓坐標(biāo)系統(tǒng)的原點(diǎn)距工作區(qū)左邊緣2英寸、距工作區(qū)頂部1/2 英寸。下面的示例設(shè)置Graphics對(duì)象的世界變換和頁(yè)面變換,然后繪制一條從(0, 0) 到(2, 1) 的直線:C#mx n矩陣是排列在 m行和n列中的一系列數(shù)下圖顯示幾個(gè)矩陣VBmyGraphics.Tra nslateTra nsform(2, 0.5F) myGraphics.PageU nit = GraphicsU nit .Inch myGraphics.DrawL
8、ine(myPen, 0, 0, 2, 1)下圖顯示了線條和坐標(biāo)系統(tǒng)如果我們假定顯示設(shè)備在水平方向和垂直方向每英寸都有96個(gè)點(diǎn),則上例中直線的終結(jié)點(diǎn)在三個(gè)坐標(biāo)空間中分別具有以下坐標(biāo):World(0, 0)到(2, 1)頁(yè)(2, 0.5)到(4, 1.5)設(shè)備(192, 48) 到(384, 144)變換的矩陣表示形式.NET Framework 4.5其他版本02 1.003.5您可以通過將單個(gè)元素相加來加合兩個(gè)尺寸相同的矩陣。下圖顯示了兩個(gè)矩陣相加的示例102斗34024-15=171361gmx n矩陣可與一個(gè)n x p矩陣相乘,結(jié)果為一個(gè) m x p矩陣。第一個(gè)矩陣的列數(shù)必須與第二個(gè) 矩
9、陣的行數(shù)相同。 例如,一個(gè)4 X 2矩陣與一個(gè)2 X 3矩陣相乘,產(chǎn)生一個(gè)4 X 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例如,(2, 3) 和(5, 4)的點(diǎn)積為 (5) +=22。(2, 5,1) 和(4, 3, 1) 的點(diǎn)積為(2)(4) + (5)(3) + (1)(1) = 24。請(qǐng)注意,兩個(gè)矢量的點(diǎn)積是一個(gè)數(shù)字,而不是另一個(gè)矢量。另外請(qǐng)注意,只有當(dāng)兩個(gè)矢量的組件
10、數(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,貝U C的項(xiàng)計(jì)算如下:C(i, j) =(A的第i行)?( B的第j列)下圖顯示了矩陣相乘的幾個(gè)示例。-2 -31-L1-2x3o O 10 2 310 23x3如果將平面中的點(diǎn)視為1顯示了應(yīng)用于點(diǎn)X 2矩陣,則可通過將該點(diǎn)乘以一個(gè)2 X 2矩陣來將該點(diǎn)變換。的幾個(gè)變換。下圖36 1L J01I(2,1)LJ1 I 1 1 1 I1 6, 1)h x-(2.-1)1 00-1-(2. n相討二X軸前圖中顯示的所有變換都是線性變換
11、。X 2矩陣相乘的形式。假定您要從點(diǎn) 單位,在y方向?qū)⑵淦揭?個(gè)單位。某些其他變換(如平移)不是線性的,不能表示為與(2,1)開始,將其旋轉(zhuǎn)90度,在x方向?qū)⑵淦揭瓶赏ㄟ^先使用矩陣乘法再使用矩陣加法來完成此操作。2 10 1-1 0+34后面跟一平移(與 1 X 2矩陣相加)的線性變換(與 2 X 2矩陣相乘)稱為仿射變換。將仿射變換存儲(chǔ)于一對(duì)矩陣(一個(gè)用于線性部分,一個(gè)用于平移)的替換方案是將整個(gè)變換存儲(chǔ)于3X 3矩陣。若要使其起作用, 平面上的點(diǎn)必須存儲(chǔ)于具有虛擬第三坐標(biāo)的1 X 3矩陣中。 通常的方法是使所有的第三坐標(biāo)等于1。例如,矩陣2 1 1代表點(diǎn)(2, 1)。下圖演示了表示為與單個(gè)
12、3 X 3矩陣相乘的仿射變換(旋轉(zhuǎn) 90度;在x方向上平移3個(gè)單位,在y方向上平 移4個(gè)單位)。0 10-10 03 4 1-|_2 6 1在前面的示例中,點(diǎn) (2, 1)映射到了點(diǎn)(2, 6)。請(qǐng)注意,3X 3矩陣的第三列包含數(shù)字 0 , 0, 1。對(duì)于仿射變換的 3 X 3矩陣而言,情況將總是如此。 重要的數(shù)字是列1和列2中的6個(gè) 數(shù)字。 矩陣左上角的2 X2部分表示變換的線性部分,第 3行中的前兩項(xiàng)表示平移。rI o 11 1Q線性罪分I I-1 00一 J1 1J341 -J1平移訟分在GDI+中,可以在Matrix 對(duì)象中存儲(chǔ)仿射變換。 由于表示仿射變換的矩陣的第三列總是(0,0,
13、1),因此在構(gòu)造 Matrix 對(duì)象時(shí),只需指定前兩列中的 6個(gè)數(shù)。 Matrix myMatrix = new Matrix(0, 1, -1,0, 3, 4)語(yǔ)句構(gòu)造上面圖形中顯示的矩陣。復(fù)合變換復(fù)合變換是一個(gè)接一個(gè)的變換序列。請(qǐng)考慮下面列表中的矩陣和變換:矩陣A旋轉(zhuǎn)90度矩陣B在x方向上縮放2倍矩陣C在y方向上平移3個(gè)單位如果從由矩陣2 1 1 表示的點(diǎn)(2,1) 開始,并先后乘以 A、B、C,則點(diǎn)(2,1) 將按列岀 的順序經(jīng)歷三種變換。2 1 1ABC = -2 5 1可以不將復(fù)合變換的三部分存儲(chǔ)于三個(gè)獨(dú)立的矩陣,而是一起乘以A、B和C來得到存儲(chǔ)整個(gè)復(fù)合變換的單個(gè)的 3 X 3矩陣。
14、 假定ABC = D,則一個(gè)點(diǎn)乘以 D得岀的結(jié)果與一個(gè)點(diǎn)先后乘 以A、B C的結(jié)果相同。2 1 1D = -2 5 1下圖顯示了矩陣 A、B、C和D。復(fù)合變換的矩陣可通過將幾個(gè)單獨(dú)的變換矩陣相乘而得到,這就意味著任何仿射變換的序列均可存儲(chǔ)于單個(gè)的 Matrix 對(duì)象中。警告復(fù)合變換的順序非常重要。一般說來,先旋轉(zhuǎn)、再縮放、然后平移,與先縮放、再旋轉(zhuǎn)、然后平移是不同的。同樣,矩陣相乘的順序也是重要的。一般說來,ABC與BAC不同。Matrix 類提供了幾種構(gòu)建復(fù)合變換的方法:Multiply 、Rotate、RotateAt、Scale、Shear和Tran slate 。下面的示例創(chuàng)建了復(fù)合變
15、換(先旋轉(zhuǎn)30度,再在y方向上縮放2倍,然后在x方向平移5個(gè)單位)的矩陣。C#VBDim myMatrix As NewMatrix() myMatrix.Rotate(30)myMatrix.Scale(1,2, MatrixOrder.Appe nd) myMatrix.Tra nslate(5, 0, MatrixOrder.Appe nd)1.0173下圖顯示該矩陣cos30 2sin30c 00.66606全局變換和局部變換.NET Framework 4.5其他版本全局變換是應(yīng)用于由給定的Graphics對(duì)象繪制的每個(gè)項(xiàng)目的變換。與此相反,局部變換則是應(yīng)用于要繪制的特定項(xiàng)目的變換。
16、全局變換若要?jiǎng)?chuàng)建全局變換,請(qǐng)構(gòu)造 Graphics 對(duì)象,再操作其Tra nsform 屬性。Tra nsform 屬性是Matrix 對(duì)象,因此,它能夠保存仿射變換的任何序列。存儲(chǔ)在Transform 屬性中的變換被稱為世界變換。Graphics類提供了幾個(gè)構(gòu)建復(fù)合世界變換的方法:MultiplyTra nsform 、RotateTransform 、ScaleTransform 和 TranslateTransform。下面的示例繪制了兩次橢圓:一次在創(chuàng)建世界變換之前,一次在創(chuàng)建世界變換之后。變換首先在y方向上縮放0.5 倍,再在x方向平移50個(gè)單位,然后旋轉(zhuǎn) 30度。C#VBmyGra
17、phics.DrawEllipse(myPen, 0, 0, 100, 50) myGraphics.ScaleTra nsform(1,0.5F)myGraphics.Tra nslateTra nsform(50, 0, MatrixOrder.Appe nd) myGraphics.RotateTra nsform(30, MatrixOrder.Appe nd) myGraphics.DrawEllipse(myPen, 0, 0, 100, 50)下圖顯示了變換中涉及的矩陣。-i o oi r 1 o o-! r5300 0.5 00 10n30*0 0 1L50 0 1 J 0si
18、n30 0X).5sin30 sir3Q 00.5c(js30 *0S0&in30 n1說明在前面的示例中,橢圓圍繞坐標(biāo)系的原點(diǎn)旋轉(zhuǎn)。原點(diǎn)位于工作區(qū)的左上角。與橢圓圍繞其自身中局部變換局部變換應(yīng)用于要繪制的特定項(xiàng)目。例如,GraphicsPath 對(duì)象具有 Tra nsform 方法,可用來對(duì)該路徑的數(shù)據(jù)點(diǎn)進(jìn)行變換。下面的示例繪制了一個(gè)沒有變換的矩形以及一個(gè)有旋轉(zhuǎn)變換的路徑。(假定沒有世界變換)。C#VBDim myMatrix As NewMatrix() myMatrix.Rotate(45) myGraphicsPath.Tra nsform(myMatrix) myGraphics.D
19、rawRecta ngle(myPe n, 10, 10, 100, 50) myGraphics.DrawPath(myPe n, myGraphicsPath)世界變換可與局部變換合并,以得到多種結(jié)果。例如,世界變換可用于修正坐標(biāo)系統(tǒng),而局部變換可用于旋轉(zhuǎn)和縮放在新坐標(biāo)系統(tǒng)上繪制的對(duì)象。假定您需要原點(diǎn)距工作區(qū)左邊緣 200像素、距工作區(qū)頂部 150像素的坐標(biāo)系統(tǒng)。 此外,假定 您需要的度量單位是像素,且 x軸指向右方,y軸指向上方。 默認(rèn)的坐標(biāo)系統(tǒng)是 y軸指向下 方,因此您需要執(zhí)行繞水平坐標(biāo)軸的反射。下圖顯示了這樣的矩陣反射。1 Q Q0-100 0 1下一步,假定您需要執(zhí)行一個(gè)向右200個(gè)單位、向下150個(gè)單位的平移。下面的示例通過設(shè)置Graphics對(duì)象的世界變換,建立前面剛剛描述過的坐標(biāo)系統(tǒng)。C#VBDim myMatrix As NewMatrix(1,0, 0,-1, 0, 0) myGraphics.Tra nsform = myMatrix myGraphics.Tra nslateTra nsform(200, 150, MatrixOrder.Appe nd)下面的代碼(置于前面示例的結(jié)尾處)創(chuàng)建了由一個(gè)單獨(dú)矩形組成的路徑,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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年收費(fèi)員個(gè)人年度工作總結(jié)樣本
- XX駐村工作隊(duì)推進(jìn)鄉(xiāng)村振興工作總結(jié)
- 排水與降水要求措施施工
- 學(xué)校傳染病疫情及突發(fā)公共衛(wèi)生事件報(bào)告制度
- 每周食品安全排查治理報(bào)告
- 醫(yī)保定點(diǎn)藥店年度工作總結(jié)
- 立案高效神器!建設(shè)工程施工合同糾紛要素式起訴狀模板
- 建設(shè)工程施工合同糾紛要素式起訴狀模板告別無效文書
- 機(jī)械類女生求職面試技巧
- 爬蟲技術(shù)原理
- 散文系列《補(bǔ)鞋子的人》精-品解讀
- 安徽省合肥一中2025-2026學(xué)年高三上學(xué)期1月考試化學(xué)(含答案)
- 2025國(guó)開本科《公共部門人力資源管理》期末歷年真題(含答案)
- 養(yǎng)老院對(duì)護(hù)工規(guī)范管理制度
- 河北省唐山市2024-2025學(xué)年高一上學(xué)期期末數(shù)學(xué)試題(含答案)
- 農(nóng)行內(nèi)控制度匯編
- 2025年企業(yè)黨支部書記年度述職報(bào)告
- 2026年孝昌縣供水有限公司公開招聘正式員工備考題庫(kù)及參考答案詳解1套
- 絕經(jīng)后宮頸上皮內(nèi)病變處理要點(diǎn)2026
- 2025年校長(zhǎng)個(gè)人述職報(bào)告:凝心聚力抓落實(shí) 立德樹人開新局
- 瀝青混凝土面板全庫(kù)盆防滲施工質(zhì)量通病防治手冊(cè)
評(píng)論
0/150
提交評(píng)論