Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
8
Добавлен:
01.05.2014
Размер:
10.22 Кб
Скачать
// 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