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


发布评论