Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа №45 / Oglshvw
.cpp// oglshvw.cpp : implementation of the COglshapeView class
//
#include "stdafx.h"
#include "oglshape.h"
#include "oglshdoc.h"
#include "oglshvw.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// COglshapeView
IMPLEMENT_DYNCREATE(COglshapeView, CView)
BEGIN_MESSAGE_MAP(COglshapeView, CView)
//{{AFX_MSG_MAP(COglshapeView)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_COMMAND(ID_DECREASED, OnDecreased)
ON_COMMAND(ID_INCREASED, OnIncreased)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// COglshapeView construction/destruction
COglshapeView::COglshapeView()
{
// TODO: add construction code here
m_depth=0;
m_transl=FALSE;
}
COglshapeView::~COglshapeView()
{
}
/////////////////////////////////////////////////////////////////////////////
// COglshapeView drawing
void COglshapeView::OnDraw(CDC* pDC)
{
COglshapeDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
///////////////////////////////////////
///////////////////////////////////////
// START CUSTOM CODE
///////////////////////////////////////
///////////////////////////////////////
wglMakeCurrent(pDC->m_hDC, m_hRC);
DrawWithOpenGL();
wglMakeCurrent(pDC->m_hDC, NULL);
///////////////////////////////////////
///////////////////////////////////////
// END CUSTOM CODE
///////////////////////////////////////
///////////////////////////////////////
}
/////////////////////////////////////////////////////////////////////////////
// COglshapeView diagnostics
#ifdef _DEBUG
void COglshapeView::AssertValid() const
{
CView::AssertValid();
}
void COglshapeView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
COglshapeDoc* COglshapeView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(COglshapeDoc)));
return (COglshapeDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// COglshapeView message handlers
int COglshapeView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
///////////////////////////////////////
///////////////////////////////////////
// START CUSTOM CODE
///////////////////////////////////////
///////////////////////////////////////
PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR), // Structure size.
1, // Structure version number.
PFD_DRAW_TO_WINDOW | // Property flags.
PFD_SUPPORT_OPENGL,
PFD_TYPE_RGBA,
24, // 24-bit color.
0, 0, 0, 0, 0, 0, // Not concerned with these.
0, 0, 0, 0, 0, 0, 0, // No alpha or accum buffer.
32, // 32-bit depth buffer.
0, 0, // No stencil or aux buffer.
PFD_MAIN_PLANE, // Main layer type.
0, // Reserved.
0, 0, 0 // Unsupported.
};
CClientDC clientDC(this);
int pixelFormat =
ChoosePixelFormat(clientDC.m_hDC, &pfd);
BOOL success =
SetPixelFormat(clientDC.m_hDC, pixelFormat, &pfd);
m_hRC = wglCreateContext(clientDC.m_hDC);
///////////////////////////////////////
///////////////////////////////////////
// END CUSTOM CODE
///////////////////////////////////////
///////////////////////////////////////
return 0;
}
void COglshapeView::OnDestroy()
{
CView::OnDestroy();
// TODO: Add your message handler code here
///////////////////////////////////////
///////////////////////////////////////
// START CUSTOM CODE
///////////////////////////////////////
///////////////////////////////////////
wglDeleteContext(m_hRC);
///////////////////////////////////////
///////////////////////////////////////
// END CUSTOM CODE
///////////////////////////////////////
///////////////////////////////////////
}
BOOL COglshapeView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Add your specialized code here and/or call the base class
///////////////////////////////////////
///////////////////////////////////////
// START CUSTOM CODE
///////////////////////////////////////
///////////////////////////////////////
cs.style |= WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
///////////////////////////////////////
///////////////////////////////////////
// END CUSTOM CODE
///////////////////////////////////////
///////////////////////////////////////
return CView::PreCreateWindow(cs);
}
void COglshapeView::DrawWithOpenGL()
{
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0f, 0.0f, 0.0f);
if(!m_transl)
{
m_transl=true;
glTranslated(-1,-1,0);
};
GLfloat lw[2];
glGetFloatv(GL_LINE_WIDTH_RANGE, lw);
if (lw[1] >= 4.0f)
glLineWidth(4.0f);
else
glLineWidth(lw[1]);
DrawFractal(m_depth,1,0.1,1,1.9);
glFlush();
}
void COglshapeView::OnDecreased()
{
// TODO: Add your command handler code here
if (m_depth!=0)
{
m_depth-=1;
Invalidate();
}
else
{
AfxMessageBox("Минимальная глубина вложенности достигнута");
};
}
void COglshapeView::OnIncreased()
{
// TODO: Add your command handler code here
if (m_depth<6)
{
m_depth+=1;
Invalidate();
}
else
{
AfxMessageBox("Максимальная глубина вложенности достигнута");
}
}
int COglshapeView::DrawFractal(UINT level, double lPtx, double lPty, double rPtx, double rPty)
{
//FFRRRFRRL
double newX1=0;
double newX2=0;
double newY1=0;
double newY2=0;
double shift=0;
if (level>0)
{
level-=1;
double shiftX=rPtx-lPtx;
double shiftY=rPty-lPty;
if (shiftX<0)
shiftX=-shiftX;
if (shiftY<0)
shiftY=-shiftY;
if (shiftX==0)
{
shift=shiftY/3; //длина следующей рисуемой линии
newY1=lPty+shift; //первый шаг F
glBegin(GL_LINES);
glVertex2d(lPtx,lPty);
glVertex2d(lPtx,newY1);
glEnd();
DrawFractal(level,lPtx,lPty,lPtx,newY1);
newY2=newY1+shift; //второй шаг F
glBegin(GL_LINES);
glVertex2d(lPtx,newY1);
glVertex2d(lPtx,newY2);
glEnd();
DrawFractal(level,lPtx,newY1,lPtx,newY2);
newX1=lPtx+shift; //третий шаг R
glBegin(GL_LINES);
glVertex2d(lPtx,newY2);
glVertex2d(newX1,newY2);
glEnd();
DrawFractal(level,lPtx,newY2,newX1,newY2);
newY1=newY2-shift; //четвёртый шаг R
glBegin(GL_LINES);
glVertex2d(newX1,newY2);
glVertex2d(newX1,newY1);
glEnd();
DrawFractal(level,newX1,newY1,newX1,newY2);
newX2=newX1-shift; //пятый шаг R
glBegin(GL_LINES);
glVertex2d(newX1,newY1);
glVertex2d(newX2,newY1);
glEnd();
DrawFractal(level,newX2,newY1,newX1,newY1);
newX1=newX2-shift; //шестой шаг F
glBegin(GL_LINES);
glVertex2d(newX2,newY1);
glVertex2d(newX1,newY1);
glEnd();
DrawFractal(level,newX1,newY1,newX2,newY1);
newY2=newY1+shift; //седьмой шаг R
glBegin(GL_LINES);
glVertex2d(newX1,newY1);
glVertex2d(newX1,newY2);
glEnd();
DrawFractal(level,newX1,newY1,newX1,newY2);
newX2=newX1+shift; //восьмой шаг R
glBegin(GL_LINES);
glVertex2d(newX1,newY2);
glVertex2d(newX2,newY2);
glEnd();
DrawFractal(level,newX1,newY2,newX2,newY2);
newY1=newY2+shift; //девятый шаг L
glBegin(GL_LINES);
glVertex2d(newX2,newY2);
glVertex2d(newX2,newY1);
glEnd();
DrawFractal(level,newX2,newY2,newX2,newY1);
}
else
if (shiftY==0)
{
shift=shiftX/3; //длина следующей рисуемой линии
newX1=lPtx+shift; //первый шаг F
glBegin(GL_LINES);
glVertex2d(lPtx,lPty);
glVertex2d(newX1,lPty);
glEnd();
DrawFractal(level,lPtx,lPty,newX1,lPty);
newX2=newX1+shift; //второй шаг F
glBegin(GL_LINES);
glVertex2d(newX1,lPty);
glVertex2d(newX2,lPty);
glEnd();
DrawFractal(level,newX1,lPty,newX2,lPty);
newY1=lPty-shift; //третий шаг R
glBegin(GL_LINES);
glVertex2d(newX2,lPty);
glVertex2d(newX2,newY1);
glEnd();
DrawFractal(level,newX2,newY1,newX2,lPty);
newX1=newX2-shift; //четвёртый шаг R
glBegin(GL_LINES);
glVertex2d(newX2,newY1);
glVertex2d(newX1,newY1);
glEnd();
DrawFractal(level,newX1,newY1,newX2,newY1);
newY2=newY1+shift; //пятый шаг R
glBegin(GL_LINES);
glVertex2d(newX1,newY1);
glVertex2d(newX1,newY2);
glEnd();
DrawFractal(level,newX1,newY1,newX1,newY2);
newY1=newY2+shift; //шестой шаг F
glBegin(GL_LINES);
glVertex2d(newX1,newY2);
glVertex2d(newX1,newY1);
glEnd();
DrawFractal(level,newX1,newY2,newX1,newY1);
newX2=newX1+shift; //седьмой шаг R
glBegin(GL_LINES);
glVertex2d(newX1,newY1);
glVertex2d(newX2,newY1);
glEnd();
DrawFractal(level,newX1,newY1,newX2,newY1);
newY2=newY1-shift; //восьмой шаг R
glBegin(GL_LINES);
glVertex2d(newX2,newY1);
glVertex2d(newX2,newY2);
glEnd();
DrawFractal(level,newX2,newY2,newX2,newY1);
newX1=newX2+shift; //девятый шаг L
glBegin(GL_LINES);
glVertex2d(newX2,newY2);
glVertex2d(newX1,newY2);
glEnd();
DrawFractal(level,newX2,newY2,newX1,newY2);
};
}
else
{
if (m_depth==0)
{
glBegin(GL_LINES);
glVertex2d(lPtx,lPty);
glVertex2d(rPtx,rPty);
glEnd();
};
};
return 0;
}
Соседние файлы в папке Лабораторная работа №45