当前位置:文档之家› 研究生计算机图形学课程室内场景OpenGL--实验报告

研究生计算机图形学课程室内场景OpenGL--实验报告

研究生计算机图形学课程室内场景OpenGL--实验报告
研究生计算机图形学课程室内场景OpenGL--实验报告

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

姓名:学号:班级:

【实验报告要求】

实验名称:高级计算机图形学室内场景

实验目的:掌握使用OpenGL生成真实感复杂对象的方法,进一步熟练掌握构造实体几何表示法、扫描表示法、八叉树法、BSP树法等建模方法。

实验要求:要求利用OpenGL生成一个真实感的复杂对象及其周围场景,并显示观测点变化时的几何变换,要具备在一个纹理复杂的场景中漫游功能。要求使用到光线跟踪算法、

纹理映射技术以及实时绘制技术。

一、实验效果图

图1:正面效果图

图2:背面效果图

图4:背面效果图

图4:室内场景细节效果图

图5:场景角度转换效果图

二、源文件数据代码:

共6个文件,其实现代码如下:

1、DlgAbout.cpp

#include "StdAfx.h"

#include "DlgAbout.h"

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

END_MESSAGE_MAP()

2、FormCommandView.cpp

#include "stdafx.h"

#include "Tool.h"

#include "MainFrm.h"

#include "FormCommandView.h"

#include "ToolDoc.h"

#include "RenderView.h"

// Download by https://www.doczj.com/doc/139554091.html,

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

// CFormCommandView

IMPLEMENT_DYNCREA TE(CFormCommandView, CFormView)

CFormCommandView::CFormCommandView()

: CFormView(CFormCommandView::IDD)

{

//{{AFX_DATA_INIT(CFormCommandView)

m_Smooth = FALSE;

m_Antialias = FALSE;

//}}AFX_DATA_INIT

}

CFormCommandView::~CFormCommandView()

{

}

void CFormCommandView::DoDataExchange(CDataExchange* pDX)

{

CFormView::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CFormCommandView)

DDX_Control(pDX, IDC_FRAME_COLOR_BACK, m_ControlBackColor);

DDX_Check(pDX, IDC_CHECK_SMOOTH, m_Smooth);

DDX_Check(pDX, IDC_CHECK_ANTIALIAS, m_Antialias);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CFormCommandView, CFormView)

//{{AFX_MSG_MAP(CFormCommandView)

ON_WM_PAINT()

ON_WM_LBUTTONUP()

ON_BN_CLICKED(IDC_RADIO_MODEL_1, OnRadioModel1)

ON_BN_CLICKED(IDC_RADIO_MODEL_2, OnRadioModel2)

ON_BN_CLICKED(IDC_CHECK_SMOOTH, OnCheckSmooth)

ON_BN_CLICKED(IDC_CHECK_ANTIALIAS, OnCheckAntialias)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CFormCommandView diagnostics

#ifdef _DEBUG

void CFormCommandView::AssertV alid() const

{

CFormView::AssertV alid();

}

void CFormCommandView::Dump(CDumpContext& dc) const

{

CFormView::Dump(dc);

}

CToolDoc* CFormCommandView::GetDocument() // non-debug version is inline {

ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CToolDoc)));

return (CToolDoc*)m_pDocument;

}

#endif //_DEBUG

// OnPaint

void CFormCommandView::OnPaint()

{

// Device context for painting

CPaintDC dc(this);

// Options are stored in Application

CToolApp *pApp = (CToolApp *)AfxGetApp();

CRect rect;

// Color back

m_ControlBackColor.GetWindowRect(&rect);

ScreenToClient(&rect);

CBrush BrushBack(pApp->m_OptionColorGlBack);

dc.FillRect(&rect,&BrushBack);

}

// OnLButtonUp

void CFormCommandView::OnLButtonUp(UINT nFlags,

CPoint point)

{

CRect rect;

CToolApp *pApp = (CToolApp *)AfxGetApp();

// Option back color

m_ControlBackColor.GetWindowRect(&rect);

ScreenToClient(&rect);

if(rect.PtInRect(point))

{

CColorDialog dlg(pApp->m_OptionColorGlBack);

if(dlg.DoModal()==IDOK)

{

pApp->m_OptionColorGlBack = dlg.GetColor();

CRenderView *pView = (CRenderView *)GetRenderView();

pView->m_ClearColorRed = (float)GetRValue(pApp->m_OptionColorGlBack) / 255.0f;

pView->m_ClearColorGreen = (float)GetGValue(pApp->m_OptionColorGlBack) / 255.0f;

pView->m_ClearColorBlue = (float)GetBValue(pApp->m_OptionColorGlBack) / 255.0f;

this->InvalidateRect(&rect,FALSE);

pView->InvalidateRect(NULL,FALSE);

}

}

CFormView::OnLButtonUp(nFlags, point);

}

// GetRenderView

CView *CFormCommandView::GetRenderView()

{

CToolApp *pApp = (CToolApp *)AfxGetApp();

CMainFrame *pFrame = (CMainFrame *)pApp->m_pMainWnd;

CView *pView = (CView *)pFrame->m_wndSplitter.GetPane(0,1);

return pView;

}

// Model

void CFormCommandView::OnRadioModel1()

{

glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);

this->GetRenderView()->InvalidateRect(NULL,FALSE);

}

void CFormCommandView::OnRadioModel2()

{

glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);

this->GetRenderView()->InvalidateRect(NULL,FALSE);

}

// OnCheckSmooth

void CFormCommandView::OnCheckSmooth()

{

m_Smooth = !m_Smooth;

if(m_Smooth)

glShadeModel(GL_SMOOTH);

else

glShadeModel(GL_FLAT);

this->GetRenderView()->InvalidateRect(NULL,FALSE);

}

// OnCheckAntialias

// Toggle antialiased lines

void CFormCommandView::OnCheckAntialias()

{

m_Antialias = !m_Antialias;

if(m_Antialias)

{

glEnable(GL_LINE_SMOOTH);

glEnable(GL_BLEND);

glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

glHint(GL_LINE_SMOOTH_HINT,GL_NICEST);

glLineWidth(1.5f);

}

else

{

glDisable(GL_LINE_SMOOTH);

glDisable(GL_BLEND);

glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

glHint(GL_LINE_SMOOTH_HINT,GL_NICEST);

glLineWidth(1.0f);

}

GetRenderView()->InvalidateRect(NULL,FALSE);

}

3、MainFrm.cpp

#include "stdafx.h"

#include "Tool.h"

// Download by https://www.doczj.com/doc/139554091.html,

#include "MainFrm.h"

#include "FormCommandView.h"

#include "RenderView.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

// CMainFrame

IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame)

ON_WM_CREATE()

ON_WM_PAINT()

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

static UINT indicators[] =

{

ID_SEPARATOR, // status line indicator

ID_INDICATOR_CAPS,

ID_INDICATOR_NUM,

ID_INDICATOR_SCRL,

};

// CMainFrame construction/destruction CMainFrame::CMainFrame()

{

}

CMainFrame::~CMainFrame()

{

}

int CMainFrame::OnCreate(LPCREA TESTRUCT lpCreateStruct)

{

if (CFrameWnd::OnCreate(lpCreateStruct) == -1)

return -1;

if (!m_wndToolBar.Create(this) ||

!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) {

TRACE0("Failed to create toolbar\n");

return -1; // fail to create

}

if (!m_wndStatusBar.Create(this) ||

!m_wndStatusBar.SetIndicators(indicators,

sizeof(indicators)/sizeof(UINT)))

{

TRACE0("Failed to create status bar\n");

return -1; // fail to create

}

m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |

CBRS_TOOL TIPS | CBRS_FL YBY | CBRS_SIZE_DYNAMIC);

return 0;

}

BOOL CMainFrame::PreCreateWindow(CREA TESTRUCT& cs)

{

cs.cx = 600; cs.cy = 500;

return CFrameWnd::PreCreateWindow(cs);

}

// CMainFrame diagnostics

#ifdef _DEBUG

void CMainFrame::AssertV alid() const

{

CFrameWnd::AssertValid();

}

void CMainFrame::Dump(CDumpContext& dc) const

{

CFrameWnd::Dump(dc);

}

#endif //_DEBUG

// CMainFrame message handlers

void CMainFrame::OnPaint()

{

CPaintDC dc(this); // device context for painting

}

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) {

if (!m_wndSplitter.CreateStatic(this, 1, 2,WS_CHILD | WS_VISIBLE))

{

TRACE("Failed to CreateStaticSplitter\n");

return FALSE;

}

// First splitter pane

if (!m_wndSplitter.CreateView(0, 0,

RUNTIME_CLASS(CRenderView), CSize(600,500), pContext))

{

TRACE("Failed to create command view pane\n");

return FALSE;

}

if (!m_wndSplitter.CreateView(0, 1,

RUNTIME_CLASS(CFormCommandView), CSize(0,0), pContext)) {

TRACE("Failed to create command view pane\n");

return FALSE;

}

// Second splitter pane

return TRUE;

}

4、RenderView.cpp

#include "stdafx.h"

#include "Tool.h"

#include

#include

#include

#include "ToolDoc.h"

#include "RenderView.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

extern void Render(void);

// This is the holding space for the landscape colours.

int WinWidth, WinHeigth;

unsigned short int comp = 32; // Scale modifier.

unsigned short int temp, texture_mapping = FALSE,

land_fogging = TRUE, flat_shading = TRUE; float angle, Near, ex, ey, ez, cx, cy, cz;

// Initial eye position and vector of sight.

static GLfloat speed = 0;

// The following code for mouse routines was contributed.

// These are used for the motion function.

#define FORW ARD 1

#define UP 2

#define TURNLEFT 3

#define LOOKUP 5

// Mouse position and button.

int oldmx = 0, oldmy = 0, mb;

// CRenderView

IMPLEMENT_DYNCREA TE(CRenderView, CView)

BEGIN_MESSAGE_MAP(CRenderView, CView)

//{{AFX_MSG_MAP(CRenderView)

ON_WM_DESTROY()

ON_WM_SIZE()

ON_WM_LBUTTONDOWN()

ON_WM_LBUTTONUP()

ON_WM_MOUSEMOVE()

ON_WM_PAINT()

ON_WM_CREATE()

//}}AFX_MSG_MAP

// Standard printing commands

ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) END_MESSAGE_MAP()

// CRenderView construction/destruction

CRenderView::CRenderView()

{

// OpenGL

m_hGLContext = NULL;

m_GLPixelIndex = 0;

// Mouse

m_LeftButtonDown = FALSE;

m_RightButtonDown = FALSE;

m_CursorRotation = AfxGetApp()->LoadCursor(IDC_CURSOR_ROTATION);

// Colors

CToolApp *pApp = (CToolApp *)AfxGetApp();

m_ClearColorRed = GetRV alue(pApp->m_OptionColorGlBack);

m_ClearColorGreen = GetGV alue(pApp->m_OptionColorGlBack);

m_ClearColorBlue = GetBV alue(pApp->m_OptionColorGlBack);

ReadData();

WinWidth=1000;

WinHeigth=800;

LoadAllTexture();

InitLookAt();

}

//============================================

// InitGeometry

//============================================ void CRenderView::InitGeometry(void)

{

GLfloat fogColor[4] = {0.75, 0.75, 1.0, 1.0};

speed = 0;

srand(224);

srand((unsigned)time(NULL));

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

glEnable(GL_DEPTH_TEST);

glShadeModel(GL_FLAT);

glFogi(GL_FOG_MODE, GL_LINEAR);

glFogfv(GL_FOG_COLOR, fogColor);

glFogf(GL_FOG_DENSITY, 0.8f);

glFogf(GL_FOG_START, 400.0f);

glFogf(GL_FOG_END, 500.0f);

glClearColor(0.75f, 0.75f, 1.0f, 1.0f);

}

CRenderView::~CRenderView()

{

FreeAllTexture();

freelist();

}

BOOL CRenderView::PreCreateWindow(CREA TESTRUCT& cs) {

return CView::PreCreateWindow(cs);

// CRenderView drawing

void CRenderView::OnDraw(CDC* pDC)

{

}

BOOL CRenderView::OnPreparePrinting(CPrintInfo* pInfo)

{

return DoPreparePrinting(pInfo);

}

void CRenderView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) {

}

void CRenderView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) {

}

// CRenderView diagnostics

#ifdef _DEBUG

void CRenderView::AssertV alid() const

{

CView::AssertValid();

}

void CRenderView::Dump(CDumpContext& dc) const

{

CView::Dump(dc);

}

CToolDoc* CRenderView::GetDocument() // non-debug version is inline {

if (m_pDocument){

ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CToolDoc)));

return (CToolDoc*)m_pDocument;

}

else return NULL;

#endif //_DEBUG

// Create OpenGL rendering context

int CRenderView::OnCreate(LPCREA TESTRUCT lpCreateStruct) {

if (CView::OnCreate(lpCreateStruct) == -1)

return -1;

HWND hWnd = GetSafeHwnd();

HDC hDC = ::GetDC(hWnd);

if(SetWindowPixelFormat(hDC)==FALSE)

return 0;

if(CreateViewGLContext(hDC)==FALSE)

return 0;

// Default mode

glPolygonMode(GL_FRONT,GL_FILL);

glPolygonMode(GL_BACK,GL_FILL);

glShadeModel(GL_FLAT);

// light must be disabled

// while rendering the terrain

// because it has no normal definition

InitGeometry();

glEnable(GL_TEXTURE_2D);

glDisable(GL_LIGHTING);

return 0;

}

BOOL CRenderView::SetWindowPixelFormat(HDC hDC)

{

PIXELFORMA TDESCRIPTOR pixelDesc;

pixelDesc.nSize = sizeof(PIXELFORMA TDESCRIPTOR); pixelDesc.nVersion = 1;

pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER | PFD_STEREO_DONTCARE;

pixelDesc.iPixelType = PFD_TYPE_RGBA;

https://www.doczj.com/doc/139554091.html,olorBits = 32;

pixelDesc.cRedBits = 8;

pixelDesc.cRedShift = 16;

pixelDesc.cGreenBits = 8;

pixelDesc.cGreenShift = 8;

pixelDesc.cBlueBits = 8;

pixelDesc.cBlueShift = 0;

pixelDesc.cAlphaBits = 0;

pixelDesc.cAlphaShift = 0;

pixelDesc.cAccumBits = 64;

pixelDesc.cAccumRedBits = 16;

pixelDesc.cAccumGreenBits = 16;

pixelDesc.cAccumBlueBits = 16;

pixelDesc.cAccumAlphaBits = 0;

pixelDesc.cDepthBits = 32;

pixelDesc.cStencilBits = 8;

pixelDesc.cAuxBuffers = 0;

pixelDesc.iLayerType = PFD_MAIN_PLANE;

pixelDesc.bReserved = 0;

pixelDesc.dwLayerMask = 0;

pixelDesc.dwVisibleMask = 0;

pixelDesc.dwDamageMask = 0;

m_GLPixelIndex = ChoosePixelFormat(hDC,&pixelDesc);

if(m_GLPixelIndex == 0) // Choose default

{

m_GLPixelIndex = 1;

if(DescribePixelFormat(hDC,m_GLPixelIndex,

sizeof(PIXELFORMA TDESCRIPTOR),&pixelDesc)==0)

return FALSE;

}

if(!SetPixelFormat(hDC,m_GLPixelIndex,&pixelDesc))

return FALSE;

return TRUE;

}

// Create an OpenGL rendering context

BOOL CRenderView::CreateViewGLContext(HDC hDC)

{

m_hGLContext = wglCreateContext(hDC);

if(m_hGLContext==NULL)

return FALSE;

if(wglMakeCurrent(hDC,m_hGLContext)==FALSE)

return FALSE;

return TRUE;

}

// Cleanup every OpenGL rendering context

void CRenderView::OnDestroy()

{

if(wglGetCurrentContext() != NULL)

wglMakeCurrent(NULL,NULL);

if(m_hGLContext != NULL)

{

wglDeleteContext(m_hGLContext);

m_hGLContext = NULL;

}

CView::OnDestroy();

}

void CRenderView::OnSize(UINT nType, int cx, int cy)

{

CView::OnSize(nType, cx, cy);

// Set OpenGL perspective, viewport and mode

CSize size(cx,cy);

double aspect;

aspect = (cy == 0) ? (double)size.cx : (double)size.cx/(double)size.cy;

glViewport(0, 0, (GLsizei) cx, (GLsizei) cy);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluPerspective(60.0, (GLfloat) cx/(GLfloat) cy, 1.0f, 500.0f);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

gluLookAt (ex, ey, ez, cx, cy, cz, 0.0f, 1.0f, 0.0f);

}

void CRenderView::OnLButtonDown(UINT nFlags, CPoint point) {

m_LeftButtonDown = TRUE;

m_LeftDownPos = point;

CView::OnLButtonDown(nFlags, point);

}

void CRenderView::OnLButtonUp(UINT nFlags,

CPoint point)

{

m_LeftButtonDown = FALSE;

CView::OnLButtonUp(nFlags, point);

}

void CRenderView::OnMouseMove(UINT nFlags, CPoint point) {

switch(nFlags){

case(MK_LBUTTON):

MoveEye(FORW ARD,(GLfloat)(oldmy-point.y)/5.0f,1);

break;

case(MK_RBUTTON):

MoveEye(TURNLEFT, (GLfloat)(oldmx-point.x), 1);

break;

}

oldmy = point.y;

oldmx = point.x;

Invalidate(FALSE);

CView::OnMouseMove(nFlags, point);

void CRenderView::OnPaint()

{

// Device context for painting

CPaintDC dc(this);

// Useful in singledoc templates

HWND hWnd = GetSafeHwnd();

HDC hDC = ::GetDC(hWnd);

wglMakeCurrent(hDC,m_hGLContext);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(m_ClearColorRed,m_ClearColorGreen,m_ClearColorBlue,1.0f); glPushMatrix();

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); InitRenderWin();

Render();

// Double buffers

SwapBuffers(hDC);

}

// Function that moves the eye or turns the angle of sight.

// Updates scene if update != 0.

void CRenderView::MoveEye(int type, GLfloat amount, int update)

{

GLfloat a;

switch(type){

case FORW ARD:

a = sqrt((cx-ex)*(cx-ex)+(cz-ez)*(cz-ez));

ex = (amount*(cx-ex)+a*ex) / a;

ez = (amount*(cz-ez)+a*ez) / a;

cx = (amount*(cx-ex)+a*cx) / a;

cz = (amount*(cz-ez)+a*cz) / a;

break;

case TURNLEFT:

cx = (cx-ex)*(float)cos(amount/360.0f) + (cz-ez)*(float)sin(amount/360.0f)+ex;

cz = (cz-ez)*(float)cos(amount/360.0f) - (cx-ex)*(float)sin(amount/360.0f)+ez;

计算机图形学实验报告

《计算机图形学》实验报告姓名:郭子玉 学号:2012211632 班级:计算机12-2班 实验地点:逸夫楼507 实验时间:15.04.10 15.04.17

实验一 1 实验目的和要求 理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析实验数据的能力; 编程实现DDA 算法、Bresenham 中点算法;对于给定起点和终点的直线,分别调用DDA 算法和Bresenham 中点算法进行批量绘制,并记录两种算法的绘制时间;利用excel 等数据分析软件,将试验结果编制成表格,并绘制折线图比较两种算法的性能。 2 实验环境和工具 开发环境:Visual C++ 6.0 实验平台:Experiment_Frame_One (自制平台) 3 实验结果 3.1 程序流程图 (1)DDA 算法 是 否 否 是 是 开始 计算k ,b K<=1 x=x+1;y=y+k; 绘点 x<=X1 y<=Y1 绘点 y=y+1;x=x+1/k; 结束

(2)Mid_Bresenham 算法 是 否 否 是 是 是 否 是 否 开始 计算dx,dy dx>dy D=dx-2*dy 绘点 D<0 y=y+1;D = D + 2*dx - 2*dy; x=x+1; D = D - 2*dy; x=x+1; x

3.2程序代码 //-------------------------算法实现------------------------------// //绘制像素的函数DrawPixel(x, y); (1)DDA算法 void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1) { //----------请实现DDA算法------------// float k, b; float d; k = float(Y1 - Y0)/float(X1 - X0); b = float(X1*Y0 - X0*Y1)/float(X1 - X0); if(fabs(k)<= 1) { if(X0 > X1) { int temp = X0; X0 = X1; X1 = temp; }

研究生计算机图形学课程室内场景OpenGL--实验报告Word版

《高级计算机图形学》实验报告 姓名:学号:班级: 【实验报告要求】 实验名称:高级计算机图形学室内场景 实验目的:掌握使用OpenGL生成真实感复杂对象的方法,进一步熟练掌握构造实体几何表示法、扫描表示法、八叉树法、BSP树法等建模方法。 实验要求:要求利用OpenGL生成一个真实感的复杂对象及其周围场景,并显示观测点变化时的几何变换,要具备在一个纹理复杂的场景中漫游功能。要求使用到光线跟踪算法、 纹理映射技术以及实时绘制技术。 一、实验效果图 图1:正面效果图

图2:背面效果图 图4:背面效果图

图4:室内场景细节效果图 图5:场景角度转换效果图

二、源文件数据代码: 共6个文件,其实现代码如下: 1、DlgAbout.cpp #include "StdAfx.h" #include "DlgAbout.h" CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() 2、FormCommandView.cpp #include "stdafx.h" #include "Tool.h" #include "MainFrm.h" #include "FormCommandView.h" #include "ToolDoc.h" #include "RenderView.h" // Download by https://www.doczj.com/doc/139554091.html, #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // CFormCommandView IMPLEMENT_DYNCREATE(CFormCommandView, CFormView) CFormCommandView::CFormCommandView() : CFormView(CFormCommandView::IDD) { //{{AFX_DATA_INIT(CFormCommandView)

计 算 机 图 形 学 实 验 报 告

实验一:基本图形生成算法演示 一、实验目的与要求 了解OpenGL图形软件包绘制图形的基本过程及其程序框架,并在已有的程序框架中添加代码实现直线和圆的生成算法,演示直线和圆的生成过程,从而加深对直线和圆等基本图形生成算法的理解。 二、实验内容 实验要求:(1)理解glut程序框架 (2)理解窗口到视区的变换 (3)理解OpenGL实现动画的原理 (4)添加代码实现中点Bresenham算法画直线 (5)添加代码实现改进Bresenham算法画直线 (6)添加代码实现圆的绘制(可以适当对框架坐标系进行修改) 实验操作和步骤:本次实验主要的目的是为了掌握基本画线和画圆算法,对于书上给出的代码,要求通过本次试验来具体的实现。由于实验已经给出大体的框架,所以只需要按照书上的算法思想来设计具体实现代码,对于直线DDA算法,中点Bresenham算法及其改进算法,以及Bresenham画圆算法都有进一步的体会。DDA算法是对每一步都要进行增量处理,然后取整,绘制,而Bresenham通过判断误差函数和求取递推公式来实现。特别是对于整数的选择取舍,以及代码的流程和循环的控制有一个深入的了解。同时也熟练运用OpenGL基本的绘图函数。 三、实验结果 1-1. DDA算法画直线。 图1-1-1 ,显示每次DDA算法画线的坐标结果(如上)。

图1-1-2.显示DDA算法画圆过程及截图 1-2. 中点Bresenham算法画直线 1-2-1利用中点Bresenham算法画直线的各点坐标如上: 1-2-2.中点Bresenham画线算法画线过程截图

1-3. 利用改进的Bresenham画线算法来画图 1-3-1.利用改进的Bresenham算法来画图各点坐标如上: 1-3-2.利用改进的Bresenham算法画直线图形如上 1-4.利用Bresenham画圆算法来作图

计算机图形学实验报告 (2)

中南大学信息科学与工程学院 实验报告实验名称 实验地点科技楼四楼 实验日期2014年6月 指导教师 学生班级 学生姓名 学生学号 提交日期2014年6月

实验一Window图形编程基础 一、实验类型:验证型实验 二、实验目的 1、熟练使用实验主要开发平台VC6.0; 2、掌握如何在编译平台下编辑、编译、连接和运行一个简单的Windows图形应用程序; 3、掌握Window图形编程的基本方法; 4、学会使用基本绘图函数和Window GDI对象; 三、实验内容 创建基于MFC的Single Document应用程序(Win32应用程序也可,同学们可根据自己的喜好决定),程序可以实现以下要求: 1、用户可以通过菜单选择绘图颜色; 2、用户点击菜单选择绘图形状时,能在视图中绘制指定形状的图形; 四、实验要求与指导 1、建立名为“颜色”的菜单,该菜单下有四个菜单项:红、绿、蓝、黄。用户通过点击不同的菜单项,可以选择不同的颜色进行绘图。 2、建立名为“绘图”的菜单,该菜单下有三个菜单项:直线、曲线、矩形 其中“曲线”项有级联菜单,包括:圆、椭圆。 3、用户通过点击“绘图”中不同的菜单项,弹出对话框,让用户输入绘图位置,在指定位置进行绘图。

五、实验结果: 六、实验主要代码 1、画直线:CClientDC *m_pDC;再在OnDraw函数里给变量初始化m_pDC=new CClientDC(this); 在OnDraw函数中添加: m_pDC=new CClientDC(this); m_pDC->MoveTo(10,10); m_pDC->LineTo(100,100); m_pDC->SetPixel(100,200,RGB(0,0,0)); m_pDC->TextOut(100,100); 2、画圆: void CMyCG::LineDDA2(int xa, int ya, int xb, int yb, CDC *pDC) { int dx = xb - xa; int dy = yb - ya; int Steps, k; float xIncrement,yIncrement; float x = xa,y= ya; if(abs(dx)>abs(dy))

计算机图形学课程设计书

计算机图形学课程设计 书 文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

课程设计(论文)任务书 理学院信息与计算科学专业2015-1班 一、课程设计(论文)题目:图像融合的程序设计 二、课程设计(论文)工作: 自2018 年1 月10 日起至2018 年1 月12日止 三、课程设计(论文) 地点: 2-201 四、课程设计(论文)内容要求: 1.本课程设计的目的 (1)熟悉Delphi7的使用,理论与实际应用相结合,养成良好的程序设计技能;(2)了解并掌握图像融合的各种实现方法,具备初步的独立分析和设计能力;(3)初步掌握开发过程中的问题分析,程序设计,代码编写、测试等基本方法;(4)提高综合运用所学的理论知识和方法独立分析和解决问题的能力; (5)在实践中认识、学习计算机图形学相关知识。 2.课程设计的任务及要求 1)基本要求: (1)研究课程设计任务,并进行程序需求分析; (2)对程序进行总体设计,分解系统功能模块,进行任务分配,以实现分工合作;(3)实现各功能模块代码; (4)程序组装,测试、完善系统。 2)创新要求: 在基本要求达到后,可进行创新设计,如改进界面、增加功能或进行代码优化。

3)课程设计论文编写要求 (1)要按照书稿的规格打印誊写课程设计论文 (2)论文包括封面、设计任务书(含评语)、摘要、目录、设计内容、设计小结(3)论文装订按学校的统一要求完成 4)参考文献: (1)David ,《计算机图形学的算法基础》,机械工业出版社 (2)Steve Cunningham,《计算机图形学》,机械工业出版社 (3) 5)课程设计进度安排 内容天数地点 程序总体设计 1 实验室 软件设计及调试 1 实验室 答辩及撰写报告 1 实验室、图书馆 学生签名: 2018年1月12日 摘要 图像融合是图像处理中重要部分,能够协同利用同一场景的多种传感器图像信息,输出一幅更适合于人类视觉感知或计算机进一步处理与分析的融合图像。它可明显的改善单一传感器的不足,提高结果图像的清晰度及信息包含量,有利于更为准确、更为可靠、更为全面地获取目标或场景的信息。图像融合主要应用于军事国防上、遥感方面、医学图像处理、机器人、安全和监控、生物监测等领域。用于较多也较成熟的是红外和可见光的融合,在一副图像上显示多种信息,突出目标。一般情况下,图像融合由

计算机图形学实验报告,DOC

欢迎共阅

目录

实验一直线的DDA算法 一、【实验目的】 1.掌握DDA算法的基本原理。 2.掌握 3. 1.利用 2.加强对 四 { glClearColor(1.0f,1.0f,1.0f,1.0f); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200.0,0.0,150.0); } voidDDALine(intx0,inty0,intx1,inty1) { glColor3f(1.0,0.0,0.0); intdx,dy,epsl,k; floatx,y,xIncre,yIncre; dx=x1-x0;dy=y1-y0;

x=x0;y=y0; if(abs(dx)>abs(dy))epsl=abs(dx); elseepsl=abs(dy); xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; for(k=0;k<=epsl;k++) { glPointSize(3); glBegin(GL_POINTS); glEnd(); } } { } { } { glutInitWindowSize(400,300); glutInitWindowPosition(100,120); glutCreateWindow("line"); Initial(); glutDisplayFunc(Display); glutReshapeFunc(winReshapeFcn); glutMainLoop(); return0; }

计算机图形学课程教学大纲

《计算机图形学》课程教学大纲一、课程基本信息 课程代码:110053 课程名称:计算机图形学 英文名称:Computer Graphics 课程类别:专业课 学时:72 学分: 适用对象:信息与计算科学专业本科生 考核方式:考试(平时成绩占总成绩的30%) 先修课程:高级语言程序设计、数据结构、高等代数 二、课程简介 中文简介: 计算机图形学是研究计算机生成、处理和显示图形的学科。它的重要性体现在人们越来越强烈地需要和谐的人机交互环境:图形用户界面已经成为一个软件的重要组成部分,以图形的方式来表示抽象的概念或数据已经成为信息领域的一个重要发展趋势。通过本课程的学习,使学生掌握计算机图形学的基本原理和基本方法,理解图形绘制的基本算法,学会初步图形程序设计。 英文简介: Computer Graphics is the subject which concerned with how computer builds, processes and shows graphics. Its importance has been shown in people’s more and more intensively need for harmony human-machine interface. Graphics user interface has become an important part of software. It is a significant trend to show abstract conception or data in graphics way. Through the learning of this course, students could master Computer Graphics’basic theories and methods,understand graphics basic algorithms and learn how to design basic graphics program. 三、课程性质与教学目的 《计算机图形学》是信息与计算科学专业的一门主要专业课。通过本课程的学习,使学生掌握基本的二、三维的图形的计算机绘制方法,理解光栅图形生成基本算法、几何造型技术、真实感图形生成、图形标准与图形变换等概念和知识。学会图形程序设计的基本方法,为图形算法的设计、图形软件的开发打下基础。 四、教学内容及要求 第一章绪论 (一)目的与要求 1.掌握计算机图形学的基本概念; 2.了解计算机图形学的发展、应用; 3.掌握图形系统的组成。

《计算机图形学》 课程实验指导(1)

《计算机图形学》课程实验指导 一.实验总体方案 1.教学目标与基本要求 (1)掌握教材所介绍的图形算法的原理; (2)掌握通过具体的平台实现图形算法的方法,培养相应能力; (3)通过实验培养具有开发一个基本图形软件包的能力。 2. 实验平台与考核 实验主要结合OpenGL设计程序实现各种课堂教学中讲过的图形算法为主。程序设计语言主要以C/C++语言为主,开发平台为Visual C++。 每次实验前完成实验报告的实验目的、实验内容、实验原理、实验代码四部分并接受抽查,实验完成后完成实验结果、实验体会两部分,本次实验课结束前提交。 3. 实验步骤 (1) 预习教材与实验指导相关的算法理论及原理; (2) 仿照教材与实验指导提供的算法,利用VC+OpenGL进行实现; (3) 调试、编译、运行程序,运行通过后,可考虑对程序进行修改或改进。 二. 实验具体方案 实验预备知识 OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性。 1)与C语言紧密结合: OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的。如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL 作图甚至比TC更加简单; 2)强大的可移植性: 微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统。而OpenGL 不仅用于 Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。并且,OpenGL 的基本命令都做到了硬件无关,甚至是平台无关; 3) 高性能的图形渲染: OpenGL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL提供强力支持,激烈的竞争中使得OpenGL性能一直领先。 总之,OpenGL是一个非常优秀的图形软件接口。OpenGL官方网站(英文)https://www.doczj.com/doc/139554091.html, 下面将对Windows下的OpenGL编程进行简单介绍。如下是学习OpenGL前的准备工作:1.选择一个编译环境 现在Windows系统的主流编译环境有Visual C++,C++ Builder,Dev-C++等,它们都是支持OpenGL的。但这里我们选择Visual C++ 作为学习OpenGL的实验环境。 2.安装GLUT工具包 GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。Windows环境下的GLUT下载地址:(大小约为150k) https://www.doczj.com/doc/139554091.html,/resources/libraries/glut/glutdlls37beta.zip Windows环境下安装GLUT的步骤: 1)将下载的压缩包解开,将得到5个文件 2)在“我的电脑”中搜索“gl.h”,并找到其所在文件夹(如果是VisualStudio2005,则

Opengl实验报告及源代码实验七 模型加载

实验报告 学生姓名:学号:专业班级: 实验类型:□验证□综合□设计□创新实验日期:2018.11 实验成绩:一、实验名称 实验七模型加载 二、实验内容 1.设计并实现Mesh类,利用该类实现模型网格的解析、加载、管理与渲染。 2.设计并实现Model类,利用该类实现几何模型的解析、加载、管理与渲染。 3.基于Mesh类和Model类,利用Assimp模型加载库,加载并渲染三维几何模型。 三、实验目的 1.掌握3D模型网格数据的组织与渲染方法。 2.掌握3D模型数据的结构与组织,以及模型数据的解析与渲染方法。 3.了解Assimp库中管理3D模型的数据结构,掌握Assimp库的使用方法。 四、实验步骤 1.定义网格类结构,并初始化 class Mesh { Public: vector vertices; vector indices; vector textures; Mesh(vector vertices, vector indices, vector texture); Void Draw(Shader shader); private: GLuint VAO, VBO, EBO; void setupMesh(); } void setupMesh() { glGenVertexArrays(1, &this->VAO); glGenBuffers(1, &this->VBO); glGenBuffers(1, &this->EBO); glBindVertexArray(this->VAO); glBindBuffer(GL_ARRAY_BUFFER, this->VBO);

计算机图形学 课程设计作品

《计算机图形学Visual c++版》考试作业报告 题目:计算机图形学图形画板 专业:推荐IT学长淘宝日用品店530213 班级:推荐IT学长淘宝日用品店530213 学号:推荐IT学长淘宝日用品店530213 姓名:推荐IT学长淘宝日用品店530213 指导教师:推荐IT学长淘宝日用品店530213 完成日期: 2015年12月2日

一、课程设计目的 本课程设计的目标就是要达到理论与实际应用相结合,提高学生设计图形及编写大型程序的能力,并培养基本的、良好的计算机图形学的技能。 设计中要求综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握计算机图形学基本知识和算法设计的基本技能术,掌握分析、解决实际问题的能力。 通过这次设计,要求在加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。 二、设计内容推荐IT学长淘宝日用品店530213 设计一个图形画板,在这个图形画板中要实现: 1,画线功能,而且画的线要具备反走样功能。 2, 利用上面的画线功能实现画矩形,椭圆,多边形,并且可以对这些图形进行填充。 3,可以对选中区域的图形放大,缩小,平移,旋转等功能。 三、设计过程 程序预处理:包括头文件的加载,常量的定义以及全局变量的定义 #include "stdafx.h" #include "GraDesign.h" #include "GraDesignDoc.h" #include "GraDesignView.h" #include "math.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //******自定义全局变量 int type = -1; CPoint point1; CPoint point2; CPoint temp[2];

计算机图形学实验报告

计算机图形学 实验报告 姓名:谢云飞 学号:20112497 班级:计算机科学与技术11-2班实验地点:逸夫楼507 实验时间:2014.03

实验1直线的生成 1实验目的和要求 理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析 实验数据的能力; 编程实现DDA算法、Bresenham中点算法;对于给定起点和终点的 直线,分别调用DDA算法和Bresenham中点算法进行批量绘制,并记 录两种算法的绘制时间;利用excel等数据分析软件,将试验结果编 制成表格,并绘制折线图比较两种算法的性能。 2实验环境和工具 开发环境:Visual C++ 6.0 实验平台:Experiment_Frame_One(自制平台)。 本实验提供名为 Experiment_Frame_One的平台,该平台提供基本 绘制、设置、输入功能,学生在此基础上实现DDA算法和Mid_Bresenham 算法,并进行分析。 ?平台界面:如错误!未找到引用源。所示 ?设置:通过view->setting菜单进入,如错误!未找到引 用源。所示 ?输入:通过view->input…菜单进入.如错误!未找到引用 源。所示 ?实现算法: ◆DDA算法:void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1) Mid_Bresenham法:void CExperiment_Frame_OneView::Mid_Bresenham(int X0, int Y0, int X1, int Y1)

3实验结果 3.1程序流程图 1)DDA算法流程图:开始 定义两点坐标差dx,dy,以及epsl,计数k=0,描绘点坐标x,y,x增 量xIncre,y增量yIncre ↓ 输入两点坐标x1,y1,x0,y0 ↓ dx=x1-x0,dy=y1-y0; _________↓_________ ↓↓ 若|dx|>|dy| 反之 epsl=|dx| epsl=|dy| ↓________...________↓ ↓ xIncre=dx/epsl; yIncre=dy/epsl ↓ 填充(强制整形)(x+0.5,y+0.5); ↓←←←← 横坐标x+xIncre; 纵坐标y+yIncre; ↓↑ 若k<=epsl →→→k++ ↓ 结束 2)Mid_Bresenham算法流程图开始 ↓ 定义整形dx,dy,判断值d,以及UpIncre,DownIncre,填充点x,y ↓ 输入x0,y0,x1,y1 ______↓______ ↓↓ 若x0>x1 反之 x=x1;x1=x0;x0=x; x=x0;

计算机图形学实验报告

.

目录

实验一直线的DDA算法 一、【实验目的】 1.掌握DDA算法的基本原理。 2.掌握DDA直线扫描转换算法。 3.深入了解直线扫描转换的编程思想。 二、【实验内容】 1.利用DDA的算法原理,编程实现对直线的扫描转换。 2.加强对DDA算法的理解和掌握。 三、【测试数据及其结果】 四、【实验源代码】 #include

#include #include #include GLsizei winWidth=500; GLsizei winHeight=500; void Initial(void) { glClearColor(1.0f,1.0f,1.0f,1.0f); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200.0,0.0,150.0); } void DDALine(int x0,int y0,int x1,int y1) { glColor3f(1.0,0.0,0.0); int dx,dy,epsl,k; float x,y,xIncre,yIncre; dx=x1-x0; dy=y1-y0; x=x0; y=y0; if(abs(dx)>abs(dy)) epsl=abs(dx); else epsl=abs(dy); xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; for(k=0;k<=epsl;k++) { glPointSize(3); glBegin(GL_POINTS); glV ertex2i(int(x+0.5),(int)(y+0.5)); glEnd(); x+=xIncre; y+=yIncre; } } void Display(void) { glClear(GL_COLOR_BUFFER_BIT); DDALine(100,100,200,180); glFlush(); }

计算机图形学课程总结教材

计算机图形学报告 前言 计算机图形学(Computer Graphics,简称CG)是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。 其从狭义上是来说是一种研究基于物理定律、经验方法以及认知原理,使用各种数学算法处理二维或三维图形数据,生成可视数据表现的科学。广义上来看,计算机图形学不仅包含了从三维图形建模、绘制到动画的过程,同时也包括了对二维矢量图形以及图像视频融合处理的研究。由于计算机图形学在许多领域的成功运用,特别是在迅猛发展的动漫产业中,带来了可观的经济效益。另一方面,由于这些领域应用的推动,也给计算机图形学的发展提供了新的发展机遇与挑战。 计算机图形学的发展趋势包括以下几个方面: 1、与图形硬件的发展紧密结合,突破实时高真实感、高分辨率渲染的技术难点; 2、研究和谐自然的三维模型建模方法; 3、利用日益增长的计算性能,实现具有高度物理真实的动态仿真; 4、研究多种高精度数据获取与处理技术,增强图形技术的表现; 5、计算机图形学与图像视频处理技术的结合; 6、从追求绝对的真实感向追求与强调图形的表意性转变。 1、三维物体的表示 计算机图形学的核心技术之一就是三维造型三维物体种类繁多、千变万化,如树、花、云、石、水、砖、木板、橡胶、纸、大理石、钢、玻璃、塑料和布等等。因此,不存在描述具有上述各种不同物质所有特征的统一方法。为了用计算机生成景物的真实感图形,就需要研究能精确描述物体特征的表示方法。根据三维物体的特征,可将三维物体分为规则物体和非规则物体两类。 三维实体表示方法通常分为两大类:边界表示和空间分割表示,尽管并非所有的表示都能完全属于这两类范畴中的某一类。边界表示(B-reps)用一组曲面来描述三维物体,这些曲面将物体分为内部和外部。边界表示的典型例子是多边形平面片和样条曲面。空间分割表示(Space-Partitioning)用来描述物体内部性质,将包含一物体的空间区域分割为一组小的、非重叠的、连续实体(通常是立方体)。三维物体的一般空间分割描述是八叉树表示。本章主要介绍三维物体的各种表示方法及其特点。

计算机图形学课程设计实习报告范本

实验零 Visual C++ 2005绘图系统 地点:土木楼B401机房时间:星期三下午节次:第三大节 一、实验目的: 1. 了解Visual C++ 2005绘图的基本概念 2. 了解Visual C++ 2005绘图环境 3. 掌握用Visual C++ 2005设计绘图项目的基本步骤 4. 掌握用Visual C++ 2005绘图的基本命令 二、实验容: 实验容1:创建绘图应用程序主框架 实验容2:应用程序编译运行 实验容3:设置菜单项并生成消息响应函数 实验容4:SetPixel绘图 三、实验步骤: 实验容1:创建绘图应用程序主框架 步骤: 1.创建一个工作目录D:\MyProject 2.启动 Visual Studio 2005 3.单击“文件”->“新建”->“项目”,项目类型对话框中选择“其他语言”->“VC++” ->“MFC”,模版选择“MFC应用程序”。在工作目录D:\MyProject 下创建一个新应用项目: Sample,如下图所示。

5.单击“下一步”按钮。 6.在“应用程序类型中”,选择“单文档”类型。 7.单击“完成”,创建了一项空的工程-绘图应用程序主框架。 实验容2:应用程序编译运行 运行版本有两类:Debug、Release, 生成Debug解决方案步骤如下:

点击“生成-〉生成解决方案”, 生成了Debug版的可运行程序。 2.调试运行程序 点击菜单“调试——〉开始执行(不调试)”, 执行Debug版的可运行程序。 结果如下:

生成Release解决方案步骤如下: 1.生成解决方案 点击“生成-〉批生成”。 2.勾选“Release”,单击“生成”,生成可以独立于Visual C++ 2005外运行的.exe程序。

opengl立方体的简单三维交互式几何变换实验报告+代码

立方体的简单三维交互式几何变换 这个学期对opengl的学习,使我对计算机图形学的一些算法过程有了更多的了解。因为对三维图形的显示比较感兴趣,就做了立方体的简单三维交互式几何变换。 功能:键盘的方向键实现立方体的上下左右平移;A键,S键分别实现向前,向后旋转;J键,K键分别实现放大,缩小;C键退出。 程序模块: 1.该模块为绘制一个立方体。 void DrawBox() { glBegin(GL_QUADS); //前面 glColor3f(1,0,0); glVertex3f(-1.0f, -1.0f, 1.0f); // 四边形的左下 glVertex3f( 1.0f, -1.0f, 1.0f); // 四边形的右下 glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的右上 glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的左上 // 后面 glColor3f(0,1,0); glVertex3f(-1.0f, -1.0f, -1.0f); // 四边形的右下 glVertex3f(-1.0f, 1.0f, -1.0f); // 四边形的右上

glVertex3f( 1.0f, -1.0f, -1.0f); // 四边形的左下 // 顶面 glColor3f(0,0,1); glVertex3f(-1.0f, 1.0f, -1.0f); // 四边形的左上glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的左下glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的右下glVertex3f( 1.0f, 1.0f, -1.0f); // 四边形的右上// 底面 glColor3f(1,1,0); glVertex3f(-1.0f, -1.0f, -1.0f); // 四边形的右上glVertex3f( 1.0f, -1.0f, -1.0f); // 四边形的左上glVertex3f( 1.0f, -1.0f, 1.0f); // 四边形的左下glVertex3f(-1.0f, -1.0f, 1.0f); // 四边形的右下// 右面 glColor3f(0,1,1); glVertex3f( 1.0f, -1.0f, -1.0f); // 四边形的右下glVertex3f( 1.0f, 1.0f, -1.0f); // 四边形的右上glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的左上glVertex3f( 1.0f, -1.0f, 1.0f); // 四边形的左下// 左面 glColor3f(1,0,1);

计算机图形学课程设计报告

计算机图形学 课程设计报告 设计课题: 专业班级: 学号: 学生姓名: 指导教师: 设计时间:2018.12.06

中南林业科技大学涉外学院理工系计算机图形学课程设计任务书

指导教师:廖宁教研室主任: 2018年12月06 日注:本表下发学生一份,指导教师一份,栏目不够时请另附页。 课程设计任务书装订于设计计算说明书(或论文)封面之后,目录页之前。 目录 一.设计目的……………………………………………………………二.设计要求…………………………………………………………… 1.构建基础类…………………………………………………… 2.构建直线类…………………………………………………… 3.构建变换类…………………………………………………… 4.构建填充类…………………………………………………… 5.构建光照类……………………………………………………三.开发环境…………………………………………………………四.详细设计 五.源程序 六.程序运行效果图 七.总结

设计目的 ?培养对图形建模、变换、投影、消隐、光照原理的理解和应用。 ?培养图形类的编程能力。 ?培养计算机图形学应用软件开发的能力。 设计要求 深入研究计算机图形学的生成原理,设计算法实现具体的类。 1.构建基础类 实现CP2类绘制二维点;实现CP3类绘制三维点;实现CRGB 类处理RGB颜色;实现CVector类处理矢量。 2.构建直线类 实现CLine类绘制任意斜率的直线、实现CALine类绘制任意斜率的反走样直线、实现CCLine类绘制任意斜率的颜色渐变直线、实现

CACLine类绘制任意斜率的反走样颜色渐变直线。 3.构建变换类 实现CTransForm完成二维和三维图形变换。 4.构建填充类 实现CFill类使用有效边表算法填充多边形、实现CZBuffer类进行深度缓冲消隐,并使用Gouraud和Phong明暗处理填充图形面片。 5.构建光照类 实现CLight类设置点光源、实现CMaterial类设置物体材质、实现CLighting类对物体实施光照。 开发环境 Viusal C++ 6.0的MFC框架。 详细设计 1.利用函数Ellipse画出人物的脸,并用给脸填充颜色。再利 用Ara画出人物的嘴巴。CRect确定人物的眼睛,给眼睛填 充颜色。利用画笔画出人物的鼻子。 2.添加ddaline()成员函数,编写自定义的成员函数ddaline ()程序,编写OnDraw()函数,画出人物的脚和脚趾。 3.添加星星star()成员函数,编写自定义的成员函数star() 程序,确定五角星的位置、大小和颜色。

计算机图形学实验报告

计算机图形学 实验报告 学号:20072115 姓名: 班级:计算机 2班 指导老师:何太军 2010.6.19

实验一、Windows 图形程序设计基础 1、实验目的 1)学习理解Win32 应用程序设计的基本知识(SDK 编程); 2)掌握Win32 应用程序的基本结构(消息循环与消息处理等); 3)学习使用VC++编写Win32 Application 的方法。 4)学习MFC 类库的概念与结构; 5)学习使用VC++编写Win32 应用的方法(单文档、多文档、对话框); 6)学习使用MFC 的图形编程。 2、实验内容 1)使用WindowsAPI 编写一个简单的Win32 程序,调用绘图API 函数绘制若干图形。(可选任务) 2 )使用MFC AppWizard 建立一个SDI 程序,窗口内显示"Hello,This is my first SDI Application"。(必选任务) 3)利用MFC AppWizard(exe)建立一个SDI 程序,在文档视口内绘制基本图形(直线、圆、椭圆、矩形、多边形、曲线、圆弧、椭圆弧、填充、文字等),练习图形属性的编程(修改线型、线宽、颜色、填充样式、文字样式等)。定义图形数据结构Point\Line\Circle 等保存一些简单图形数据(在文档类中),并在视图类OnDraw 中绘制。 3、实验过程

1)使用MFC AppWizard(exe)建立一个SDI 程序,选择单文档; 2)在View类的OnDraw()函数中添加图形绘制代码,说出字符串“Hello,This is my first SDI Application”,另外实现各种颜色、各种边框的线、圆、方形、多边形以及圆弧的绘制; 3)在类视图中添加图形数据point_pp,pp_circle的类,保存简单图形数据,通过在OnDraw()函数中调用,实现线、圆的绘制。 4、实验结果 正确地在指定位置显示了"Hello,This is my first SDI Application"字符串,成功绘制了圆,椭圆,方形,多边形以及曲线圆弧、椭圆弧,同时按指定属性改绘了圆、方形和直线。成功地完成了实验。 结果截图: 5、实验体会 通过实验一,了解了如用使用基本的SDI编程函数绘制简单的图

X-opengl立方体的简单三维交互式几何变换实验报告代码

立方体的简单三维交互式几何变换 立方体的简单三维交互式几何变换。 功能:键盘的方向键实现立方体的上下左右平移;A键,S键分别实现向前,向后旋转;J键,K键分别实现放大,缩小;C键退出。 程序模块: 1.重绘回调函数,在窗口首次创建或用户改变窗口尺寸时被调用。void reshape(int w, int h) { glViewport(0, 0, w, h);// 指定视口的位置和大小 glMatrixMode(GL_PROJECTION); glLoadIdentity(); //glFrustum(-1.0, 1.0, -1.0, 1.0, 3.1, 10.0); //gluPerspective(45,1,0.1,10.0); glOrtho(-2.0, 2.0, -2.0, 2.0, 2.0, 10.0); } 2.绘制一个立方体。 void DrawBox() { glBegin(GL_QUADS); //前面

glColor3f(1,0,0); glVertex3f(-1.0f, -1.0f, 1.0f); // 四边形的左下glVertex3f( 1.0f, -1.0f, 1.0f); // 四边形的右下glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的右上glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的左上// 后面 glColor3f(0,1,0); glVertex3f(-1.0f, -1.0f, -1.0f); // 四边形的右下glVertex3f(-1.0f, 1.0f, -1.0f); // 四边形的右上glVertex3f( 1.0f, 1.0f, -1.0f); // 四边形的左上glVertex3f( 1.0f, -1.0f, -1.0f); // 四边形的左下 // 顶面 glColor3f(0,0,1); glVertex3f(-1.0f, 1.0f, -1.0f); // 四边形的左上glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的左下glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的右下glVertex3f( 1.0f, 1.0f, -1.0f); // 四边形的右上// 底面 glColor3f(1,1,0); glVertex3f(-1.0f, -1.0f, -1.0f); // 四边形的右上glVertex3f( 1.0f, -1.0f, -1.0f); // 四边形的左上glVertex3f( 1.0f, -1.0f, 1.0f); // 四边形的左下

计算机图形学论文计算机图形学理论与技术发展趋势研究

华北电力大学 课程论文 | | 论文题目计算机图形学理论与技术发展趋势研究 课程名称计算机图形学 | | 专业班级:学生姓名: 学号:成绩: (纸张用A4,左装订;页边距:上下2.5cm,左2.9cm, 右2.1cm)* 封面左侧印痕处装订

计算机图形学理论与技术发展趋势 研究 摘要: 计算机图形学(Computer Graphics,简称CG)是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。 关键字:研究领域与目的发展历程应用方面 引言:计算机图形学是计算机与应用专业的专业主干课,它的重要性体现在人们越来越强烈地需要和谐的人机交互环境:图形用户界面已经成为一个软件的重要组成部分,以图形的方式来表示抽象的概念或数据(可视化)已经成为信息领域的一个重要发展趋势。 正文:计算机图形学的主要研究内容就是研究如何在计算机上表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。图形通常由点、线、面、体等几何元素和灰度、色彩、线型、线宽等非几何属性组成。从处理技术上来看,图形主要分为两类,一类是基于线条信息表示的。如工程图、等高线地图、曲面的线框图等,另一类是明暗图,也就是通常所说的真实感图形。 计算机图形学一个主要目的就是要利用计算机产生令人赏心悦目的真实感图形。为此,必须建立图形所描述场景的几何表示,再用某种光照模型,计算在假想的光源、纹理、材质属性下的光照明效果。同时,真实感图形计算的结果是以数字图像的方式提供的,计算机图形学也就和图像处理有着密切的关系。 计算机图形学的研究内容非常广泛,如图形硬件、图形标准、图形交互技术、光栅图形生成算法、曲线曲面造型、实体造型、真实感图形计算与显示算法、非真实感绘制,以及科学计算可视化、计算机动画、自然景物仿真、虚拟现实等。 1950年,第一台图形显示器作为美国麻省理工学院(MIT)旋风I号(Whirlwind I)计算机的附件诞生了。该显示器用一个类似于示波器的阴极射线管(CRT)来显示一些简单的图形。1958年美国Calcomp公司由联机的数字记录仪发展成滚筒式绘图仪,GerBer公司把数控机床发展成为平板式绘图仪。在整个50年代,只有电子管计算机,用机器语言编程,主要应用于科学计算,为这些计算机配置的图形设备仅具有输出功能。计算机图形学处于准备和酝酿时期,并称之为:“被动式”图形学。到50年代末期,MIT的林肯实验室在“旋风”计算机上开发SAGE空中防御体系,第一次使用了具有指挥和控制功能的CRT显示器,操作者可以用笔在屏幕上指出被确定的目标。与此同时,类似的技术在设计和生产过程中也陆续得到了应用,它预示着交互式计算机图形学的诞生。 1962年,MIT林肯实验室的Ivan E.Sutherland 发表了一篇题为“Sketchpad:一个人机交互通信的图形系统”的博士论文,他在论文中首次使用了计算机图形学“Computer Graphics”这个术语,证明了交互计算机图形学是一个可行的、有用的研究领域,从而确定了计算机图形学作为一个崭新的科学分支的独立地位。他在论文中所提出的一些基本概念和技术,如交互技术、分层存储符号的数据结构等至今还在广为应用。1964年MIT的教授Steven A. Coons提出了被后人称为超限插值的新思想,通过插值四条任意的边界曲线来构造曲面。同在60年代早期,法国雷诺汽车公司的工程师Pierre Bézier发展了一套被后人称为Bézier曲线、曲面的理论,成功地用于几何外形设计,并开发了用于汽车外形设计

相关主题
文本预览
相关文档 最新文档