2024年2月19日发(作者:)

计算机图形学实验报告

实验4二维图形几何变换

一 实验目的

1)掌握3*3矩阵乘法运算的编程实现:

2)掌握平移、比例、旋转三种基本二维几何变换矩阵生成:

3)掌握相对于任意参考点的二维复合变换矩阵生成。

二 实验要求

1)设计实现二维图形变换类,具有平移、比例、旋转二维几何变换功能,以及相对于任意参考点的二维复合变换功能;

2)将2.2节直线类所绘制的如图2-3所示的菱形线框,绕最上端A点匀速旋转,并要求相对于A点来回缩放。

3)使用双缓冲机制进行图形绘制,避免运动闪烁,所有图形先绘制到用户自定的DC,绘制完成后再统一拷贝到屏幕DC。

三 实验步骤

第1步:打开2.2节(实验2)工程文件

直接使用2.2节(实验2)的MFC项目工程,及其中的直线类CLine.

第2步:二维点类CP2添加齐次坐标

在“Line.h/cpp”文件中的二维点类CP2的相关代码中添加齐次坐标,修改后的CP2类代码如下(带底纹部分为添加的代码)。

“Line.h”中相关代码

class CP2

{

public:

CP2();

virtual~CP2();

CP2(double,double);

public:

double x;

double y;

double w;

};

class CLine

{

public:

CLine();

virtual~CLine();

void SetLineColor(COLORREF);

void MoveTo(CP2);

void MoveTo(double,double);

void LineTo(CP2, CDC*);

void LineTo(double,double, CDC*);

public:

CP2 P0;

CP2 P1;

COLORREF clr;

};

=====================================================================

#include "stdafx.h"

#include "Line.h"

#include "math.h"

#define Round(d) int (floor(d+0.5))

CP2::CP2()

{

x=0.0;

y=0.0;

w=1.0;

}

CP2::~CP2()

{}

CP2::CP2( double x,double y)

{

this->x =x;

this->y =y;

this->w =1;

}

CLine::CLine ()

{}

CLine::~CLine ()

{}

void CLine::SetLineColor (COLORREF color)

{

clr=color;

}

void CLine::MoveTo(CP2 p0)

{

P0=p0;

}

void CLine::MoveTo(double x,double y)

{

P0.x =x;

P0.y =y;

}

void CLine::LineTo(double x,double y, CDC*pDC)

{

CP2 p;

p.x =x;

p.y =y;

LineTo(p, pDC);

}

void CLine::LineTo(CP2 p1, CDC*pDC)

{

P1=p1;

CP2 p,t;

if(fabs(P0.x-P1.x)<1e-6)

{

if (P0.y>P1.y)

{

t=P0;P0=P1;P1=t;

}

for (p=P0;p.y

{

pDC->SetPixelV (Round(p.x ),Round(p.y ),clr);

}

}

else

{

double k,d;

k=(P1.y-P0.y)/(P1.x-P0.x);

if (k>1.0)

{

if (P0.y>P1.y)

{

t=P0;P0=P1;P1=t;

}

d=1-0.5*k;

for (p=P0;p.y

{

pDC->SetPixelV (Round(p.x ),Round(p.y ),clr);

if (d>=0)

{

p.x ++;

d+=1-k;

}

else

d+=1;

}

}

if (0.0<=k&&k<=1.0)

{

if (P0.x>P1.x)

{

t=P0;P0=P1;P1=t;

}

d=0.5-k;

for (p=P0;p.x

{

pDC->SetPixelV (Round(p.x ),Round(p.y ),clr);

if (d<0)

{

p.y++;

d+=1-k;

}

else

d-=k;

}

}

if (k>=-1.0&&k<0.0)

{

}

if (P0.x >P1.x )

{

t=P0;P0=P1;P1=t;

}

d=-0.5-k;

for ( p=P0;p.x

{

pDC->SetPixelV (Round(p.x ),Round(p.y ),clr);

if(d>0)

{

p.y --;

d-=1+k;

}

else

d-=k;

}

}

if(k<-1.0)

{

if (P0.y

{

t=P0;P0=P1;P1=t;

}

d=-1-0.5*k;

for ( p=P0;p.y >P1.y ;p.y--)

{

pDC->SetPixelV (Round(p.x ),Round(p.y ),clr);

if(d<0)

{

p.x ++;

d-=1+k;

}

else

d-=1;

}

}

}

P0=p1;

第3步

(1) 二维图形几何变换矩阵

➢平移变换矩阵:

1T1=

0