?? 第2章 圖象的幾何變換.htm
字號:
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>}</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>}</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>hDc=GetDC(hWnd);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>if(hBitmap!=NULL)</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>DeleteObject(hBitmap);
//</SPAN><SPAN style="FONT-FAMILY: 宋體">釋放原來的位圖句柄</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>//</SPAN><SPAN
style="FONT-FAMILY: 宋體">產生新的位圖</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
lang=EN-US>hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpTempImgData,</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>(LONG)CBM_INIT,</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>(LPSTR)lpTempImgData+</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>sizeof(BITMAPINFOHEADER)
+</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
lang=EN-US>NumColors*sizeof(RGBQUAD),</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>(LPBITMAPINFO)lpTempImgData,
</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>DIB_RGB_COLORS);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>//</SPAN><SPAN
style="FONT-FAMILY: 宋體">將平移后的圖象存成文件</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
lang=EN-US>hf=_lcreat("c:\\translation.bmp",0);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
lang=EN-US>_lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER)); </SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
lang=EN-US>_lwrite(hf,(LPSTR)lpTempImgData,BufSize);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>_lclose(hf);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>//</SPAN><SPAN
style="FONT-FAMILY: 宋體">釋放資源和內存</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>ReleaseDC(hWnd,hDc);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
lang=EN-US>LocalUnlock(hTempImgData);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
lang=EN-US>LocalFree(hTempImgData);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>GlobalUnlock(hImgData);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>return TRUE;</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>}</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 9pt"></SPAN></P>
<H2><SPAN lang=EN-US>2.2</SPAN> <SPAN lang=EN-US></SPAN><A
name=_Toc486331869></A><A name=_Toc486332869></A><A name=_Toc486338978></A><A
name=_Toc454810843></A><A
name=_Toc454856617><SPAN><SPAN>旋轉</SPAN></SPAN></A></H2>
<P style="LINE-HEIGHT: 18pt"><SPAN style="FONT-FAMILY: 宋體">旋轉</SPAN><SPAN
lang=EN-US>(rotation)</SPAN><SPAN
style="FONT-FAMILY: 宋體">有一個繞著什么轉的問題,通常的做法是以圖象的中心為圓心旋轉,舉個例子,圖</SPAN><SPAN
lang=EN-US>2.7</SPAN><SPAN style="FONT-FAMILY: 宋體">旋轉</SPAN><SPAN
lang=EN-US>30</SPAN><SPAN style="FONT-FAMILY: 宋體">度</SPAN><SPAN
lang=EN-US>(</SPAN><SPAN style="FONT-FAMILY: 宋體">順時針方向</SPAN><SPAN
lang=EN-US>)</SPAN><SPAN style="FONT-FAMILY: 宋體">后如圖</SPAN><SPAN
lang=EN-US>2.8</SPAN><SPAN style="FONT-FAMILY: 宋體">所示:</SPAN></P>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD class=Normal vAlign=bottom width=276>
<P class=a style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US><IMG height=86
src="第2章 圖象的幾何變換.files/image022.jpg" width=145 v:shapes="_x0000_i1027">
</SPAN></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><B><SPAN
style="FONT-FAMILY: 宋體">圖</SPAN>2.7 </B><B><SPAN
style="FONT-FAMILY: 宋體">旋轉前的圖</SPAN><SPAN lang=EN-US></SPAN></B></P></TD>
<TD class=Normal vAlign=bottom width=276>
<P class=a style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US><IMG height=147
src="第2章 圖象的幾何變換.files/image023.gif" width=169 v:shapes="_x0000_i1028">
</SPAN></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><B><SPAN
style="FONT-FAMILY: 宋體">圖</SPAN>2.8 </B><B><SPAN
style="FONT-FAMILY: 宋體">旋轉后的圖</SPAN><SPAN
lang=EN-US></SPAN></B></P></TD></TR></TBODY></TABLE>
<P style="LINE-HEIGHT: 18pt"><SPAN
style="FONT-FAMILY: 宋體">可以看出,旋轉后圖象變大了。另一種做法是不讓圖象變大,轉出的部分被裁剪掉。如圖</SPAN><SPAN
lang=EN-US>2.9</SPAN><SPAN style="FONT-FAMILY: 宋體">所示。</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
style="FONT-FAMILY: 宋體">我們采用第一種做法,首先給出變換矩陣。在我們熟悉的坐標系中,將一個點順時針旋轉</SPAN><SPAN
lang=EN-US>a</SPAN><SPAN style="FONT-FAMILY: 宋體">角后的坐標變換公式,如圖</SPAN><SPAN
lang=EN-US>2.10</SPAN><SPAN style="FONT-FAMILY: 宋體">所示,</SPAN><SPAN
lang=EN-US>r</SPAN><SPAN style="FONT-FAMILY: 宋體">為該點到原點的距離,在旋轉過程中,</SPAN><SPAN
lang=EN-US>r</SPAN><SPAN style="FONT-FAMILY: 宋體">保持不變;</SPAN><SPAN
lang=EN-US>b</SPAN><SPAN style="FONT-FAMILY: 宋體">為</SPAN><SPAN
lang=EN-US>r</SPAN><SPAN style="FONT-FAMILY: 宋體">與</SPAN><SPAN
lang=EN-US>x</SPAN><SPAN style="FONT-FAMILY: 宋體">軸之間的夾角。</SPAN></P>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD class=Normal vAlign=bottom width=276>
<P class=a style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US><IMG height=106
src="第2章 圖象的幾何變換.files/image025.jpg" width=138 v:shapes="_x0000_i1029">
</SPAN></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><B><SPAN
style="FONT-FAMILY: 宋體">圖</SPAN><SPAN lang=EN-US>2.9 </SPAN></B><B><SPAN
style="FONT-FAMILY: 宋體">旋轉后保持原圖大小,</SPAN><SPAN lang=EN-US></SPAN></B></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><B><SPAN
style="FONT-FAMILY: 宋體">轉出的部分被裁掉</SPAN></B></P></TD>
<TD class=Normal vAlign=bottom width=276>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US><IMG height=208
src="第2章 圖象的幾何變換.files/image027.jpg" width=235 v:shapes="_x0000_i1030">
</SPAN></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><B><SPAN
style="FONT-FAMILY: 宋體">圖</SPAN>2.10 </B><B><SPAN
style="FONT-FAMILY: 宋體">旋轉示意圖</SPAN><SPAN
lang=EN-US></SPAN></B></P></TD></TR></TBODY></TABLE>
<P style="LINE-HEIGHT: 18pt"><SPAN style="FONT-FAMILY: 宋體">旋轉前:</SPAN><SPAN
lang=EN-US>x<SUB>0</SUB>=rcosb</SPAN><SPAN style="FONT-FAMILY: 宋體">;</SPAN><SPAN
lang=EN-US>y<SUB>0</SUB>=rsinb</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN style="FONT-FAMILY: 宋體">旋轉</SPAN><SPAN
lang=EN-US>a</SPAN><SPAN style="FONT-FAMILY: 宋體">角度后:</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
lang=EN-US>x<SUB>1</SUB>=rcos(b-a)=rcosbcosa+rsinbsina=x<SUB>0</SUB>cosa+y<SUB>0</SUB>sina</SPAN><SPAN
style="FONT-FAMILY: 宋體">;</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
lang=EN-US>y<SUB>1</SUB>=rsin(b-a)=rsinbcosa-rcosbsina=-x<SUB>0</SUB>sina+y<SUB>0</SUB>cosa</SPAN><SPAN
style="FONT-FAMILY: 宋體">;</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN style="FONT-FAMILY: 宋體">以矩陣的形式表示:</SPAN></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><SPAN
lang=EN-US><SUB><IMG height=75 src="第2章 圖象的幾何變換.files/image029.gif" width=292
v:shapes="_x0000_i1031"> </SUB></SPAN></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: right" align=right><SPAN
lang=EN-US>(2.5)</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
style="FONT-FAMILY: 宋體">上面的公式中,坐標系</SPAN><SPAN lang=EN-US>xoy</SPAN><SPAN
style="FONT-FAMILY: 宋體">是以圖象的中心為原點,向右為</SPAN><SPAN lang=EN-US>x</SPAN><SPAN
style="FONT-FAMILY: 宋體">軸正方向,向上為</SPAN><SPAN lang=EN-US>y</SPAN><SPAN
style="FONT-FAMILY: 宋體">軸正方向。它和以圖象左上角點為原點</SPAN><SPAN lang=EN-US>o’</SPAN><SPAN
style="FONT-FAMILY: 宋體">,向右為</SPAN><SPAN lang=EN-US>x’</SPAN><SPAN
style="FONT-FAMILY: 宋體">軸正方向,向下為</SPAN><SPAN lang=EN-US>y’</SPAN><SPAN
style="FONT-FAMILY: 宋體">軸正方向的坐標系</SPAN><SPAN lang=EN-US>x’o’y’</SPAN><SPAN
style="FONT-FAMILY: 宋體">之間的轉換關系如何呢?如圖</SPAN><SPAN lang=EN-US>2.11</SPAN><SPAN
style="FONT-FAMILY: 宋體">所示。</SPAN></P>
<P class=a style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US><IMG height=160
src="第2章 圖象的幾何變換.files/image031.jpg" width=207 v:shapes="_x0000_i1032">
</SPAN></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><B><SPAN
style="FONT-FAMILY: 宋體">圖</SPAN>2.11 </B><B><SPAN
style="FONT-FAMILY: 宋體">兩種坐標系間的轉換關系</SPAN><SPAN lang=EN-US></SPAN></B></P>
<P style="LINE-HEIGHT: 18pt"><SPAN style="FONT-FAMILY: 宋體">設圖象的寬為</SPAN><SPAN
lang=EN-US>w</SPAN><SPAN style="FONT-FAMILY: 宋體">,高為</SPAN><SPAN
lang=EN-US>h</SPAN><SPAN style="FONT-FAMILY: 宋體">,容易得到:</SPAN></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><SPAN
lang=EN-US><SUB><IMG height=75 src="第2章 圖象的幾何變換.files/image033.gif" width=296
v:shapes="_x0000_i1033"> </SUB></SPAN></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: right" align=right><SPAN
lang=EN-US>(2.6)</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN style="FONT-FAMILY: 宋體">逆變換為:</SPAN></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><SPAN
lang=EN-US><SUB><IMG height=75 src="第2章 圖象的幾何變換.files/image035.gif" width=284
v:shapes="_x0000_i1034"> </SUB></SPAN></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: right" align=right><SPAN
lang=EN-US>(2.7)</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
style="FONT-FAMILY: 宋體">有了上面的公式,我們可以把變換分成三步:</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>1.</SPAN><SPAN
style="FONT-FAMILY: 宋體">將坐標系</SPAN><SPAN lang=EN-US>o’</SPAN><SPAN
style="FONT-FAMILY: 宋體">變成</SPAN><SPAN lang=EN-US>o</SPAN><SPAN
style="FONT-FAMILY: 宋體">;</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>2.</SPAN><SPAN
style="FONT-FAMILY: 宋體">將該點順時針旋轉</SPAN><SPAN lang=EN-US>a</SPAN><SPAN
style="FONT-FAMILY: 宋體">角;</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>3.</SPAN><SPAN
style="FONT-FAMILY: 宋體">將坐標系</SPAN><SPAN lang=EN-US>o</SPAN><SPAN
style="FONT-FAMILY: 宋體">變回</SPAN><SPAN lang=EN-US>o’</SPAN><SPAN
style="FONT-FAMILY: 宋體">,這樣,我們就得到了變換矩陣,是上面三個矩陣的級聯。</SPAN></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><SPAN
lang=EN-US><SUB><IMG height=125 src="第2章 圖象的幾何變換.files/image037.gif" width=529
v:shapes="_x0000_i1040"> </SUB></SPAN></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: right" align=right><SPAN
lang=EN-US>(2.8)</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
style="FONT-FAMILY: 宋體">要注意的是,因為新圖變大,所以上面公式中出現了</SPAN><SPAN
lang=EN-US>w<SUB>old</SUB></SPAN><SPAN style="FONT-FAMILY: 宋體">,</SPAN><SPAN
lang=EN-US>h<SUB>old</SUB></SPAN><SPAN style="FONT-FAMILY: 宋體">,</SPAN><SPAN
lang=EN-US>w<SUB>new</SUB></SPAN><SPAN style="FONT-FAMILY: 宋體">,</SPAN><SPAN
lang=EN-US>h<SUB>new</SUB></SPAN><SPAN
style="FONT-FAMILY: 宋體">,它們分別表示原圖</SPAN><SPAN lang=EN-US>(old)</SPAN><SPAN
style="FONT-FAMILY: 宋體">和新圖</SPAN><SPAN lang=EN-US>(new)</SPAN><SPAN
style="FONT-FAMILY: 宋體">的寬、高。我們從圖</SPAN><SPAN lang=EN-US>2.8</SPAN><SPAN
style="FONT-FAMILY: 宋體">中容易看出:</SPAN><SPAN
lang=EN-US>w<SUB>new</SUB>=max(|x<SUB>4</SUB>-x<SUB>1</SUB>|,|x<SUB>3</SUB>-x<SUB>2</SUB>|)
</SPAN><SPAN style="FONT-FAMILY: 宋體">;</SPAN><SPAN
lang=EN-US>h<SUB>new</SUB>=max(|y<SUB>4</SUB>-y<SUB>1</SUB>|,|y<SUB>3</SUB>-y<SUB>2</SUB>|)</SPAN><SPAN
style="FONT-FAMILY: 宋體">。</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>(2.8)</SPAN><SPAN
style="FONT-FAMILY: 宋體">的逆變換為</SPAN></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><SPAN
lang=EN-US><SUB><IMG height=125 src="第2章 圖象的幾何變換.files/image039.gif" width=526
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -