Фрактал. Интерфейс. Пространство имён simpleGL. Отображение фрактала при помощи рекурсивного метода рисования элемента

Страницы работы

12 страниц (Word-файл)

Фрагмент текста работы

Санкт-Петербургский Государственный

Электротехнический Университет

Кафедра МОЭВМ

Отчёт по лабораторной работе № 4

"Фрактал"

Дисциплина «Компьютерная Графика»

Студент:

гр.0305

Преподаватель:

Санкт-Петербург

2004 г.

Задание

Задание 1

Задача решается с применением рекурсии. Для решения задачи для заданных трех чисел Хс, Ус и R соединить точки с координатами

, что в результате дает звезду.

 


Рис1

Выполнение работы

Основой программы послужил набор библиотек MFC, что позволило избавиться от необходимости написания дополнительных строк кода.

Для реализации часто употребляемых блоков кода openGL было создано пространство имён simpleGL.

Для отображения используются режим GL_POLYGON. Раскрашивание примитивов происходит по команде glColor.

Для отображения объектов была выбрана перспективная проекция.

Отображение фрактала осуществляется при помощи рекурсивного метода рисования элемента, глубина рекурсии ограничена десятью ступенями.

Как видно из рис.1, фрактал состоит из двух логических элементов — квадрата и эквивалентного ему ромба. Переключение между фракталом и ромбом производится при помощи флага, передаваемого в метод рекурсии. На каждом шаге этот флаг реверсируется.

Интерфейс

Основное окно программы показано на рис.2.

Рис 2

Исходный код

// file Minfrm.cpp

// MainFrm.cpp : implementation of the CMainFrame class

//

#include "stdafx.h"

#include "rlab4.h"

#include "MainFrm.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

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

// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)

//{{AFX_MSG_MAP(CMainFrame)

// NOTE - the ClassWizard will add and remove mapping macros here.

//    DO NOT EDIT what you see in these blocks of generated code !

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

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

// CMainFrame construction/destruction

CMainFrame::CMainFrame()

{

// TODO: add member initialization code here

}

CMainFrame::~CMainFrame()

{

}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

{

if( !CFrameWnd::PreCreateWindow(cs) )

return FALSE;

cs.cx = 500;

cs.cy = 500;

return TRUE;

}

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

// CMainFrame diagnostics

#ifdef _DEBUG

void CMainFrame::AssertValid() const

{

CFrameWnd::AssertValid();

}

void CMainFrame::Dump(CDumpContext& dc) const

{

CFrameWnd::Dump(dc);

}

#endif //_DEBUG

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

// CMainFrame message handlers

// rlab4.cpp : Defines the class behaviors for the application.

//

#include "stdafx.h"

#include "rlab4.h"

#include "MainFrm.h"

#include "rlab4Doc.h"

#include "rlab4View.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

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

// CRlab4App

BEGIN_MESSAGE_MAP(CRlab4App, CWinApp)

//{{AFX_MSG_MAP(CRlab4App)

ON_COMMAND(ID_APP_ABOUT, OnAppAbout)

// NOTE - the ClassWizard will add and remove mapping macros here.

//    DO NOT EDIT what you see in these blocks of generated code!

//}}AFX_MSG_MAP

// Standard file based document commands

ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)

ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)

END_MESSAGE_MAP()

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

// CRlab4App construction

CRlab4App::CRlab4App()

{

// TODO: add construction code here,

// Place all significant initialization in InitInstance

}

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

// The one and only CRlab4App object

CRlab4App theApp;

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

// CRlab4App initialization

BOOL CRlab4App::InitInstance()

{

AfxEnableControlContainer();

// Standard initialization

// If you are not using these features and wish to reduce the size

//  of your final executable, you should remove from the following

//  the specific initialization routines you do not need.

#ifdef _AFXDLL

Enable3dControls();                             // Call this when using MFC in a shared DLL

#else

Enable3dControlsStatic();         // Call this when linking to MFC statically

#endif

// Change the registry key under which our settings are stored.

// TODO: You should modify this string to be something appropriate

// such as the name of your company or organization.

SetRegistryKey(_T("Local AppWizard-Generated Applications"));

LoadStdProfileSettings();  // Load standard INI file options (including MRU)

// Register the application's document templates.  Document templates

//  serve as the connection between documents, frame windows and views.

CSingleDocTemplate* pDocTemplate;

pDocTemplate = new CSingleDocTemplate(

IDR_MAINFRAME,

RUNTIME_CLASS(CRlab4Doc),

RUNTIME_CLASS(CMainFrame),       // main SDI frame window

RUNTIME_CLASS(CRlab4View));

AddDocTemplate(pDocTemplate);

// Parse command line for standard shell commands, DDE, file open

CCommandLineInfo cmdInfo;

ParseCommandLine(cmdInfo);

// Dispatch commands specified on the command line

if (!ProcessShellCommand(cmdInfo))

return FALSE;

// The one and only window has been initialized, so show and update it.

m_pMainWnd->ShowWindow(SW_SHOW);

m_pMainWnd->UpdateWindow();

return TRUE;

}

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

// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog

{

public:

CAboutDlg();

// Dialog Data

//{{AFX_DATA(CAboutDlg)

enum { IDD = IDD_ABOUTBOX };

//}}AFX_DATA

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CAboutDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

//}}AFX_VIRTUAL

// Implementation

protected:

//{{AFX_MSG(CAboutDlg)

// No message handlers

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

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

{

//{{AFX_DATA_INIT(CAboutDlg)

//}}AFX_DATA_INIT

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CAboutDlg)

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

//{{AFX_MSG_MAP(CAboutDlg)

// No message handlers

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

// App command to run the dialog

void CRlab4App::OnAppAbout()

{

CAboutDlg aboutDlg;

aboutDlg.DoModal();

}

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

// CRlab4App message handlers

/ rlab4Doc.cpp : implementation of the CRlab4Doc class

//

#include "stdafx.h"

#include "rlab4.h"

#include "rlab4Doc.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

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

// CRlab4Doc

IMPLEMENT_DYNCREATE(CRlab4Doc, CDocument)

BEGIN_MESSAGE_MAP(CRlab4Doc, CDocument)

//{{AFX_MSG_MAP(CRlab4Doc)

// NOTE - the ClassWizard will add and remove mapping macros here.

//    DO NOT EDIT what you see in these blocks of generated code!

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

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

// CRlab4Doc construction/destruction

CRlab4Doc::CRlab4Doc()

{

// TODO: add one-time construction code here

}

CRlab4Doc::~CRlab4Doc()

{

}

BOOL CRlab4Doc::OnNewDocument()

{

if (!CDocument::OnNewDocument())

return FALSE;

// TODO: add reinitialization code here

// (SDI documents will reuse this document)

return TRUE;

}

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

// CRlab4Doc serialization

void CRlab4Doc::Serialize(CArchive& ar)

{

if (ar.IsStoring())

{

// TODO: add storing code here

}

else

{

// TODO: add loading code here

}

}

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

// CRlab4Doc diagnostics

#ifdef _DEBUG

void CRlab4Doc::AssertValid() const

{

CDocument::AssertValid();

}

void CRlab4Doc::Dump(CDumpContext& dc) const

{

CDocument::Dump(dc);

}

#endif //_DEBUG

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

// CRlab4Doc commands

// rlab4View.cpp : implementation of the CRlab4View class

//

#include "stdafx.h"

#include "rlab4.h"

#include "rlab4Doc.h"

#include "rlab4View.h"

#include <cmath>

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

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

// CRlab4View

IMPLEMENT_DYNCREATE(CRlab4View, CView)

BEGIN_MESSAGE_MAP(CRlab4View, CView)

//{{AFX_MSG_MAP(CRlab4View)

ON_WM_CREATE()

ON_WM_DESTROY()

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

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

// CRlab4View construction/destruction

CRlab4View::CRlab4View()

{

// TODO: add construction code here

}

CRlab4View::~CRlab4View()

{

}

BOOL CRlab4View::PreCreateWindow(CREATESTRUCT& cs)

{

// TODO: Modify the Window class or styles here by modifying

//  the CREATESTRUCT cs

return CView::PreCreateWindow(cs);

}

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

// CRlab4View drawing

void CRlab4View::OnDraw(CDC* pDC)

{

CRlab4Doc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

wglMakeCurrent(pDC->m_hDC, m_hrc);        

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glFlush();

glColor3f(1, 1, 0);

DrawCircle(0, 0, 0.3);

Draw();

wglMakeCurrent(NULL, NULL);

}

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

// CRlab4View diagnostics

#ifdef _DEBUG

void CRlab4View::AssertValid() const

{

CView::AssertValid();

}

void CRlab4View::Dump(CDumpContext& dc) const

{

CView::Dump(dc);

}

CRlab4Doc* CRlab4View::GetDocument() // non-debug version is inline

Похожие материалы

Информация о работе