图形学实验报告2
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
for(i=1; i<3; i++)
{
Pt[i].x *= 0.5;
Pt[i].y *= 0.5;
}
Pt[0] = TmpPt;
Pt[1] = Pt[1] + Pt[0];
Pt[2] = Pt[2] + Pt[0];
break;
case 0X58://X的ASCII码
Pt[1] = Pt[1] - Pt[0];
// CTransformView construction/destruction
CTransformView::CTransformView()
{
// TODO:பைடு நூலகம்add construction code here
Pt[0].x = 200; Pt[0].y = 220;
Pt[1].x = 260; Pt[1].y = 300;
实验二 图形变换与裁减
一、实验目的:
1、通过本次实验掌握二维图形和三维图形的基本变换算法,及变换矩阵的求法。
2、掌握三维图形的投影方法。
3、使用Cohen-Sutherland算法裁减二维线段或使用Sutherland-Hodgman算法对多边形进行裁减,验证算法的正确性。
二、实验内容:
(必做)1、编写一个通用的子程序(如:类或多个函数),其功能可以完成基本二维图形变换(平移、旋转、变比、反射)。通过调用此子程序,实现下列变换:(1)将一平行四边形做平移变换;(2)将平行四边形以原点为中心,以10o为间隔做360o旋转;(3)将一三角形在x和y方向均缩小为原来一半。绘制各种基本图形可以使用系统函数。
Pt[2] = Pt[2] - Pt[0];
Pt[0].x = Pt[0].y = 0;
for(i=1; i<3; i++)
{
Pt[i].x *= 2.0;
Pt[i].y *= 2.0;
}
Pt[0] = TmpPt;
Pt[1] = Pt[1] + Pt[0];
Pt[2] = Pt[2] + Pt[0];
ON_COMMAND(ID_MENU_TRANSFORM_ROTATE, OnMenuTransformRotate)
ON_WM_KEYDOWN()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
(必做)2、绘制立方体的平行投影效果图和一点透视效果图。在程序中给出立方体的顶点坐标。视点方向为从z轴正方向看原点,视线平行于z轴。投影面为XOY平面,投影中心位于z轴负轴某点,当改变投影中心位置时,查看一点透视效果的变化。绘制各种基本图形可以使用系统函数。
(选做)3、用Cohen-Sutherland算法裁剪二维线段或用Sutherland-Hodgman算法裁剪多边形。要求:输入裁减窗口的四条边坐标,对于Cohen-Sutherland算法裁剪二维线段要输入线段的起点与终点x,y坐标,对于Sutherland-Hodgman算法裁剪多边形要输入多边形的顶点数及各顶点x,y坐标。禁止使用裁减的系统函数。
break;
case 0X52 : //R的ASCII码
dAngle = -1.0;
float dRadiusAngle = dAngle * PI /180.0;
// CTransformView diagnostics
#ifdef _DEBUG
void CTransformView::AssertValid() const
{
CView::AssertValid();
}
void CTransformView::Dump(CDumpContext& dc) const
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
{
CView::Dump(dc);
}
CTransformDoc* CTransformView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTransformDoc)));
{
Pt[i].x = Pt[i].x * cos(dRadiusAngle) - Pt[i].y * sin(dRadiusAngle);
Pt[i].y = Pt[i].x * sin(dRadiusAngle) + Pt[i].y * cos(dRadiusAngle);
}
RedrawWindow();
switch (nChar){
case VK_UP://上
for(i=0; i<3; i++)
{
Pt[i].y -= 5;
}
break;
case VK_DOWN://下
for(i=0; i<3; i++)
{
Pt[i].y += 5;
}
break;
case VK_LEFT://左
for(i=0; i<3; i++)
//{{AFX_MSG_MAP(CTransformView)
ON_COMMAND(ID_MENU_TRANSFORM_TRANSLATE, OnMenuTransformTranslate)
ON_COMMAND(ID_MENU_TRANSFORM_SCALE, OnMenuTransformScale)
Pt[2].x = 360; Pt[2].y = 180;
dAngle = 0.0;
}
CTransformView::~CTransformView()
{
}
BOOL CTransformView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
三、实验要求:
实验前须规划程序界面和按钮的相关事件的编写代码。实验时进行代码的调试。
四、实验代码
1,图形的变换
// TransformView.cpp : implementation of the CTransformView class
//
#include "stdafx.h"
#include "Transform.h"
return (CTransformDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CTransformView message handlers
{
// TODO: Add your command handler code here
int nX = 50;
int nY = 80; //平移的X坐标和Y坐标
for(int i=0; i<3; i++)
{
Pt[i].x += nX;
Pt[i].y += nY;
}
RedrawWindow();
}
void CTransformView::OnMenuTransformScale()
void CTransformView::DrawTriangle(CDC *pDC)
{
pDC->MoveTo(Pt[0]);
pDC->LineTo(Pt[1]);
pDC->LineTo(Pt[2]);
pDC->LineTo(Pt[0]);
}
void CTransformView::OnMenuTransformTranslate()
}
#define PI 3.1415926
void CTransformView::OnMenuTransformRotate()
{
// TODO: Add your command handler code here
float dRadiusAngle = 30.0 * PI /180.0;
for(int i=0; i<3; i++)
#endif
/////////////////////////////////////////////////////////////////////////////
// CTransformView
IMPLEMENT_DYNCREATE(CTransformView, CView)
BEGIN_MESSAGE_MAP(CTransformView, CView)
#include "TransformDoc.h"
#include "TransformView.h"
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
}
void CTransformView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
int i=0;
CPoint TmpPt = Pt[0];
}
void CTransformView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CTransformView drawing
void CTransformView::OnDraw(CDC* pDC)
{
CTransformDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
DrawTriangle(pDC);
}
/////////////////////////////////////////////////////////////////////////////
// CTransformView printing
BOOL CTransformView::OnPreparePrinting(CPrintInfo* pInfo)
{
// TODO: Add your command handler code here
float dScaleX = 2.0;
float dScaleY = 0.5;
for(int i=0; i<3; i++)
{
Pt[i].x *= dScaleX;
Pt[i].y *= dScaleY;
}
RedrawWindow();
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CTransformView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
{
Pt[i].x -= 5;
}
break;
case VK_RIGHT://右
for(i=0; i<3; i++)
{
Pt[i].x += 5;
}
break;
case 0X5A://Z的ASCII码
Pt[1] = Pt[1] - Pt[0];
Pt[2] = Pt[2] - Pt[0];
Pt[0].x = Pt[0].y = 0;
{
Pt[i].x *= 0.5;
Pt[i].y *= 0.5;
}
Pt[0] = TmpPt;
Pt[1] = Pt[1] + Pt[0];
Pt[2] = Pt[2] + Pt[0];
break;
case 0X58://X的ASCII码
Pt[1] = Pt[1] - Pt[0];
// CTransformView construction/destruction
CTransformView::CTransformView()
{
// TODO:பைடு நூலகம்add construction code here
Pt[0].x = 200; Pt[0].y = 220;
Pt[1].x = 260; Pt[1].y = 300;
实验二 图形变换与裁减
一、实验目的:
1、通过本次实验掌握二维图形和三维图形的基本变换算法,及变换矩阵的求法。
2、掌握三维图形的投影方法。
3、使用Cohen-Sutherland算法裁减二维线段或使用Sutherland-Hodgman算法对多边形进行裁减,验证算法的正确性。
二、实验内容:
(必做)1、编写一个通用的子程序(如:类或多个函数),其功能可以完成基本二维图形变换(平移、旋转、变比、反射)。通过调用此子程序,实现下列变换:(1)将一平行四边形做平移变换;(2)将平行四边形以原点为中心,以10o为间隔做360o旋转;(3)将一三角形在x和y方向均缩小为原来一半。绘制各种基本图形可以使用系统函数。
Pt[2] = Pt[2] - Pt[0];
Pt[0].x = Pt[0].y = 0;
for(i=1; i<3; i++)
{
Pt[i].x *= 2.0;
Pt[i].y *= 2.0;
}
Pt[0] = TmpPt;
Pt[1] = Pt[1] + Pt[0];
Pt[2] = Pt[2] + Pt[0];
ON_COMMAND(ID_MENU_TRANSFORM_ROTATE, OnMenuTransformRotate)
ON_WM_KEYDOWN()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
(必做)2、绘制立方体的平行投影效果图和一点透视效果图。在程序中给出立方体的顶点坐标。视点方向为从z轴正方向看原点,视线平行于z轴。投影面为XOY平面,投影中心位于z轴负轴某点,当改变投影中心位置时,查看一点透视效果的变化。绘制各种基本图形可以使用系统函数。
(选做)3、用Cohen-Sutherland算法裁剪二维线段或用Sutherland-Hodgman算法裁剪多边形。要求:输入裁减窗口的四条边坐标,对于Cohen-Sutherland算法裁剪二维线段要输入线段的起点与终点x,y坐标,对于Sutherland-Hodgman算法裁剪多边形要输入多边形的顶点数及各顶点x,y坐标。禁止使用裁减的系统函数。
break;
case 0X52 : //R的ASCII码
dAngle = -1.0;
float dRadiusAngle = dAngle * PI /180.0;
// CTransformView diagnostics
#ifdef _DEBUG
void CTransformView::AssertValid() const
{
CView::AssertValid();
}
void CTransformView::Dump(CDumpContext& dc) const
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
{
CView::Dump(dc);
}
CTransformDoc* CTransformView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTransformDoc)));
{
Pt[i].x = Pt[i].x * cos(dRadiusAngle) - Pt[i].y * sin(dRadiusAngle);
Pt[i].y = Pt[i].x * sin(dRadiusAngle) + Pt[i].y * cos(dRadiusAngle);
}
RedrawWindow();
switch (nChar){
case VK_UP://上
for(i=0; i<3; i++)
{
Pt[i].y -= 5;
}
break;
case VK_DOWN://下
for(i=0; i<3; i++)
{
Pt[i].y += 5;
}
break;
case VK_LEFT://左
for(i=0; i<3; i++)
//{{AFX_MSG_MAP(CTransformView)
ON_COMMAND(ID_MENU_TRANSFORM_TRANSLATE, OnMenuTransformTranslate)
ON_COMMAND(ID_MENU_TRANSFORM_SCALE, OnMenuTransformScale)
Pt[2].x = 360; Pt[2].y = 180;
dAngle = 0.0;
}
CTransformView::~CTransformView()
{
}
BOOL CTransformView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
三、实验要求:
实验前须规划程序界面和按钮的相关事件的编写代码。实验时进行代码的调试。
四、实验代码
1,图形的变换
// TransformView.cpp : implementation of the CTransformView class
//
#include "stdafx.h"
#include "Transform.h"
return (CTransformDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CTransformView message handlers
{
// TODO: Add your command handler code here
int nX = 50;
int nY = 80; //平移的X坐标和Y坐标
for(int i=0; i<3; i++)
{
Pt[i].x += nX;
Pt[i].y += nY;
}
RedrawWindow();
}
void CTransformView::OnMenuTransformScale()
void CTransformView::DrawTriangle(CDC *pDC)
{
pDC->MoveTo(Pt[0]);
pDC->LineTo(Pt[1]);
pDC->LineTo(Pt[2]);
pDC->LineTo(Pt[0]);
}
void CTransformView::OnMenuTransformTranslate()
}
#define PI 3.1415926
void CTransformView::OnMenuTransformRotate()
{
// TODO: Add your command handler code here
float dRadiusAngle = 30.0 * PI /180.0;
for(int i=0; i<3; i++)
#endif
/////////////////////////////////////////////////////////////////////////////
// CTransformView
IMPLEMENT_DYNCREATE(CTransformView, CView)
BEGIN_MESSAGE_MAP(CTransformView, CView)
#include "TransformDoc.h"
#include "TransformView.h"
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
}
void CTransformView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
int i=0;
CPoint TmpPt = Pt[0];
}
void CTransformView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CTransformView drawing
void CTransformView::OnDraw(CDC* pDC)
{
CTransformDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
DrawTriangle(pDC);
}
/////////////////////////////////////////////////////////////////////////////
// CTransformView printing
BOOL CTransformView::OnPreparePrinting(CPrintInfo* pInfo)
{
// TODO: Add your command handler code here
float dScaleX = 2.0;
float dScaleY = 0.5;
for(int i=0; i<3; i++)
{
Pt[i].x *= dScaleX;
Pt[i].y *= dScaleY;
}
RedrawWindow();
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CTransformView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
{
Pt[i].x -= 5;
}
break;
case VK_RIGHT://右
for(i=0; i<3; i++)
{
Pt[i].x += 5;
}
break;
case 0X5A://Z的ASCII码
Pt[1] = Pt[1] - Pt[0];
Pt[2] = Pt[2] - Pt[0];
Pt[0].x = Pt[0].y = 0;