Главная » Каталог    
рефераты Разделы рефераты
рефераты
рефератыГлавная

рефератыБиология

рефератыБухгалтерский учет и аудит

рефератыВоенная кафедра

рефератыГеография

рефератыГеология

рефератыГрафология

рефератыДеньги и кредит

рефератыЕстествознание

рефератыЗоология

рефератыИнвестиции

рефератыИностранные языки

рефератыИскусство

рефератыИстория

рефератыКартография

рефератыКомпьютерные сети

рефератыКомпьютеры ЭВМ

рефератыКосметология

рефератыКультурология

рефератыЛитература

рефератыМаркетинг

рефератыМатематика

рефератыМашиностроение

рефератыМедицина

рефератыМенеджмент

рефератыМузыка

рефератыНаука и техника

рефератыПедагогика

рефератыПраво

рефератыПромышленность производство

рефератыРадиоэлектроника

рефератыРеклама

рефератыРефераты по геологии

рефератыМедицинские наукам

рефератыУправление

рефератыФизика

рефератыФилософия

рефератыФинансы

рефератыФотография

рефератыХимия

рефератыЭкономика

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

Объектно ориентированное программирование на С с использованием библиотеки


======================================================================== MICROSOFT FOUNDATION CLASS LIBRARY : Polyhedron
========================================================================
AppWizard has created this Polyhedron application for you. This application
not only demonstrates the basics of using the Microsoft Foundation classes
but is also a starting point for writing your application.
This file contains a summary of what you will find in each of the files that
make up your Polyhedron application.
Polyhedron.h This is the main header file for the application. It includes other project specific headers (including Resource.h) and declares the CPolyhedronApp application class.
Polyhedron.cpp This is the main application source file that contains the application class CPolyhedronApp.
Polyhedron.rc This is a listing of all of the Microsoft Windows resources that the program uses. It includes the icons, bitmaps, and cursors that are stored in the RES subdirectory. This file can be directly edited in Microsoft Developer Studio.
res\Polyhedron.ico This is an icon file, which is used as the application's icon. This icon is included by the main resource file Polyhedron.rc.
res\Polyhedron.rc2 This file contains resources that are not edited by Microsoft Developer Studio. You should place all resources not editable by the resource editor in this file.
Polyhedron.clw This file contains information used by ClassWizard to edit existing classes or add new classes. ClassWizard also uses this file to store information needed to create and edit message maps and dialog data maps and to create prototype member functions.
/////////////////////////////////////////////////////////////////////////////
For the main frame window:
MainFrm.h, MainFrm.cpp These files contain the frame class CMainFrame, which is derived from CFrameWnd and controls all SDI frame features.
/////////////////////////////////////////////////////////////////////////////
AppWizard creates one document type and one view:
PolyhedronDoc.h, PolyhedronDoc.cpp - the document These files contain your CPolyhedronDoc class. Edit these files to add your special document data and to implement file saving and loading (via CPolyhedronDoc::Serialize).
PolyhedronView.h, PolyhedronView.cpp - the view of the document These files contain your CPolyhedronView class. CPolyhedronView objects are used to view CPolyhedronDoc objects.
/////////////////////////////////////////////////////////////////////////////
Other standard files:
StdAfx.h, StdAfx.cpp These files are used to build a precompiled header (PCH) file named Polyhedron.pch and a precompiled types file named StdAfx.obj.
Resource.h This is the standard header file, which defines new resource IDs. Microsoft Developer Studio reads and updates this file.
/////////////////////////////////////////////////////////////////////////////
Other notes:
AppWizard uses "TODO:" to indicate parts of the source code you
should add to or customize.
If your application uses MFC in a shared DLL, and your application is
in a language other than the operating system's current language, you
will need to copy the corresponding localized resources MFC40XXX.DLL
from the Microsoft Visual C++ CD-ROM onto the system or system32 directory,
and rename it to be MFCLOC.DLL. ("XXX" stands for the language abbreviation.
For example, MFC40DEU.DLL contains resources translated to German.) If you
don't do this, some of the UI elements of your application will remain in the
language of the operating system.
/////////////////////////////////////////////////////////////////////////////
Краткое
описание библиотеки OpenGl
Библиотека OpenGl предназначена для моделирования
компьютерной графики на высоком уровне, и является программным интерфейсом к
аппаратному обеспечению. Главное назначение библиотеки -–преобразовывать 2-х и
3-хмерные объекты в специальный формат в специальном буфере. Эти объекты
описываются как последовательности точек в пространстве, которые определяют
геометрические объекты, или пикселов, которые определяют изображения. OpenGl
производит несколько последовательных операций обработки этих данных, чтобы сконвертировать их в
пикселы для формирования окончательного требуемого изображения в буфере.
          OpenGl
предоставляет Вам прямой доступ к контролю фундаментальных операций 2-х и
3-хмерной графики. Это включает спецификацию таких параметров как
трансформационные матрицы, коэффициенты уравнения освещения, методы сглаживания
и операторы модифицирования пикселов. Однако, OpenGl не предоставляет Вам
способы описания или моделирования сложных геометрических объектов. Таким
образом, команды OpenGl, которые Вы используете, определяют как определенный
результат должен быть выработан (какие процедуры должны использоваться), а не
как именно должен выглядеть результат. То есть OpenGl – библиотека процедурная,
а не описательная.
[Документ в стадии разработки. Примерно 5% от полного объема.]
//
PolySet.cpp : implementation file
//
#include
"stdafx.h"
#include
"Polyhedron.h"
#include
"PolySet.h"
#ifdef
_DEBUG
#define
new DEBUG_NEW
#undef
THIS_FILE
static
char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//
CPolySet dialog
CPolySet::CPolySet(CWnd*
pParent /*=NULL*/)
      : CDialog(CPolySet::IDD, pParent)
{
      //{{AFX_DATA_INIT(CPolySet)
      //эрчрыьэых чэрчхэшя
      m_Wired = FALSE;
      m_CameraDistance = 0.0f;
      m_RotLine_Dist = 0.0f;
      m_RotLine_Dir = -1;
      m_RotLine_Dispos = -1;
      //}}AFX_DATA_INIT
}
void
CPolySet::DoDataExchange(CDataExchange* pDX)
{
      CDialog::DoDataExchange(pDX);
      //{{AFX_DATA_MAP(CPolySet)
      DDX_Control(pDX, IDC_ROT_LINE_DISTANCE,
m_RotLine_DistEDIT);
      DDX_Control(pDX, IDC_CAMERADISTANCE,
m_CameraDistanceEDIT);
      DDX_Check(pDX, IDC_Wired, m_Wired);
      DDX_Text(pDX, IDC_CAMERADISTANCE,
m_CameraDistance);
      DDV_MinMaxFloat(pDX, m_CameraDistance,
20.f, 53.f);
      DDX_Text(pDX, IDC_ROT_LINE_DISTANCE,
m_RotLine_Dist);
      DDV_MinMaxFloat(pDX, m_RotLine_Dist, 0.f,
14.f);
      DDX_Radio(pDX, IDC_ROT_LINE_DIRECTION,
m_RotLine_Dir);
      DDX_Radio(pDX, IDC_ROT_LINE_DISPOSITION,
m_RotLine_Dispos);
      //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPolySet,
CDialog)
      //{{AFX_MSG_MAP(CPolySet)
      //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//
CPolySet message handlers
BOOL
CPolySet::OnInitDialog()
{
      CDialog::OnInitDialog(); //initialization
     
      // TODO: Add extra initialization here
      //юуЁрэшчхэшх ъюышчхёттр ёшьтюыют,
ттюфшьых т ётЁюъш ттюфр
      m_CameraDistanceEDIT.LimitText (2);
      m_RotLine_DistEDIT.LimitText (2);
      return TRUE;  // return TRUE unless you set the focus to a control
            
       // EXCEPTION: OCX Property
Pages should return FALSE
}
//
stdafx.cpp : source file that includes just the standard includes
//    Polyhedron.pch will be the pre-compiled
header
//    stdafx.obj will contain the pre-compiled
type information
#include
"stdafx.h"
//
MainFrm.h : interface of the CMainFrame class
//
/////////////////////////////////////////////////////////////////////////////
class
CMainFrame : public CFrameWnd
{
protected:
// create from serialization only
      CMainFrame();
      DECLARE_DYNCREATE(CMainFrame)
//
Attributes
public:
//
Operations
public:
//
Overrides
      // ClassWizard generated virtual function
overrides
      //{{AFX_VIRTUAL(CMainFrame)
      protected:
      virtual BOOL
PreCreateWindow(CREATESTRUCT& cs);
      //}}AFX_VIRTUAL
//
Implementation
public:
      virtual ~CMainFrame();
#ifdef
_DEBUG
      virtual void AssertValid() const;
      virtual void Dump(CDumpContext& dc)
const;
#endif
protected:  // control bar embedded members
      CToolBar    m_wndToolBar; //toolbar
//
Generated message map functions
protected:
      //{{AFX_MSG(CMainFrame)
    afx_msg int OnCreate(LPCREATESTRUCT
lpCreateStruct);
      afx_msg void OnPaletteChanged(CWnd*
pFocusWnd);
      afx_msg BOOL OnQueryNewPalette();
      //}}AFX_MSG
      DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
//
Microsoft Developer Studio will insert additional declarations immediately
before the previous line.
//#include
"polyhedron.h"
//CObjectClass
ObjectClass;
//
Polyhedron.h : main header file for the POLYHEDRON application
//
#ifndef
__AFXWIN_H__
      #error include 'stdafx.h' before including
this file for PCH
#endif
#include
"resource.h"       // main
symbols
/////////////////////////////////////////////////////////////////////////////
//
CPolyhedronApp:
// See
Polyhedron.cpp for the implementation of this class
//
class
CPolyhedronApp : public CWinApp
{
public:
      CPolyhedronApp();
//
Overrides
      // ClassWizard generated virtual function
overrides
      //{{AFX_VIRTUAL(CPolyhedronApp)
      public:
      virtual BOOL InitInstance();
      //}}AFX_VIRTUAL
//
Implementation
      //{{AFX_MSG(CPolyhedronApp)
      afx_msg void OnAppAbout();
            // NOTE - the ClassWizard will add
and remove member functions here.
            //    DO NOT EDIT what you see in these blocks of generated code !
      //}}AFX_MSG
      DECLARE_MESSAGE_MAP()
};
class
CObjectClass : public CObject
{
public:
      int m_Polyhedron;
public:
      CObjectClass();
};
/////////////////////////////////////////////////////////////////////////////
#if
!defined(AFX_POLYHEDRONACTION_H__4A48FA21_DAFE_11D1_9BE0_D55CA1D1FF4E__INCLUDED_)
#define
AFX_POLYHEDRONACTION_H__4A48FA21_DAFE_11D1_9BE0_D55CA1D1FF4E__INCLUDED_
//Ич
ТЗ: Ёрчфхы уЁрфшчхёъющ сшсышютхъш,
//юяшёытрющшщ
Пыртюэюты тхыр ш фуэъцшш фыя Ёрсюты ё эшьш
#if
_MSC_VER >= 1000
#pragma
once
#endif
// _MSC_VER >= 1000
//
PolyhedronAction.h : header file
//
//яюфъыючхэшх
сшсышютхъ OpenGL
#include
"gl\gl.h"
#include
"gl\glu.h"
#include
"gl\glaux.h"
/////////////////////////////////////////////////////////////////////////////
//
CPolyhedronAction window
class
CPolyhedronAction
{
//
Construction
public:
      CPolyhedronAction();
//
Attributes
public:
//
Operations
public:
//
Implementation
public:
    GLfloat 
wAngle; //ууюы яютюЁютр
      virtual ~CPolyhedronAction();
      //Rendering setup
      void DefineMaterialf(float mat_emitter[4],
float mat_specular[4],
                                   float
icosahedron_diffuse[4], float specular_exponent);
      void Create(int m_Polyhedron, bool
m_Wired);
      void Movement(bool m_Dir, int m_Dispos,
float m_CameraDistance, float m_Dist);
//bool
m_Dir - эряЁртыхэшх тЁхщхэшя (false - clockwize)
//int
m_Dispos - юёь тЁрщхэшя
//float
m_CameraDistance - Ёрёётюяэшх ют юёш фю ърьхЁы
//float
m_Dist - Ёрёётюяэшх ют тхыр фю юёш тЁрщхэшя
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
//
Microsoft Developer Studio will insert additional declarations immediately
before the previous line.
#endif
// !defined(AFX_POLYHEDRONACTION_H__4A48FA21_DAFE_11D1_9BE0_D55CA1D1FF4E__INCLUDED_)
//
PolyhedronDoc.h : interface of the CPolyhedronDoc class
//
/////////////////////////////////////////////////////////////////////////////
class
CPolyhedronDoc : public CDocument
{
public:
      int m_Polyhedron;       //тшя тхыр
      int m_RotLine_Dir;           //эряЁртыхэшх тЁрщхэшя
      int m_RotLine_Dispos;   //юёь тЁрщхэшя
      float m_RotLine_Dist;   //Ёрёётюяэшх фю юёш тЁрщхэшя
      float m_PolySetEdge;    //фышэр ЁхсЁр
      float m_CameraDistance; //Ёрёётюяэшх ют юёш фю ърьхЁы
      bool m_Wired;                //фыру фюЁьы тхыр
protected:
// create from serialization only
      CPolyhedronDoc();
      DECLARE_DYNCREATE(CPolyhedronDoc)
//
Attributes
public:
//
Operations
public:
//
Overrides
      // ClassWizard generated virtual function
overrides
      //{{AFX_VIRTUAL(CPolyhedronDoc)
      public:
      virtual BOOL OnNewDocument();
      //virtual void Serialize(CArchive&
ar);
      //}}AFX_VIRTUAL
//
Implementation
public:
      virtual ~CPolyhedronDoc();
    virtual void Serialize(CArchive&
ar);   // overridden for document i/o
#ifdef
_DEBUG
      virtual void AssertValid() const;
      virtual void Dump(CDumpContext& dc)
const;
#endif
protected:
//
Generated message map functions
protected:
      //{{AFX_MSG(CPolyhedronDoc)
      afx_msg void OnPolyhedronDodecahedron();
      afx_msg void
OnUpdatePolyhedronDodecahedron(CCmdUI* pCmdUI);
      afx_msg void OnPolyhedronIcosahedron();
      afx_msg void
OnUpdatePolyhedronIcosahedron(CCmdUI* pCmdUI);
      afx_msg void OnPolyhedronOctahedron();
      afx_msg void
OnUpdatePolyhedronOctahedron(CCmdUI* pCmdUI);
      afx_msg void OnPolyhedronSettings();
      afx_msg void OnPolyhedronTetrahedron();
      afx_msg void
OnUpdatePolyhedronTetrahedron(CCmdUI* pCmdUI);
      afx_msg void OnPolyhedronHexahedron();
      afx_msg void
OnUpdatePolyhedronHexahedron(CCmdUI* pCmdUI);
      //}}AFX_MSG
      DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//
PolyhedronView.h : interface of the CPolyhedronView class
//
/////////////////////////////////////////////////////////////////////////////
#include
"PolyhedronDoc.h"
#include
"PolyhedronAction.h"
class
CPolyhedronView : public CView
{
protected:
В В В В В В В В В В В  CString m_ClassName;
В В В В В В В В В В В  CPolyhedronAction PolyhedronAct;
protected:
// create from serialization only
В В В В В В В В В В В  CPolyhedronView();
В В В В В В В В В В В  DECLARE_DYNCREATE(CPolyhedronView)
//
Attributes
public:
В В В В В В В В В В В  CPolyhedronDoc* GetDocument();
В В В  CPaletteВ В В  m_cPalette;
В В В  CPaletteВ В В  *m_pOldPalette;
В В В В В В В В В В В  CRectВ В В В В В В В В В В В В В  m_oldRect; //В В В В В 
В В В В В В В В В В В  floatВ В В В В В В В В В В В В В В В  m_fRadius;
В В В В В В В В В В В  CClientDCВ В В В В В В В  *m_pDC;
//
Operations
public:
В В В В В В В В В В В  void Init();
В В В В В В В В В В В  void CreateRGBPalette(void);В В В  //В В В В В В В 
В В В  BOOL bSetupPixelFormat(void);В В В В В В В  //В В В В В В В В В В В 
В В В  unsigned char ComponentFromIndex(int i,
UINT nbits, UINT shift);
В В В  void DrawScene(void);
// Overrides
В В В В В В В В В В В  // ClassWizard generated virtual
function overrides
В В В В В В В В В В В  //{{AFX_VIRTUAL(CPolyhedronView)
В В В В В В В В В В В  public:
В В В В В В В В В В В  virtual void OnDraw(CDC* pDC);В  // overridden to draw this view
В В В В В В В В В В В  protected:
В В В В В В В В В В В  //}}AFX_VIRTUAL
//
Implementation
public:
В В В В В В В В В В В  virtual ~CPolyhedronView();
В В В В В В В В В В В  virtual BOOL
PreCreateWindow(CREATESTRUCT& cs);
#ifdef
_DEBUG
В В В В В В В В В В В  virtual void AssertValid() const;
В В В В В В В В В В В  virtual void Dump(CDumpContext&
dc) const;
#endif
protected:
В В В В В В В В В В В  BOOLВ В  m_play;
//В В В В В В В В В  Play
// Generated
message map functions
protected:
В В В В В В В В В В В  //{{AFX_MSG(CPolyhedronView)
В В В  afx_msg void OnFilePlay();
В В В В В В В В В В В  afx_msg void
OnUpdateFilePlay(CCmdUI* pCmdUI);
В В В В В В В В В В В  afx_msg intВ  OnCreate(LPCREATESTRUCT lpCreateStruct);
В В В В В В В В В В В  afx_msg void OnDestroy();
В В В В В В В В В В В  afx_msg void OnSize(UINT nType, int
cx, int cy);
В В В В В В В В В В В  afx_msg void OnTimer(UINT nIDEvent);
В В В В В В В В В В В  afx_msg BOOL OnEraseBkgnd(CDC* pDC);
В В В В В В В В В В В  afx_msg void OnPause();
В В В В В В В В В В В  //}}AFX_MSG
В В В В В В В В В В В  DECLARE_MESSAGE_MAP()
};
#ifndef
_DEBUGВ  // debug version in
PolyhedronView.cpp
inline
CPolyhedronDoc* CPolyhedronView::GetDocument()
В В  { return (CPolyhedronDoc*)m_pDocument; }
#endif
/////////////////////////////////////////////////////////////////////////////
//
PolySet.h : header file
//
/////////////////////////////////////////////////////////////////////////////
//
CPolySet dialog
class
CPolySet : public CDialog
{
//
Construction
public:
      CPolySet(CWnd* pParent = NULL);   // standard constructor
//
Dialog Data
      //{{AFX_DATA(CPolySet)
      enum { IDD = IDD_POLY_SET };
      CEdit m_RotLine_DistEDIT;
      CEdit m_CameraDistanceEDIT;
      BOOL  m_Wired;
      float m_CameraDistance;
      float m_RotLine_Dist;
      int         m_RotLine_Dir;
      int         m_RotLine_Dispos;
      //}}AFX_DATA
//
Overrides
      // ClassWizard generated virtual function
overrides
      //{{AFX_VIRTUAL(CPolySet)
      protected:
      virtual void DoDataExchange(CDataExchange*
pDX);    // DDX/DDV support
      //}}AFX_VIRTUAL
//
Implementation
protected:
      // Generated message map functions
      //{{AFX_MSG(CPolySet)
      virtual BOOL OnInitDialog();
      //}}AFX_MSG
      DECLARE_MESSAGE_MAP()
};
//{{NO_DEPENDENCIES}}
//
Microsoft Developer Studio generated include file.
// Used
by Polyhedron.rc
//
#define
IDD_ABOUTBOX                    100
#define
IDR_MAINFRAME                   128
#define
IDR_POLYHETYPE                  129
#define
IDD_ROTATIONAROUNDPOINT         130
#define
IDD_ROTATIONAROUNDLINE          131
#define
IDD_FLYROUND                    132
#define
IDD_POLY_SET                    134
#define
IDB_BITMAP1                     147
#define
IDC_ROT_POINT_DIST              1000
#define
IDC_ROT_POINT_DIR               1001
#define
IDC_ROT_POINT_DIR2              1002
#define
IDC_ROT_LINE_DISPOSITION        1003
#define
IDC_ROT_LINE_DIS2               1004
#define
IDC_ROT_LINE_OZ                 1004
#define
IDC_ROT_LINE_DIRECTION          1005
#define
IDC_ROT_LINE_DIR2               1006
#define
IDC_ROT_LINE_DISTANCE           1007
#define
IDC_FLY_ROUND_DISTANCE          1008
#define
IDC_POLY_SET_EDGE               1009
#define
IDC_Wired                       1010
#define
IDC_ROT_LINE_OY                 1012
#define
IDC_CAMERADISTANCE              1013
#define
ID_ACTION_ROTATIONAROUNDPOINT   32771
#define
ID_ACTION_ROTATIONAROUNDLINE    32772
#define
ID_ACTION_FLYROUND              32773
#define
ID_ACTION_SETTINGS              32774
#define
ID_POLYHEDRON_TETRAHEDRON       32775
#define
ID_POLYHEDRON_HEXAHEDRON        32776
#define
ID_POLYHEDRON_OCTAHEDRON        32777
#define
ID_POLYHEDRON_DODECAHEDRON      32778
#define
ID_POLYHEDRON_SETTINGS          32779
#define
ID_START                        32781
#define
ID_BUTTON32789                  32789
#define
ID_PAUSE                        32791
#define
ID_OBJECT_SETTINGS              32792
#define
ID_FILE_PLAY                    32794
#define
ID_POLYHEDRON_ICOSAHEDRON       32795
#define
ID_ABOUT                        32799
// Next
default values for new objects
//
#ifdef
APSTUDIO_INVOKED
#ifndef
APSTUDIO_READONLY_SYMBOLS
#define
_APS_3D_CONTROLS                     1
#define
_APS_NEXT_RESOURCE_VALUE        148
#define
_APS_NEXT_COMMAND_VALUE         32800
#define
_APS_NEXT_CONTROL_VALUE         1014
#define
_APS_NEXT_SYMED_VALUE           101
#endif
#endif
Реферат.
Программный
продукт позволяет наглядно изучить строение и свойства платоновых тел, а также
позволяет начинающим программистам реализовать принцип обучения на примерах.
Продукт разработан на языке программирования Мicrosoft Visual C++ 5.0 с использованием
объектно-ориентированной методологии. При разработке была задействована
библиотека моделирования трехмерной графики OpenGL. Запуск программы возможен
только в операционной среде Microsoft Windows 95. Диалог пользователя с
программой, а именно введение параметров, осуществляется посредством диалоговых
окон программы. Диапазон вводимых значений программно ограничен, с целью
недопущения некорректной работы или возникновения ошибки.
Содержание.
1.
Теоретическая
часть……………………………………………………..3
1.1.
Введение…………………………………………………………………3
1.2.
Аналитический
обзор…………………………………………………...3
1.3.
Описание
математического аппарата аналитической геометрии……4
2.
Технический
и рабочий проекты программного продукта………...…5
2.1.
Уточнение
технических требований, сфрмулированных в теоретическом задании…………………………………………………5
2.2.
Постановка
задачи………………………………………………………5
2.3.
Подход
к решению задачи………………………………………...……5
2.4.
Выбор
программной среды, инструментальных средств разработки.6
2.5.
Разработка
функциональной структуры ПС, требований к отдельным подсистемам, системных
соглашения……………………7
2.6.
Реализация
диалогового интрефейса и выдачи результатов…………8
2.7.
Описание
алгоритмов решения функциональных задач………….….9
3.
Экспериментальная
часть…………………………………………….…9
3.1.
Эксплуатационная
документация на ПС………………………………9
3.1.1.
Описание
применения……………………………………………….9
3.1.2.
Руководство
пользователя…………………………………………..9
3.1.3.
Руководство
программиста………………………………………...12
3.1.4.
Контрольный
пример……………………………………………....12
1. Теоретическая часть.
1.1  Введение.
Платоновыми телами (правильными многогранниками)
называются такие выпуклые многогранники, все грани которых - правильные многоугольники и все
многогранные углы при вершинах равны между собой.
Актуальность разработки программного продукта,
позволяющего оперировать с платоновыми телами в качестве графических объектов,
подтверждается тем, что в современном программировании графики часто в качестве
объектов используются именно многогранники. Современное программное обеспечение
предоставляет пользователю большое количество решений этой проблемы. Но
преимущество данного программного продукта перед ними заключается в простоте
использования, а именно:
-
не требуется больших затрат ресурсов;
-
не требуется длительного изучения возможностей
программы для получения желаемого результата.
Также программа позволяет реализовать принцип
обучения на примерах, т.е. начинающий программист имеет возможность просмотреть
все исходные тексты программы, содержащие необходимые пояснения, и разобраться
в ее работе наглядно.
1.2  Аналитический обзор.
Существует ровно пять
правильных многогранников. Их основные характеристики приведены в следующей
таблице: Название Многогранника Число граней Число ребер Число вершин Тетраэдр 4 6 4 Гексаэдр 6 12 8 Октаэдр 8 12 6 Додекаэдр 12 30 20 Икосаэдр 20 30 12
Вывод изображения на экран
дисплея и разнообразные действия с ним, в том числе и визуальный анализ,
требуют от программиста определенной геометрической грамотности. Геометрические
понятия, формулы и факты, относящиеся прежде всего к плоскому и трехмерному
случаям, играют в задачах компьютерной графики особую роль. Геометрические
соображения, подходы и идеи в соединении с постоянно расширяющимися
возможностями вычислительной техники являются источником существенных
продвижений на пути развития компьютерной графики, ее эффективного
использования в научных и иных исследованиях.
Современное программное обеспечение предоставляет
программисту широкий спектр возможностей по работе с компьютерной графикой,
причем, как с двумерной, так и с трехмерной. В зависимости от поставленной
перед программистом задачи и уровня его подготовки, у него есть ряд
возможностей при разработке программы для работы с графикой. Во-первых,
программист может разработать программный продукт при помощи прямого
программирования аффинных преобразований на плоскости и в пространстве.
Во-вторых, он может воспользоваться уже созданными библиотеками для
моделирования графических объектов (например, библиотека OpenGL). В-третьих, существуют программные
продукты, посвященные графическому моделированию и не требующие написания кода
программы для работы с графикой (например, 3D-Studio).
1.3 Описание математического
аппарата аналитической геометрии.
Движение
графических объектов в пространстве осуществляется посредством аффинных
преобразований. Любое аффинное преобразование в трехмерном пространстве может
быть представлено в виде суперпозиции вращений, растяжений, отражений и
переносов. Каждая точка пространства (кроме начальной точки О) может быть
задана четверкой одновреммено не равных нулю чисел (hx, hy,hz,h); эта четверка
чисел определена однозначно с точностью до общего множителя.
Рассмотрим матрицы преобразований.
1) Матрицы вращения в пространстве
Матрица вращения вокруг оси абсцисс на угол j:
Матрица вращения вокруг оси
ординат на угол y:
Матрица вращения вокруг оси аппликат на угол c:
2) Матрица растяжения
(сжатия):
где
a>0 – коэффициент растяжения (сжатия) вдоль оси абсцисс;
b>0 – коэффициент растяжения (сжатия) вдоль оси ординат;
g>0 – коэффициент растяжения (сжатия) вдоль оси аппликат.
3) Матрицы отражения.    
Матрица отражения относительно плоскости xy:
Матрица отражения относительно плоскости yz:
Матрица отражения относительно плоскости zx:
4) Матрица переноса
где (l, m, n) - вектор переноса.
2.
Технический и рабочий проекты программного
продукта.
2.1 Уточнение технических требований, сформулированных в теоретическом
задании.
Для
успешного запуска программы и работы с ней необходимо выполнение ниже
перечисленных требований:
-
IBM-совместимый
компьютер с процессором Pentium 90;
-
VGA
видеокарта;
-
16 МВ
оперативной памяти;
-
операционная
система Microsoft Windows 95;
-
4 МВ
на жестком диске.
2.2  Постановка задачи.
Разработать раздел
графической библиотеки, описывающий платоновы тела и функции для работы с ними,
а также средство работы с ней. Программный продукт должен осуществлять
мониторинг вращения графического объекта (платонова тела) вокруг осей координат
(OX, OY, OZ).
2.3 Подход к решению задачи.
Подход
к решению задачи основан на объектно-ориентированной методологии. Но следует
отметить, что объектно-ориентированное программирование можно эффективно
использовать, если ему предшествуют объектно-ориентированный анализ задачи и
объективно-ориентированное проектирование программного комплекса. Без
объектно-ориентированного проекта попытки применения объектно-ориентированного
программирования являются по меньшей мере малоэффективными и весьма
трудоемкими.
Исходная
задача разбивается на следующие подзадачи:
-
разработка
интерфейса программы;
-
разработка
класса многогранников;
-
разработка
класса функций, позволяющих производить преобразование многогранников в
пространстве;
2.4 Выбор программной среды,
инструментальных средств разработки.
В
качестве программной среды выбран язык программирования Microsoft Visual C++
5.0, поскольку он основан на новейших технологиях программирования (например:
С++, программирование графического интерфейса Windows, фундаментальные
классы фирмы Microsoft
(Microsoft Foundation Classes)
и генераторы кода Wizard).
Microsoft
Visual C++ обеспечивает несколько различных путей написания программ для
GUI Windows (graphical user
interface). Во-первых, можно писать программы GUI на С и С++, напрямую обращаясь к
функциям, которые обеспечиваются находящимся внутри Win32 программным интерфейсом приложений
(API), и является
частью операционных систем Windows
95 и Windows NT.
Однако, используя этот подход, необходимо множество строк кода перед тем, как
появится возможность сосредоточиться на задаче, которая является особенной в
приложении.
Во-вторых, можно писать программы для GUI Windows на С++, используя
МFC (Microsoft Foundation
Classes). MFC обеспечивает
большой набор написанных классов, как и код поддержки, который может выполнять
много стандартных задач при программировании для Windows (таких, как создание окон с
обработкой сообщений). Также можно использовать MFC, чтобы быстро добавить к вашим
программам такие сложные элементы, как панель инструментов, разделенные окна
представлений. MFC может
упростить программы GUI
и сделать работу при программировании значительно проще.
В-третьих, можно писать GUI Windows программы на С++, используя
и MFC и мастер-блоки Microsoft
Wizard. Можно использовать AppWizard, чтобы сгенерировать основные исходные файлы для
разнообразных типов программ GUI.
Затем можно использовать интсрумент ClassWizard, чтобы создать большую часть кода, необходимого для
порождения классов; определить функции-члены для обработки сообщений или
настройки поведения MFC;
управлять блоками диалога и выполнить другие задачи. Код, сгенерированный с
использованием мастер-блоков Wizard,
полностью использует MFC.
Причем, мастер-блоки Wizard
не ограничиваются только генерацией оболочек простых программ, а, напротив,
может быть использован для создания программ, содержащих большой набор сложных
компонентов.
Используя этот третий подход, можно получить пользу
не только от кода, уже написанного в MFC, но и от сгенерированного исходного кода, который использует MFC и решает множество задач
программирования. MFC и
мастер-блоки Wizard
облегчают усилия по созданию визуального интерфейса программы и помогают
убедиться, что этот интерфейс согласуется с описаниями (guidelines) Microsoft.
Разработка программы велась на базе третьего и
самого высокоуровневого способа написания программ для GUI Windows.
2.5 Разработка функциональной структуры программного продукта, требований к
отдельным подсистемам, системных соглашений.
Функциональная структура
программного продукта содержит следующие классы:
§
CpolyhedronApp – основной класс приложения, наследуемый от CWinApp
§
CmainFraim – класс окна, наследуемый от CframeWnd и
контролирующий все свойства и особенности окна приложения
§
CpolyhedronDoc – класс документа приложения, наследуемый от CDocument.
Документ – это совокупность всех или части данных, используемых приложением, в
том числе значения параметров, указываемых пользователем и т.д. Приложение
может иметь несколько документов, хотя в нашем случае документ всего один.
§
CpolyhedronView – класс, позволяющий
отображать содержимое класса CPolyhedronDoc. Наследуется от Cview. В
нашем случае служит в том числе и для отображения платоновых тел по параметрам
из CpolyhedronDoc.
§
CpolyhedronAction – класс, содержащий функции
для создания и действий над платоновыми телами.
§
CpolySet, CaboutDlg – классы, наследуемые от Cdialog и
служащие для построения и работы с диалоговым окном настроек программы и
диалоговым окном About.
Подробное дерево классов
программного продукта с перечислением всех функций и переменных прилагается.
Системные соглашения:
1.
Задание
всех параметров требуемых в техническом задании операций, таких как координаты
точек, уравнения прямых и т.п. ведет к значительному усложнению работы с программой
и требует дополнительных знаний и усилий от пользователя. Всвязи с этим
вводятся ограничения на производимые операции: например, вращение вокруг линии
реализуется только вокруг координатных осей. Но результатом введения подобных
ограничений является то, что операции вращения вокруг точки и облета тела
сводятся к уже реализованному вращению вокруг линии.
 На примере облета тела: при допущении, что облет
тела производится по окружности заданного радиуса, существуют два
принципиальных варианта облета: с камерой, направленной
постоянно на тело, и с камерой, направленной по касательной к траектории
движения. Первый из этих вариантов сводится к вращению тела вокруг собственной
оси на определенном расстоянии от камеры при расположении тела по центру экрана,
второй – к вращению тела вокруг собственной оси при расположении тела с краю
экрана так, что видна лишь его часть.
В связи с вышеизложенным
операции вращения вокруг точки и облета тела не представляют интереса и не
будут реализованы. Также становятся ненужными некоторые параметры из
предусмотренных ранее, которые также не будут реализованы.
2.
Ввод
параметра расстояния до камеры позволяет зрительно задать длину ребра тела, и
вместе с тем расширяет возможности программы. Всвязи с этим параметр длины
ребра тела в программе заменен вышеуказанным параметром.
3.
Всвязи с изменением
набора функций и параметров программы, а также введением дополнительных
элементов интерфейса, таких как панель инструментов, изменен первоначальный
проект интерфейса. Подробное его описание содержится в руководстве
пользователя.
4. Выбранные програмные
средства позволяют моделировать движение тела за пределами видимого
пространства, тем самым ограничения на выход тела за пределы экрана
представляется лишним и суживающим возможности программы. Контроль входных
данных не будет заключаться в недопущении этого, однако будет производиться
контроль, предотвращающий появление ошибок.
2.6 Реализация диалогового
интерфейса и выдачи результатов.
Структура
диалогового интерфейса программного продукта показана на рис. 4.6.1.
рис. 4.6.1. Структура диалогового
интерфейса.
Интерфейс
представляет собой стандартное окно Windows, состоящее из панели меню,
панели интсрументов и окна представления. На панели меню представлено меню Polyhedron. Это меню
представляет собой список из 5 правильных многогранников и пункта Settings, открывающего меню
параметров программы. Выбранный многогранник выделяется в этом меню галочкой.
На панели инструментов имеется 3 кнопки. Первая кнопка осуществляет запуск
движения многогранника, вторая – его остановку, а третья – непосредственное
открытие меню параметров Settings.
Выдача
результатов осуществляется в окне представления. Результатом работы
программы является движение платонова тела с учетом заданных пользователем
параметров.
2.7 Описания алгоритмов решения
функциональных задач.
Реализация 3-хмерной графики с помощью библиотеки OpenGL базируется на основе
принципов аффинных преобразований в пространстве. Также очень важно понятие
камеры – образно говоря, некого виртуального окна в трехмерном пространстве.
Все то, что отображается в графическом окне приложения, мы видим посредством
камеры. Еще одно важное понятие – это понятие матрицы, описывающей объекты в
пространстве – фактически, некой трехмерной модели пространства. На основе этих
понятий решается основная функциональная задача проекта – вращение платоновых
тел.
            Алгоритм
решения этой задачи строится следующим образом:
Вначале двигаем камеру на заданное расстояние “к пользователю” по оси OZ для того, чтобы иметь возможность
смотреть на платоновое тело “со
стороны”, т.к.
изначально камера находится в начале координат, где впоследствии и создается
тело. Затем сдвигаем начало координат на заданное расстояние относительно
заданной оси – оси вращения – для того, чтобы ось вращения была от тела
удалена, и создаем платоновое тело. Решение функциональной задачи создания
платонового тела интереса не представляет, т.к. с помощью библиотеки OpenGL это делается вызовом
всего лишь одной определенной функции. Тело создается в начале координат. После
создания платонового тела оно поворачивается относительно оси вращения на
определенный угол, значение которого постоянно увеличивается или уменьшается в
зависимости от направления вращения. Так как данная последовательность действий
выполняется в цикле, тело постоянно сдвигается на все больший (меньший) угол,
чем и достигается вращение, в то время как все остальные параметры остаются
неизменными.
            Все
процедуры сдвига начала координат, поворота и т.п. достигаются, как это и было
описано ранее, с помощью аффинных
преобразований, путем умножения матрицы, описывающей трехмерное пространство,
на матрицы поворота, сдвига и т.п. Для каждого такого действия предусмотрены
функции библиотеки OpenGL.
3.  Экспериментальная
часть.
3.1 Эксплуатационная
документация на программный продукт.
3.1.1
Описание применения.
Программный
продукт "Polyhedron" может применяться:
-
для
наглядного изучения строения и свойств платоновых тел;
-
для
обучения на примерах начинающих программистов.
3.1.2
Руководство пользователя.
Внимание!
За возможные ошибки, сбои, возможный причиненный
моральный или материальный ущерб и т.д., авторы ответственности не несут. Вы
используете программу на свой страх и риск!
Если вы не согласны с этим, то не используйте
данную программу!
Введение
Авторы руководства пользователя приглашают вас
познакомиться с основными возможностями «Polyhedron». Мы предоставляем совершенно новую возможность для
изучения платоновых тел в пространстве на персональном компьютере. Результатом
разработки является более простой и наглядный способ изучения платоновых тел в
пространстве. Руководство пользователя написано для всех, кто не знаком с
платоновыми телами. Если Вы являетесь опытным пользователем персонального
компьютера, то нижеследующий текст, возможно, будет Вам не интересен.
Руководство пользователя явится для Вас обширным справочным руководством,
помогающим разобраться в программном продукте «Polyhedron».
Для того, чтобы запустить программный продукт необходимо наличие на вашем персональном
компьютере:
-
операционной
системы Windows 95;
-
Floppy
Disk Drive 3,5”.
Вставте нашу дискету в свой дисковод. Затем
скопируйте все файлы в заранее созданную директорию.
Поместите острие стрелки на файл Polyhedron.ехе,
затем щелкните левой кнопкой мыши два раза. Перед вами появится окно
программного продукта «Polyhedron» (см. рис. 1).
рис. 3.1.2.1.Окно программного
продукта.
Для начала Вы можете просмотреть контрольный пример, наведя курсор мыши на
кнопку  “Play” и нажать левую кнопку мыши. Чтобы
поменять платоново тело подведите курсор мышы на слово Polyhedron. Затем
нажмите левую кнопку мыши, чтобы открыть меню (см. рис. 2).
рис. 3.1.2.2. Меню Polyhedron.
Обратите внимание на то, что рядом с пунктами меню
указаны клавиши, которые позволяют сразу выбрать соответствующий пункт, не
открывая подменю, или нажать клавишу соответствующей первой букве пункта.
Выбрав пункт Settings откроется диалоговое окно (см. рис. 3).
рис. 3.1.2.3. Диалоговое
окно.
В этом диалоговом окне Вы можете поменять следующие
параметры:
-
длину
ребра платонового тела (Length of edge);
-
дистанция
до камеры (Distance to the camera);
-
расстояние
до оси вращения (Distance to the axis);
-
ось вращения (Rotation axis):
-
вращение вокруг оси OX,
-
вращение вокруг оси OY,
-
вращение вокруг оси OZ;
-
направление вращения (Direction):
-
по часовой стрелке (clockwise),
-
против часовой стрелки (counterclockwise);
-
структуру тела – решетчатую или сплошную (флажок Wired)
Закончив
выбор, нажмите на кнопку OK.
После завершения выбора параметров, результат можно
просмотреть, подведя курсор
мыши на кнопку “Play” и нажав левую кнопку мыши. 
Функциональные
клавиши
Ctrl+1
или Alt+P и Т – Тетраэдр (Tetrahedron);
Ctrl+2
или Alt+P и Н –
Гексаэдр (Hexahedron);
Ctrl+3
или Alt+P и О – Октаэдр
(Octahedron);
Ctrl+4
или Alt+P и D –
Додекаэдр (Dodecahedron);
Ctrl+5
или Alt+P и I – Икосаэдр
(Icosahedron);
Ctrl+P
или Alt+P и S – Установки
(Settings).
3.1.3
Руководство программиста.
3.1.4
Контрольный пример.
Контрольный пример предоставлен в виде заданных по
умолчанию значений параметров задачи:
Осуществляется
вращение по часовой стрелке не решетчатого тетраэдра вокруг оси ОХ на
расстоянии 10 и при расположении камеры на расстоянии 50 до оси вращения.
Список используемой
литературы.
1.
Янг
М. Microsoft Visual C++ 4 для профессионалов. - М.:ЭНТРОП, 1997.
2.
Шикин
А.В., Боресков А.В. Компьютерная графика. Динамика, реалистические
изображения.- М.:ДИАЛОГ-МИФИ, 1996.
3.
Подбельский
В.В. Язык С++. – М.:Финансы и статистика, 1996.
//
stdafx.h : include file for standard system include files,
//  or project specific include files that are
used frequently, but
//      are changed infrequently
//
#define
VC_EXTRALEAN         // Exclude
rarely-used stuff from Windows headers
#include
<afxwin.h>         // MFC core and
standard components
#include
<afxext.h>         // MFC
extensions
#ifndef
_AFX_NO_AFXCMN_SUPPORT
#include
<afxcmn.h>                // MFC
support for Windows 95 Common Controls
#endif
// _AFX_NO_AFXCMN_SUPPORT
Техническое задание
1. Введение.
Платоновыми телами
(правильными многогранниками) называются такие выпуклые многогранники, все
грани которых правильные многоугольники и все многогранные углы при вершинах
равны между собой.
Существует ровно пять
правильных многогранников. Их основные характеристики приведены в следующей
таблице. Название многогранника Число граней Число ребер Число вершин Тетраэдр 4 6 4 Гексаэдр 6 12 8 Октаэдр 8 12 6 Додекаэдр 12 30 20 Икосаэдр 20 30 12
Описываемый программный
продукт состоит из раздела библиотеки, посвященного платоновым телам, и
приложения для графического интерфейса пользователя (graphical
user interface – GUI) Windows, позволяющего при помощи
раздела библиотеки выполнять следующие операции над правильными многогранниками:
-
вращение
тела вокруг заданной точки;
-
вращение
тела вокруг заданной оси;
-
облет
тела.
Актуальность разработки
заключается в возможности наглядного изучения платоновых тел с использованием
разработанного раздела.
Платоновы тела выбраны
потому, что являются часто используемыми при анимации различных графических
изображений и т.д.
2.
Основание для разработки.
Основанием для разработки курсового проекта
послужил план специальности 220100 "Вычислительные машины, системы,
комплексы и сети" по дисциплине "Алгоритмические языки и
программирование" за второй курс.
3. Назначение разработки.
Назначением разработки являются
раздел графической библиотеки, описывающий платоновы тела и функции для работы
с ними, а также средство работы с этим разделом, представляющее собой
приложение Windows, разработанное на основе графического интерфейса
пользователя.
4.
Требования к программе и программному продукту.
4.1. Функциональные характеристики.
Программный продукт
позволяет пользователю выполнять следующие функции:
-
выбор типа ГРО;
-
создание графического объекта;
-
ввод параметров объекта и выполняемой им функции;
-
демонстрация объектом выбранной пользователем функции.
Создание графического объекта происходит в момент выбора пользователем типа
многогранника из списка многогранников, появляющегося после "нажатия"
пользователем кнопки Polyhedron.
Ввод параметров многогранника, а именно длины его ребра, осуществляется
в диалоговом окне, открываемом при "нажатии" кнопки Settings, находящейся в меню Polyhedron. Выбор функции,
выполняемой многогранником, производится из меню Action. При "нажатии" кнопки Settings
в этом же меню, открывается диалоговое окно, позволяющее ввести
параметры функций. Просмотр начинается после "нажатия" кнопки Start и останавливается после
"нажатия" кнопки Stop.
Просмотр можно осуществлять без изменения каких-либо параметров, т.е. в начале
работы программы все необходимые параметры предустановленны и не требуют
обязательного описания.
4.2. Организация входных/выходных данных.
          Входными
данными являются параметры многоугольника (тип, длина ребра), тип выполняемой
им функции, параметры выбранной функции, а также размер окна представления.
Описание входных данных содержится в следующей таблице. Имя Семантика Тип Размер памяти Диапазон изменения m_Polyhedron тип многоугольника целое 2б 1-5 m_Edge длина ребра целое 2б * m_Action тип функции целое 2б 1-3 m_RotPoint_Dir направление при движении вокруг точки целое 2б * m_RotPoint_Dist расстояние от объекта до точки целое 2б * m_RotLine_Dir направление при движении вокруг линии целое 2б * m_RotLine_Dispos расположение линии в пространстве целое 2б * m_RotLine_Dist расстояние от объекта до линии целое 2б * m_FlyRound_Dist расстояние до объекта при облете целое 2б * Cx текущее максимальное значение Х окна представления целое 2б ** Cy текущее максимальное значение Y окна представления целое 2б **
*Диапазон изменения параметра не определен, т.к. он
зависит от размера окна представления.
**Диапазон изменения параметра не определен, т.к. он
определяется режимом работы видеоадаптера.
            Выходными
данными является построенный графический объект, по параметрам пользователя и
демонстрация его в движении.
4.3. Требования к надежности.
          Для
обеспечения устойчивой работы программы необходимо выполнение контроля
входной/выходной информации. Контроль заключается в проверке вводимых данных на
возникновение ошибки. Причиной возникновения ошибок могут послужить неверно
введенные данные, например, значения параметров, повлекшие выход изображения за
пределы окна представления.
            Время восстановления
после отказа определяется временем перезагрузки операционной системы Windows и
повторного запуска программы.
4.4. Требования к составу и параметрам технических
средств.
          Для
успешного выполнения программы необходимо выполнение ниже перечисленных
требований:
-    IBM-совместимый компьютер;
-
VGA видеоадаптер;
-
16 МВ оперативной памяти;
-
10 МВ на жестком диске;
-
операционная система Microsoft Windows 95.
4.5. Требования к информационной и программной
совместимости.
          Выполнение программы
необходимо осуществлять в операционной системе Microsoft
Windows 95.
5. Требования к
программной документации.
          Программная документация
содержит:
-
описание применения;
-
руководство пользователя (оператора);
-
руководство программиста.
6.
Стадии и этапы разработки.
6.1. Стадия
аналитической разработки:
-
ознакомление
с теоретическим материалом;
-
аналитическая
обработка теоретической информации.
6.2. Стадия
программной разработки:
-
формирование программы как отдельных структур;
-
разработка и отладка полученных структур;
-
объединение структур и формирование единой программы.
7.
Порядок сдачи работы.
7.1. При сдаче работы производится демонстрация на ЭВМ разработанной
программы на контрольном примере.
7.2. Копии всех документов включают:
-
исходный текст программы;
-
загрузочные модули;
-
текстовую документацию.
Копии передаются на магнитном носителе на кафедру не
позднее, чем за 3 дня до защиты.
Утверждаю:___________________
 
 __________________
//
MainFrm.cpp : implementation of the CMainFrame class
//
#include
"stdafx.h"
#include
"Polyhedron.h"
#include
"PolyhedronView.h"
#include
"MainFrm.h" //header file linking
#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)
      ON_WM_CREATE()
      ON_WM_PALETTECHANGED()
      ON_WM_QUERYNEWPALETTE()
      ON_COMMAND(ID_ABOUT,
CPolyhedronApp::OnAppAbout)
      //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//
arrays of IDs used to initialize control bars
     
//
toolbar buttons - IDs are command buttons
static
UINT BASED_CODE buttons[] =
{
      // same order as in the bitmap
'toolbar.bmp'
      ID_FILE_PLAY,
      ID_PAUSE,
      ID_OBJECT_SETTINGS,
};
/////////////////////////////////////////////////////////////////////////////
//
CMainFrame construction/destruction
CMainFrame::CMainFrame()
{
      // TODO: add member initialization code
here
     
}
CMainFrame::~CMainFrame()
{
}
int
CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
      if (CFrameWnd::OnCreate(lpCreateStruct) ==
-1)
            return -1;
      SIZE sz1 = {20,18};
      SIZE sz2 = {22,20};
      //toolbar creation
      if (!m_wndToolBar.Create(this) ||
            !m_wndToolBar.LoadBitmap(IDR_MAINFRAME)
||
            !m_wndToolBar.SetButtons(buttons,
             
sizeof(buttons)/sizeof(UINT)))
      {
            TRACE0("Failed to create
toolbar\n");
            return -1;      // fail to create
      }
      // TODO: Delete these three lines if you
don't want the toolbar to
      // 
be dockable
      m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
      EnableDocking(CBRS_ALIGN_ANY);
      DockControlBar(&m_wndToolBar);
      // TODO: Remove this if you don't want
tool tips
      m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle()
|
            CBRS_TOOLTIPS | CBRS_FLYBY);
      return 0;
}
/////////////////////////////////////////////////////////////////////////////
//
CMainFrame diagnostics
#ifdef
_DEBUG
void
CMainFrame::AssertValid() const
{
      CFrameWnd::AssertValid();
}
void
CMainFrame::Dump(CDumpContext& dc) const
{
      CFrameWnd::Dump(dc);
}
#endif
//_DEBUG
/////////////////////////////////////////////////////////////////////////////
//
CMainFrame message handlers
void
CMainFrame::OnPaletteChanged(CWnd* pFocusWnd)
{
      CFrameWnd::OnPaletteChanged(pFocusWnd);
     
      if(pFocusWnd != this)
            OnQueryNewPalette();
}
BOOL
CMainFrame::OnQueryNewPalette()
{
      WORD        i;
      CPalette    *pOldPal;
      CPolyhedronView   *pView = (CPolyhedronView *)GetActiveView();
      CClientDC   dc(pView);
      pOldPal =
dc.SelectPalette(&pView->m_cPalette, FALSE);
      i = dc.RealizePalette();
      dc.SelectPalette(pOldPal, FALSE);
      if(i > 0)
            InvalidateRect(NULL);
     
     
      return CFrameWnd::OnQueryNewPalette();
}
BOOL
CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
    // remove this flag to remove " -
Untitled" from the frame's caption
    cs.style &= ~ FWS_ADDTOTITLE;
     
      return CFrameWnd::PreCreateWindow(cs);
}
//
ObjectClass.cpp : implementation file
//
#include
"stdafx.h"
#include
"Polyhedron.h"
#include
"ObjectClass.h"
#ifdef
_DEBUG
#define
new DEBUG_NEW
#undef
THIS_FILE
static
char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//
CObjectClass
CObjectClass::CObjectClass()
{
}
CObjectClass::~CObjectClass()
{
}
BEGIN_MESSAGE_MAP(CObjectClass,
CPolyhedronDoc)
      //{{AFX_MSG_MAP(CObjectClass)
            // NOTE - the ClassWizard will add
and remove mapping macros here.
      //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//
CObjectClass message handlers
//
Polyhedron.cpp : Defines the class behaviors for the application.
//
#include
"stdafx.h"
#include
"Polyhedron.h"
#include
"MainFrm.h"
#include
"PolyhedronView.h"
#ifdef
_DEBUG
#define
new DEBUG_NEW
#undef
THIS_FILE
static
char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//
CPolyhedronApp
BEGIN_MESSAGE_MAP(CPolyhedronApp,
CWinApp)
      //{{AFX_MSG_MAP(CPolyhedronApp)
      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()
/////////////////////////////////////////////////////////////////////////////
//
CPolyhedronApp construction
CPolyhedronApp::CPolyhedronApp()
{
      // TODO: add construction code here,
      // Place all significant initialization in
InitInstance
}
CObjectClass::CObjectClass()
{
      // TODO: add construction code here,
}
/////////////////////////////////////////////////////////////////////////////
// The
one and only CPolyhedronApp object
CPolyhedronApp
theApp;
/////////////////////////////////////////////////////////////////////////////
//
CPolyhedronApp initialization
BOOL
CPolyhedronApp::InitInstance()
{
      // 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
      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(CPolyhedronDoc),
            RUNTIME_CLASS(CMainFrame),       // main SDI frame window
            RUNTIME_CLASS(CPolyhedronView));
      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;
      m_pMainWnd->SetWindowText
("Polyhedron"); //чруюыютюъ юъэр
     
    // create a new (empty) document
      OnFileNew();
    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
CPolyhedronApp::OnAppAbout() // "About" dialog handling
{
      CAboutDlg aboutDlg;
      aboutDlg.DoModal(); //тычют юъэр About
}
/////////////////////////////////////////////////////////////////////////////
//
CPolyhedronApp commands
//
PolyhedronAction.cpp : implementation file
//
#include
"stdafx.h"
#include
"Polyhedron.h"
#include
"PolyhedronAction.h"
//В В В В В В В В В В В  OpenGL
#include
"gl\gl.h"
#include
"gl\glu.h"
#include
"gl\glaux.h"
#ifdef
_DEBUG
#define new
DEBUG_NEW
#undef
THIS_FILE
static char
THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//
CPolyhedronAction
CPolyhedronAction::CPolyhedronAction()
{
}
CPolyhedronAction::~CPolyhedronAction()
{
}
//Rendering
setup
void
CPolyhedronAction::DefineMaterialf(float mat_emitter[4], float mat_specular[4],
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  float
icosahedron_diffuse[4], float specular_exponent)
{
В В В  glMaterialfv(GL_FRONT, GL_EMISSION,
mat_emitter);
В В В  glMaterialfv(GL_FRONT, GL_SPECULAR,
mat_specular);
В В В  glMaterialf(GL_FRONT, GL_SHININESS,
specular_exponent);
В В В В В В В В В В В  glMaterialfv(GL_FRONT, GL_DIFFUSE,
icosahedron_diffuse);
}
void
CPolyhedronAction::Create(int m_Polyhedron, bool m_Wired)
{
В В В В В В В В В В В В В В В В В В В В В В В  // ***В В  :В В В В В В В В В В В  В ,В В В В В В В В 
В В В В В В В В В В В  switch (m_Polyhedron)
В В В В В В В В В В В  {
В В В В В В В В В В В В В В В В В В В В В В В  case 1 :
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  {
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  if
(m_Wired)
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  auxWireTetrahedron(1.0f);
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  else
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  auxSolidTetrahedron(1.0f);
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  break;
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  }
В В В В В В В В В В В В В В В В В В В В В В В  case 2 :
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  {
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  if
(m_Wired)
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  auxWireCube(1.0f);
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  else
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  auxSolidCube(1.0f);
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  break;
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  }
В В В В В В В В В В В В В В В В В В В В В В В  case 3 :
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  {
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  if
(m_Wired)
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  auxWireOctahedron(1.0f);
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  else
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  auxSolidOctahedron(1.0f);
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  break;
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  }
В В В В В В В В В В В В В В В В В В В В В В В  case 4 :
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  {
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  if
(m_Wired)
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  auxWireDodecahedron(1.0f);
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  else
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  auxSolidDodecahedron(1.0f);
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  break;
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  }
В В В В В В В В В В В В В В В В В В В В В В В  case 5 :
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  {
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  if
(m_Wired)
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  auxWireIcosahedron(1.0f);
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  else
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  auxSolidIcosahedron(1.0f);
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  break;
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  }
В В В В В В В В В В В  }
}
void
CPolyhedronAction::Movement(bool m_Dir, int m_Dispos,
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  float
m_CameraDistance, float m_Dist)
{
В В В В В В В В В В В  wAngle=abs(wAngle)*(2*m_Dir-1);
В В В В В В В В В В В  //В В В В  ,В В В В В В В В В В В В В В В В В В В 
В В В В В В В В В В В  glTranslatef(0.0f, 0.0f,
-m_CameraDistance/10);
В В В В В В В В В В В  //В В В В В В В 
В В В В В В В В В В В  /// *****В В В В 
В В В В В В В В В В В В В В В В В В В В В В В  switch (m_Dispos)
В В В В В В В В В В В В В В В В В В В В В В В  {
В В В В В В В В В В В В В В В В В В В В В В В  case 0:
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  {
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  glRotatef(wAngle,
1.0f, 0.0f, 0.0f);
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  glTranslatef(0.0f,
m_Dist/10, 0.0f);
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  break;
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  }
В В В В В В В В В В В В В В В В В В В В В В В  case 1:
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  {
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  glRotatef(wAngle,
0.0f, 1.0f, 0.0f);
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  glTranslatef(m_Dist/10,
0.0f, 0.0f);
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  break;
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  }
В В В В В В В В В В В В В В В В В В В В В В В  case 2:
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  {
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  glRotatef(wAngle,
0.0f, 0.0f, 1.0f);
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  glTranslatef(0.0f,
m_Dist/10, 0.0f);
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  break;
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  }
В В В В В В В В В В В В В В В В В В В В В В В  }
В В В В В В В В В В В В В В В В В В В В В В В  wAngle +=
3.0f*(2*m_Dir-1);
В В В В В В В В В В В В В В В В В В В В В В В  return;
};
//
PolyhedronDoc.cpp : implementation of the CPolyhedronDoc class
//
#include
"stdafx.h"
#include
"Polyhedron.h"
#include
"PolyhedronDoc.h" //header file linking
#include
"PolySet.h" //"Settings" dialog
#ifdef
_DEBUG
#define
new DEBUG_NEW
#undef
THIS_FILE
static
char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//
CPolyhedronDoc
IMPLEMENT_DYNCREATE(CPolyhedronDoc,
CDocument)
BEGIN_MESSAGE_MAP(CPolyhedronDoc,
CDocument)
      //{{AFX_MSG_MAP(CPolyhedronDoc)
      ON_COMMAND(ID_POLYHEDRON_DODECAHEDRON,
OnPolyhedronDodecahedron)
      ON_UPDATE_COMMAND_UI(ID_POLYHEDRON_DODECAHEDRON,
OnUpdatePolyhedronDodecahedron)
      ON_COMMAND(ID_POLYHEDRON_ICOSAHEDRON,
OnPolyhedronIcosahedron)
      ON_UPDATE_COMMAND_UI(ID_POLYHEDRON_ICOSAHEDRON,
OnUpdatePolyhedronIcosahedron)
      ON_COMMAND(ID_POLYHEDRON_OCTAHEDRON,
OnPolyhedronOctahedron)
      ON_UPDATE_COMMAND_UI(ID_POLYHEDRON_OCTAHEDRON,
OnUpdatePolyhedronOctahedron)
      ON_COMMAND(ID_OBJECT_SETTINGS, OnPolyhedronSettings)
      ON_COMMAND(ID_POLYHEDRON_TETRAHEDRON,
OnPolyhedronTetrahedron)
      ON_UPDATE_COMMAND_UI(ID_POLYHEDRON_TETRAHEDRON,
OnUpdatePolyhedronTetrahedron)
      ON_COMMAND(ID_POLYHEDRON_HEXAHEDRON,
OnPolyhedronHexahedron)
      ON_UPDATE_COMMAND_UI(ID_POLYHEDRON_HEXAHEDRON,
OnUpdatePolyhedronHexahedron)
      //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//
CPolyhedronDoc construction/destruction
CPolyhedronDoc::CPolyhedronDoc()
{
      // TODO: add one-time construction code
here
      //Нрчрыьэых уётрэютъш ярЁрьхтЁют
      m_Polyhedron = 1;    //тшя тхыр
      m_RotLine_Dir = 0;     //эряЁртыхэшх тЁрщхэшя
      m_RotLine_Dispos = 0;  //юёь тЁрщхэшя
      m_RotLine_Dist = 10;   //Ёрёётюяэшх фю юёш тЁрщхэшя
      m_PolySetEdge = 10;    //фышэр ЁхсЁр
      m_CameraDistance = 50; //Ёрёётюяэшх ют юёш
фю ърьхЁы
      m_Wired=FALSE;         //фыру фюЁьы тхыр
}
CPolyhedronDoc::~CPolyhedronDoc()
{
}
BOOL
CPolyhedronDoc::OnNewDocument()
{
      if (!CDocument::OnNewDocument())
            return
FALSE;
      // TODO: add reinitialization code here
      // (SDI documents will reuse this
document)
      return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
//
CPolyhedronDoc serialization
void
CPolyhedronDoc::Serialize(CArchive& ar)
{
      if (ar.IsStoring())
      {
            // TODO: add storing code here
      }
      else
      {
            // TODO: add loading code here
      }
}
/////////////////////////////////////////////////////////////////////////////
//
CPolyhedronDoc diagnostics
#ifdef
_DEBUG
void
CPolyhedronDoc::AssertValid() const
{
      CDocument::AssertValid();
}
void
CPolyhedronDoc::Dump(CDumpContext& dc) const
{
      CDocument::Dump(dc);
}
#endif
//_DEBUG
/////////////////////////////////////////////////////////////////////////////
//
CPolyhedronDoc commands
//***
Ёхръцшя эр тысюЁ тхыр т уыртэюь ьхэю
//фуэъцшш
OnUpdate* - уётрэютър урыючхъ т ьхэю
void
CPolyhedronDoc::OnPolyhedronHexahedron()
{
      // TODO: Add your command handler code
here
      m_Polyhedron = 2;
      UpdateAllViews(NULL);
}
void
CPolyhedronDoc::OnUpdatePolyhedronHexahedron(CCmdUI* pCmdUI)
{
      // TODO: Add your command update UI
handler code here
      pCmdUI->SetCheck (m_Polyhedron == 2 ? 1
: 0);
}
void
CPolyhedronDoc::OnPolyhedronDodecahedron()
{
      // TODO: Add your command handler code
here
      m_Polyhedron = 4;
      UpdateAllViews(NULL);
}
void
CPolyhedronDoc::OnUpdatePolyhedronDodecahedron(CCmdUI* pCmdUI)
{
      // TODO: Add your command update UI
handler code here
      pCmdUI->SetCheck (m_Polyhedron == 4 ? 1
: 0);
}
void
CPolyhedronDoc::OnPolyhedronIcosahedron()
{
      // TODO: Add your command handler code
here
      m_Polyhedron = 5;
      UpdateAllViews(NULL);
}
void
CPolyhedronDoc::OnUpdatePolyhedronIcosahedron(CCmdUI* pCmdUI)
{
      // TODO: Add your command update UI
handler code here
      pCmdUI->SetCheck (m_Polyhedron == 5 ? 1
: 0);
}
void
CPolyhedronDoc::OnPolyhedronOctahedron()
{
      m_Polyhedron = 3;
      UpdateAllViews(NULL);
}
void
CPolyhedronDoc::OnUpdatePolyhedronOctahedron(CCmdUI* pCmdUI)
{
      pCmdUI->SetCheck (m_Polyhedron == 3 ? 1
: 0);
}
void
CPolyhedronDoc::OnPolyhedronTetrahedron()
{
      m_Polyhedron = 1;
      UpdateAllViews(NULL);
}
void
CPolyhedronDoc::OnUpdatePolyhedronTetrahedron(CCmdUI* pCmdUI)
{
      pCmdUI->SetCheck (m_Polyhedron == 1 ? 1
: 0);
}
//"Settings"
dialog
void
CPolyhedronDoc::OnPolyhedronSettings()
{
      CPolySet PolySetDlg;
      //*** уётрэютър эрчрыьэых ярЁрьхтЁют
      PolySetDlg.m_CameraDistance =
m_CameraDistance;
      PolySetDlg.m_Wired = m_Wired;
      PolySetDlg.m_RotLine_Dispos =
m_RotLine_Dispos;
      PolySetDlg.m_RotLine_Dir = m_RotLine_Dir;
      PolySetDlg.m_RotLine_Dist =
m_RotLine_Dist;
      //уётрэютър ярЁрьхтЁют яюёых чръЁытшя юъэр
      if (PolySetDlg.DoModal () == IDOK)
//тыяюыэшть, ш хёыш эрцртр OK
      {
            m_CameraDistance =
PolySetDlg.m_CameraDistance;
            m_Wired = PolySetDlg.m_Wired;
            m_RotLine_Dispos =
PolySetDlg.m_RotLine_Dispos;
            m_RotLine_Dir =
PolySetDlg.m_RotLine_Dir;
            m_RotLine_Dist =
PolySetDlg.m_RotLine_Dist;
            UpdateAllViews (NULL);
      }
}
//
PolyhedronView.cpp : implementation of the CPolyhedronView class
//
#include
"stdafx.h"
#include
"Polyhedron.h"
#include
"PolyhedronView.h" //header file linking
#include
"PolyhedronAction.h"
//В В В В В В В В В В В  OpenGL
#include
"gl\gl.h"
#include "gl\glu.h"
#include
"gl\glaux.h"
#ifdef
_DEBUG
#define new
DEBUG_NEW
#undef
THIS_FILE
static char
THIS_FILE[] = __FILE__;
#endif
unsigned
char threeto8[8] =
{
В В В В В В В В В В В  0, 0111>>1, 0222>>1,
0333>>1, 0444>>1, 0555>>1, 0666>>1, 0377
};
unsigned
char twoto8[4] =
{
В В В В В В В В В В В  0, 0x55, 0xaa, 0xff
};
unsigned
char oneto8[2] =
{
В В В В В В В В В В В  0, 255
};
static int
defaultOverride[13] =
{
В В В В В В В В В В В  0, 3, 24, 27, 64, 67, 88, 173, 181,
236, 247, 164, 91
};
//В В 
static
PALETTEENTRY defaultPalEntry[20] =
{
В В В В В В В В В В В  { 0,В В  0,В В  0,В В В  0 },
В В В В В В В В В В В  { 0x80,0,В В  0,В В В  0 },
В В В В В В В В В В В  { 0,В В  0x80,0,В В В  0 },
В В В В В В В В В В В  { 0x80,0x80,0,В В В  0 },
В В В В В В В В В В В  { 0,В В  0,В В  0x80, 0 },
В В В В В В В В В В В  { 0x80,0,В В  0x80, 0 },
В В В В В В В В В В В  { 0,В В  0x80,0x80, 0 },
В В В В В В В В В В В  { 0xC0,0xC0,0xC0, 0 },
В В В В В В В В В В В  { 192, 220, 192,В  0 },
В В В В В В В В В В В  { 166, 202, 240,В  0 },
В В В В В В В В В В В  { 255, 251, 240,В  0 },
В В В В В В В В В В В  { 160, 160, 164,В  0 },
В В В В В В В В В В В  { 0x80,0x80,0x80, 0 },
В В В В В В В В В В В  { 0xFF,0,В В  0,В В В  0 },
В В В В В В В В В В В  { 0,В В  0xFF,0,В В В  0 },
В В В В В В В В В В В  { 0xFF,0xFF,0,В В В  0 },
В В В В В В В В В В В  { 0,В В  0,В В  0xFF, 0 },
В В В В В В В В В В В  { 0xFF,0,В В  0xFF, 0 },
В В В В В В В В В В В  { 0,В В  0xFF,0xFF, 0 },
В В В В В В В В В В В  { 0xFF,0xFF,0xFF, 0 }
};
/////////////////////////////////////////////////////////////////////////////
//
CPolyhedronView
IMPLEMENT_DYNCREATE(CPolyhedronView,
CView)
BEGIN_MESSAGE_MAP(CPolyhedronView,
CView) //В В В В В В В В В 
В В В В В В В В В В В  //{{AFX_MSG_MAP(CPolyhedronView)
В В В В В В В В В В В  ON_COMMAND(ID_FILE_PLAY, OnFilePlay)
В В В В В В В В В В В  ON_UPDATE_COMMAND_UI(ID_FILE_PLAY,
OnUpdateFilePlay)
В В В В В В В В В В В  ON_WM_CREATE()
В В В В В В В В В В В  ON_WM_DESTROY()
В В В В В В В В В В В  ON_WM_SIZE()
В В В В В В В В В В В  ON_WM_TIMER()
В В В В В В В В В В В  ON_WM_ERASEBKGND()
В В В В В В В В В В В  ON_COMMAND(ID_PAUSE, OnPause)
В В В В В В В В В В В  //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//
CPolyhedronView construction/destruction
CPolyhedronView::CPolyhedronView()
{
В В В В В В В В В В В  // TODO: add construction code here
В В В В В В В В В В В  m_pDC = NULL;
В В В В В В В В В В В  m_pOldPalette = NULL;
В В В В В В В В В В В  m_play = FALSE; //В В В В В  ,В В В В В В 
PlayВ В В В В 
В В В В В В В В В В В  PolyhedronAct.wAngle=2.1f;
В В В В В В В В В В В 
}
CPolyhedronView::~CPolyhedronView()
{
}
/////////////////////////////////////////////////////////////////////////////
//
CPolyhedronView drawing
void
CPolyhedronView::OnDraw(CDC* pDC)
{
В В В В В В В В В В В  CPolyhedronDoc* pDoc =
GetDocument();
В В В В В В В В В В В  ASSERT_VALID(pDoc);
В В В В В В В В В В В  // TODO: add draw code for native
data here
В В В В В В В В В В В  DrawScene();
}
/////////////////////////////////////////////////////////////////////////////
//
CPolyhedronView diagnostics
#ifdef
_DEBUG
void
CPolyhedronView::AssertValid() const
{
В В В В В В В В В В В  CView::AssertValid();
}
void
CPolyhedronView::Dump(CDumpContext& dc) const
{
В В В В В В В В В В В  CView::Dump(dc);
}
CPolyhedronDoc*
CPolyhedronView::GetDocument() // non-debug version is inline
{
В В В В В В В В В В В  ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CPolyhedronDoc)));
В В В В В В В В В В В  return (CPolyhedronDoc*)m_pDocument;
}
#endif
//_DEBUG
/////////////////////////////////////////////////////////////////////////////
//
CPolyhedronView message handlers
void
CPolyhedronView::OnFilePlay()
{
В В В В В В В В В В В  if (!m_play) //В В В В В В  PlayВ В В В В 
В В В В В В В В В В В  {
В В В В В В В В В В В В В В В В В В В В В В В  SetTimer(1, 15, NULL);
В В В В В В В В В В В В В В В В В В В В В В В  m_play = TRUE;
В В В В В В В В В В В  }
//В В В В В В В В В  else
//В В В В В В В В В В В В В В В В В В В В В  KillTimer(1);
}
void
CPolyhedronView::OnUpdateFilePlay(CCmdUI* pCmdUI)
{
//В В В В В В В В В  pCmdUI->SetCheck(m_play);
}
BOOL
CPolyhedronView::PreCreateWindow(CREATESTRUCT& cs)
style. Refer to SetPixelFormat

//В В В В В В В В В В В В В 
int
CPolyhedronView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
В В В В В В В В В В В  if (CView::OnCreate(lpCreateStruct)
== -1)
В В В В В В В В В В В В В В В В В В В В В В В  return -1;
В В В В В В В В В В В  Init();В В В В  // initialize OpenGL
В В В В В В В В В В В 
В В В В В В В В В В В  return 0;
}
//В В В В В В В В В В В В В 
void
CPolyhedronView::OnDestroy()
{
В В В В В В В В В В В  HGLRC hrc;
В В В В В В В В В В В  KillTimer(1);
В В В В В В В В В В В  hrc = ::wglGetCurrentContext();
В В В  ::wglMakeCurrent(NULL,В  NULL);
В В В  if (hrc)
В В В В В В В  ::wglDeleteContext(hrc);
В В В  if (m_pOldPalette)
В В В В  В В В m_pDC->SelectPalette(m_pOldPalette, FALSE);
В В В  if (m_pDC)
В В В В В В В  delete m_pDC;
В В В В В В В В В В В  CView::OnDestroy();
}
void
CPolyhedronView::OnSize(UINT nType, int cx, int cy)
{
В В В В В В В В В В В  CView::OnSize(nType, cx, cy);
В В В В В В В В В В В 
В В В  if(cy > 0)
В В В 

}
void
CPolyhedronView::OnTimer(UINT nIDEvent)
{
В В В В В В В В В В В  DrawScene();
В В В В В В В В В В В 
В В В В В В В В В В В  CView::OnTimer(nIDEvent);
В В В В В В В В В В В  // Eat spurious WM_TIMER messages
В В В В В В В В В В В  MSG msg;
В В В В В В В В В В В  while(::PeekMessage(&msg,
m_hWnd, WM_TIMER, WM_TIMER, PM_REMOVE));
}
/////////////////////////////////////////////////////////////////////////////
// GL helper
functions
void
CPolyhedronView::Init()В В В В В  //В В В В В 
{
В В В  PIXELFORMATDESCRIPTOR pfd;
//The
PIXELFORMATDESCRIPTOR structure describes the pixel format
//of a
drawing surface.
В В В  intВ В В В В В В В  n;
В В В В В В В В В В В  HGLRCВ В В В В В В В В В В В  hrc;
В В В В В В В В В В В  GLfloatВ В В В В В В В В В В В  fMaxObjSize, fAspect;
В В В В В В В В В В В  GLfloatВ В В В В В В В В В В В  fNearPlane, fFarPlane;
//В В В В В В В В В В В В В В В В В В В В В В В В В В В 
В В В В В В В В В В В  GLfloat mat_emitter[] = {0.1f, 0.1f,
0.1f, 0.1f};
В В В  GLfloat mat_specular[] = {0.0001f,
0.0001f, 0.0001f, 0.0001f};
В В В  GLfloat light_position[] = {1.0f, 1.0f,
-0.5f, -1.0f};
В В В В В В В В В В В  GLfloat lm_ambient[] = {0.3f, 1.0f,
-1.0f, -1.0f};
В В В В В В В В В В В  float icosahedron_diffuse[] = {0.2f,
0.2f, 0.0f, 1.0f};
В В В  m_pDC = new CClientDC(this);
В В В  ASSERT(m_pDC != NULL); //В В В В В  ,В 
В В В  if (!bSetupPixelFormat())
В В В В В В В  return;
В В В  n =
::GetPixelFormat(m_pDC->GetSafeHdc());
В В В 
::DescribePixelFormat(m_pDC->GetSafeHdc(), n, sizeof(pfd), &pfd);
В В В  CreateRGBPalette();
В В В  hrc =
wglCreateContext(m_pDC->GetSafeHdc());
В В В  wglMakeCurrent(m_pDC->GetSafeHdc(),
hrc);
В В В  GetClientRect(&m_oldRect);
В В В  glClearDepth(1.0f);
В В В  glEnable(GL_DEPTH_TEST);
В В В В В В В В В В В  if (m_oldRect.bottom)
В В В В В В В В В В В В В В В В В В В В В В В  fAspect =
(GLfloat)m_oldRect.right/m_oldRect.bottom;
В В В В В В В В В В В  elseВ В В В В  //
don't divide by zero, not that we should ever run into that...
В В В В В В В В В В В В В В В В В В В В В В В  fAspect = 1.0f;
В В В В В В В В В В В  fNearPlane = 3.0f;В В  //near clipping plane
В В В В В В В В В В В  fFarPlane = 7.0f;В В В  //far clipping plane
В В В В В В В В В В В  fMaxObjSize = 3.0f;В  //miximum object size
В В В В В В В В В В В  m_fRadius = fNearPlane + fMaxObjSize
/ 2.0f;
В В В  glMatrixMode(GL_PROJECTION);
В В В  glLoadIdentity(); //В В В В В В В В В В В В 
В В В  gluPerspective(45.0f, fAspect, fNearPlane,
fFarPlane);
В В В  glMatrixMode(GL_MODELVIEW);
// Lights
and Rendering Setup
В В В В В В В В В В В  PolyhedronAct.DefineMaterialf(mat_emitter,
mat_specular, icosahedron_diffuse, 5.0);
В В В 
В В В В В В В В В В В  glLightfv(GL_LIGHT0, GL_POSITION,
light_position);
В В В  glLightModelfv(GL_LIGHT_MODEL_AMBIENT,
lm_ambient);
В В В  glEnable(GL_LIGHTING);
В В В В В В В В В В В  glEnable(GL_LIGHT0);
В В В  glDepthFunc(GL_LESS);
В В В  glEnable(GL_DEPTH_TEST);
В В В  glShadeModel(GL_SMOOTH);
}
BOOL
CPolyhedronView::bSetupPixelFormat()
{
В В В  static PIXELFORMATDESCRIPTOR pfd =
В В В В В В В В В В В  // version number
;
В В В  int pixelformat;
В В В  if ( (pixelformat =
ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd)) == 0 )
В В В  {
В В В В В В В  MessageBox("ChoosePixelFormat
failed");
В В В В В В В  return FALSE;
В В В  }
В В В  if (SetPixelFormat(m_pDC->GetSafeHdc(),
pixelformat, &pfd) == FALSE)
В В В  {
В В В В В В В  MessageBox("SetPixelFormat
failed");
В В В В В В В  return FALSE;
В В В  }
В В В  return TRUE;
}
unsigned
char CPolyhedronView::ComponentFromIndex(int i, UINT nbits, UINT shift)
{
В В В  unsigned char val;
В В В  val = (unsigned char) (i >> shift);
В В В  switch (nbits)
В В В В В В В В В В В  {
В В В  case 1:
В В В В В В В  val &= 0x1;
В В В В В В В  return oneto8[val];
В В В  case 2:
В В В В В В В  val &= 0x3;
В В В В В В В  return twoto8[val];
В В В  case 3:
В В В В В В В  val &= 0x7;
В В В В В В В  return threeto8[val];
В В В  default:
В В В  В В В В return 0;
В В В  }
}
//В В В В В В В 
void
CPolyhedronView::CreateRGBPalette()
{
В В В  PIXELFORMATDESCRIPTOR pfd;
В В В  LOGPALETTE *pPal;
В В В  int n, i;
В 
В В В  n =
::GetPixelFormat(m_pDC->GetSafeHdc());
В В В 
::DescribePixelFormat(m_pDC->GetSafeHdc(), n, sizeof(pfd), &pfd);
В В В  if (pfd.dwFlags & PFD_NEED_PALETTE)
В В В  {
В В В В В В В  n = 1 << pfd.cColorBits;
В В В В В В В  pPal = (PLOGPALETTE) new
char[sizeof(LOGPALETTE) + n * sizeof(PALETTEENTRY)];
В В В В В В В  ASSERT(pPal != NULL);
В В В В В В В  pPal->palVersion = 0x300;
В В В В В В В  pPal->palNumEntries = n;
В В В В В В В  for (i=0; i<n; i++)
В В В В В В В  {
В В В В В В В В В В В  pPal->palPalEntry[i].peRed =
В В В В В В В В В В В В В В В В В В В  ComponentFromIndex(i,
pfd.cRedBits, pfd.cRedShift);
В В В В В В В В В В В  pPal->palPalEntry[i].peGreen =
В В В В В В В В В В В В В В В  В В В В ComponentFromIndex(i, pfd.cGreenBits, pfd.cGreenShift);
В В В В В В В В В В В  pPal->palPalEntry[i].peBlue =
В В В В В В В В В В В В В В В В В В В  ComponentFromIndex(i,
pfd.cBlueBits, pfd.cBlueShift);
В В В В В В В В В В В  pPal->palPalEntry[i].peFlags =
0;
В В В В В В В  }
В В В В В В В  /* fix up the palette to include the
default GDI palette */
В В В В В В В  if ((pfd.cColorBits == 8)В В В В В В В В В В В В В В В В В В В В В В В В В В  &&
В В В В В В В В В В В  (pfd.cRedBitsВ В  == 3) && (pfd.cRedShiftВ В  == 0) &&
В В В В В В В В В В В  (pfd.cGreenBits == 3) &&
(pfd.cGreenShift == 3) &&
В В В В В В В В В В В  (pfd.cBlueBitsВ  == 2) && (pfd.cBlueShiftВ  == 6)
В В В В В В В В В В  )
В В В В В В В  {
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  for (i = 1 ;
i <= 12 ; i++)
В В В В В В В В В В В В В В В 
pPal->palPalEntry[defaultOverride[i]] = defaultPalEntry[i];
В В В В В В В  }
В В В В В В В  m_cPalette.CreatePalette(pPal);
В В В В В В В  delete pPal;
В В В В В В В  m_pOldPalette =
m_pDC->SelectPalette(&m_cPalette, FALSE);
В В В В В В В  m_pDC->RealizePalette();
В В В  }
}
//В В В В В В В В  -В В В В В В В 
void
CPolyhedronView::DrawScene(void)
{
В В В  static BOOLВ В В В  bBusy = FALSE;
//В В В  static GLfloatВ  wAngle = 2.1f; //В В В В В В 
//В В В В В В В В В  float icosahedron_diffuse[] = {0.2f,
0.2f, 0.0f, 1.0f};
В В В  if(bBusy)
В В В В В В В В В В В В В В В В В В В В В В В  return;
В В В  bBusy = TRUE;
В В В  glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
В В В  glClear(GL_COLOR_BUFFER_BIT |
GL_DEPTH_BUFFER_BIT);
В В В В В В В В В В В  glPushMatrix(); //В В В В В В В В В В 
В В В В В В В В В В В  CPolyhedronDoc* pDoc =
GetDocument();
В В В В В В В В В В В В В В В В В В В В В В В  //В В В В В В В В В 
В В В В В В В В В В В В В В В В В В В В В В В  PolyhedronAct.Movement(pDoc->m_RotLine_Dir,
pDoc->m_RotLine_Dispos,
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  pDoc->m_CameraDistance,
pDoc->m_RotLine_Dist);
//В В В В В В В В В В В В В В В В В В В В В  glMaterialfv(GL_FRONT,
GL_DIFFUSE, icosahedron_diffuse);
В В В В В В В В В В В В В В В В В В В В В В В 
В В В В В В В В В В В В В В В В В В В В В В В  // ***В В  :В В В В В В В В В В В В В  ,В В В В В В В В 
В В В В В В В В В В В В В В В В В В В В В В В  PolyhedronAct.Create(pDoc->m_Polyhedron,
pDoc->m_Wired);
В В В В В В В В В В В  glPopMatrix(); //В В В В В В В В В В В В 
В В В  glFinish();
В В В  SwapBuffers(wglGetCurrentDC());
В В В  bBusy = FALSE;
}
BOOL
CPolyhedronView::OnEraseBkgnd(CDC* pDC)
{
В В В В В В В В В В В  return TRUE;
}
void
CPolyhedronView::OnPause()
{
В В В В В В В В В В В  // TODO: Add your command handler
code here
В В В В В В В В В В В  if (m_play) //В В В В В  PlayВ В В 
В В В В В В В В В В В  {
В В В В В В В В В В В В В В В В В В В В В В В  KillTimer(1);
В В В В В В В В В В В В В В В В В В В В В В В  m_play = FALSE;
В В В В В В В В В В В  }
}
рефераты Рекомендуем рефератырефераты

     
Рефераты @2011