计算机图形学作业
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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)