计算机图形学作业

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《计算机图形学》实验报告

专业:

班级:1002

学号:

姓名:

完成日期:2012.10.20

1.实验目的

(1) 掌握二维平移、比例、旋转几何变换矩阵。

(2)掌握矩阵乘法的编程实现。

(3)掌握相对于任意参考点的比例变换和旋转变换。

(4)掌握定时器的使用方法。

2.实验要求

(1)设计包含齐次坐标的二维点类CP2。

(2)设计二维几何变换类。平移变换矩阵,比例变换矩阵和旋转变换矩阵。

(3)设计双缓冲技术。

(4)生成正多边形顶点。

(5)绘制几何变换图形。

(6)使用定时器动态更新图形。

(7)平移变换(x,y) ===>(-50,50)之间往复变换。旋转变换绕中心旋转10/帧,比例变换[0.5,2]0.01/帧之间往复变换。

3.程序代码

CTestView::CTestView()

{

// TODO: add construction code here

directionX=1; directionY=1; directionS=1;

R = 30;

translateX=1; translateY=1;

rotate = 1; scale = 1;

}

CTestView::~CTestView()

{

}

void CTestView::DoubleBuffer()

{

int flag=0;

CDC * pDC = GetDC();

CRect rect;

if(scale>2)

directionS=-1;

if(scale<-2)

directionS=1;

GetClientRect(&rect);

pDC->SetMapMode(MM_ANISOTROPIC);

pDC->SetWindowExt(rect.Width(),rect.Height());

pDC->SetViewportExt(rect.Width(),-rect.Height());

pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);

CDC MemDC;

CBitmap NewBitmap,*pOldBitmap;

MemDC.CreateCompatibleDC(pDC);

NewBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height() );

pOldBitmap=MemDC.SelectObject(&NewBitmap);

MemDC.SetMapMode(MM_ANISOTROPIC);

MemDC.SetWindowExt(rect.Width(), rect.Height());

MemDC.SetViewportExt(rect.Width(),-rect.Height());

MemDC.SetViewportOrg(rect.Width()/2,rect.Height()/2);

ReadPoint();

tran.Translate(translateX,translateY);

tran.Rotate(rotate,CP2(translateX,translateY));

tran.Scale(scale,scale,CP2(translateX,translateY));

DrawObject(&MemDC);

BorderCheck();

pDC->BitBlt(-rect.Width()/2,-rect.Height()/2,rect.Width(),rect.Height (),&MemDC,-rect.Width()/2,-rect.Height()/2,SRCCOPY);

MemDC.SelectObject(pOldBitmap);

NewBitmap.DeleteObject();

MemDC.DeleteDC();

ReleaseDC(pDC);

if(P!=NULL)

{

delete []P;

P=NULL;

}

}

void CTestView::ReadPoint()

{

double Dtheta=2*PI/degree;

P=new CP2[degree+1];

//static int x = 0;

// static int y = 0;

for(int i=0;i

{

P[i].x=R*cos(i*Dtheta) ;

P[i].y=R*sin(i*Dtheta) ;

}

P[degree].x = 0;

P[degree].y = 0;

tran.SetMat(P,degree+1);

}

void CTestView::DrawObject(CDC * pDC)

{

// CLine *line=new CLine;

CPen pen(PS_SOLID,1,RGB(255,0,0));

pDC->SelectObject(&pen);

for(int i=0;i

{

pDC->MoveTo( ROUND(P[degree].x),ROUND(P[degree].y));

pDC->LineTo( ROUND(P[i].x),ROUND(P[i].y));

pDC->LineTo(ROUND(P[(i+1)%degree].x),ROUND(P[(i+1)%degre e].y));

}

pen.DeleteObject();

// delete line;

}

void CTestView::OnDraw(CDC* pDC)

{

CTestDoc* pDoc = GetDocument();

ASSERT_V ALID(pDoc);

// TODO: add draw code for native data here

SetTimer(1,100,NULL);

}

BOOL CTestView::OnPreparePrinting(CPrintInfo* pInfo)

相关文档
最新文档