-图形学实验报告-二维基本变换

更新时间:2023-09-16 20:37:01 阅读量: 高中教育 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

一、 实验目的和要求

利用VC6.0编写二维基本几何变换算法的实现。实现平移,比例,旋转等变换。

二、 算法原理介绍

齐次坐标表示法就是用N+1维向量来表示一个N维向量。在齐次坐标系统中,点(X,Y)用(X,Y,H)来表达,其中H为非零的一个任意数。点(X,Y)的标准齐次坐标表达为(X/H,Y/H,1),由于H是一个任意非零常量,为了简便起见,我们通常取H=1。齐次坐标系统中的点(X,Y,1)包含有笛卡尔坐标上的点(X,Y)。 平移变换:

比例变换:

?Sx?0???0

旋转变换:

0Sy00?0??1??

对称变换:

关于x轴对称:

?100??0?10?????001??

关于y轴对称:

??100??010?????001??

关于原点对称:

??100??0?10?????001??关于y=x对称:

?010??100?????001??

关于y=-x对称:

?0?10???100?????001??

错切变换:

?1b0??c10?????001??

当b=0时: (x` y` 1)=(x+cy y 1)。图形的y坐标不变。

当c>0:图形沿+x方向作错切位移。ABCD→A1B1C1D1 当c<0:图形沿-x方向作错切位移。ABCD→ A2B2C2D2 当c=0时, (x` y` 1)=(x bx+y 1):图形的x坐标不变。 当b>0:图形沿+y方向作错切位移。ABCD→ A1B1C1D1 当b<0:图形沿-y方向作错切位移。ABCD→ A2B2C2D2 当b不等于0且c不等于0时,

(x` y` 1)=(x+cy bx+y 1) :图形沿x,y两个方向作错切位移。 ∴错切变换引起图形角度关系的改变,甚至导致图形发生变形。

三、 程序核心源代码

void CChangeView::Tmove(double Tx,double Ty) //平移变换矩阵 { ClearMatrix(TM); RedrawWindow(); TM[0][0]=1; TM[1][1]=1; TM[2][0]=Tx; TM[2][1]=Ty; TM[2][2]=1;

}

Calculate(P,TM);

AfxGetMainWnd()->SetWindowText(\二维几何变换-平移变换\Draw(P,p3);

void CChangeView::Tscale(double Sx,double Sy) //比例变换矩阵 { ClearMatrix(TS); RedrawWindow(); TS[0][0]=Sx; TS[1][1]=Sy; TS[2][2]=1; Calculate(P,TS); AfxGetMainWnd()->SetWindowText(\二维几何变换-比例变换\ Draw(P,p3); }

void CChangeView::Trotate(double thta)//旋转变换矩阵 { ClearMatrix(TR); RedrawWindow(); TR[0][0]=cos(thta*PI/180); TR[0][1]=sin(thta*PI/180); TR[1][0]=-sin(thta*PI/180); TR[1][1]=cos(thta*PI/180); TR[2][2]=1; Calculate(P,TR); AfxGetMainWnd()->SetWindowText(\二维几何变换-旋转变换\ Draw(P,p3); }

void CChangeView::Treflect(double Fx,double Fy) //反射变换矩阵 { ClearMatrix(TF); RedrawWindow(); TF[0][0]=Fx; TF[1][1]=Fy; TF[2][2]=1; Calculate(P,TF); AfxGetMainWnd()->SetWindowText(\二维几何变换-反射变换\ Draw(P,p3); }

void CChangeView::Treform(double b,double c) //错切变换矩阵 { ClearMatrix(TC); RedrawWindow(); TC[0][0]=1; TC[0][1]=b; TC[1][0]=c; TC[1][1]=1; TC[2][2]=1; Calculate(P,TC); AfxGetMainWnd()->SetWindowText(\二维几何变换-错切变换\ Draw(P,p3); }

void CChangeView::OnMENUup() { // TODO: Add your command handler code here Tmove(0,10); }

void CChangeView::OnMENUdown() { // TODO: Add your command handler code here Tmove(0,-10); }

void CChangeView::OnMENUleft() { // TODO: Add your command handler code here Tmove(-10,0); }

void CChangeView::OnMENUright() { // TODO: Add your command handler code here Tmove(10,0); }

void CChangeView::OnMENUClockwise() //顺时针旋转 { // TODO: Add your command handler code here Trotate(-30); }

void CChangeView::OnMENUAnticlockwise() //逆时针旋转 { // TODO: Add your command handler code here Trotate(30); }

void CChangeView::OnMENUIncrease() { // TODO: Add your command handler code here Tscale(2,2); }

void CChangeView::OnMENUDecrease() {

// TODO: Add your command handler code here Tscale(0.5,0.5); }

void CChangeView::OnMENUY() { // TODO: Add your command handler code here Treflect(-1,1); }

void CChangeView::OnMENUO() { // TODO: Add your command handler code here Treflect(-1,-1); }

void CChangeView::OnMENUX() { // TODO: Add your command handler code here Treflect(1,-1); }

void CChangeView::OnMENUXdirectionplus() { // TODO: Add your command handler code here Treform(0,1); }

void CChangeView::OnOnMENUXdirectionneg() { // TODO: Add your command handler code here Treform(0,-1); }

void CChangeView::OnMENUITYdirectionplus() { // TODO: Add your command handler code here Treform(1,0); }

void CChangeView::OnMENUYdirectionneg() { // TODO: Add your command handler code here Treform(-1,0);

本文来源:https://www.bwwdw.com/article/apxh.html

Top