Санкт-Петербургский Государственный
Электротехнический Университет
Кафедра МОЭВМ
Отчёт по лабораторной работе № 4
"Фрактал"
Дисциплина «Компьютерная Графика»
Студент:
гр.0305
Преподаватель:
Санкт-Петербург
2004 г.
Задание
Задача решается с применением рекурсии. Для решения задачи для заданных трех чисел Хс, Ус и 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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.