Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
9
Добавлен:
01.05.2014
Размер:
5.82 Кб
Скачать
// LabView.cpp : implementation of the CLabView class
//

#include "stdafx.h"
#include "Lab.h"

#include "LabDoc.h"
#include "LabView.h"
#include ".\labview.h"

#include <math.h>


#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#define len 0.5
#define a 0.1
#define DELAY 1000000
#define DIV_KOORD  20
#define DX -0.15
#define DY -0.7
void Step(int, int *);
int K(int );
// CLabView

double CPX,CPY;

IMPLEMENT_DYNCREATE(CLabView, CView)

BEGIN_MESSAGE_MAP(CLabView, CView)
	ON_WM_CREATE()
	ON_WM_DESTROY()
	ON_COMMAND(ID_DRACON, OnLines)
	ON_WM_SIZE()
	ON_WM_ERASEBKGND()
END_MESSAGE_MAP()

CLabView::CLabView()
: m_nShape(0)
{ }

CLabView::~CLabView()
{ }

BOOL CLabView::PreCreateWindow(CREATESTRUCT& cs)
{
	cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN;

	return CView::PreCreateWindow(cs);
}

// CLabView drawing

void CLabView::OnDraw(CDC* pDC)
{
	CLabDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	wglMakeCurrent(pDC->m_hDC, m_hrc);
	DrawBlack();	
	if(m_nShape)
	{

		DrawLine();
//		m_nShape = 0;
	}
	wglMakeCurrent(NULL, NULL);
}

BOOL CLabView::OnEraseBkgnd(CDC* pDC)
{
	return TRUE;
}

// CLabView diagnostics

#ifdef _DEBUG
void CLabView::AssertValid() const
{
	CView::AssertValid();
}

void CLabView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CLabDoc* CLabView::GetDocument() const // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CLabDoc)));
	return (CLabDoc*)m_pDocument;
}
#endif //_DEBUG

// CLabView message handlers

int CLabView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;

    CClientDC dc(this);
    
	PIXELFORMATDESCRIPTOR pfd;

	memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
	pfd.nSize		= sizeof(PIXELFORMATDESCRIPTOR);
	pfd.nVersion	= 1;
	pfd.dwFlags		= PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW;
	pfd.iPixelType	= PFD_TYPE_RGBA;
	pfd.cColorBits	= 24;
	pfd.cDepthBits	= 32;
	pfd.iLayerType	= PFD_MAIN_PLANE ;

	int		nPixelFormat	= ChoosePixelFormat(dc.m_hDC, &pfd);

	if (nPixelFormat == 0)
		return -1;

	BOOL	bResult			= SetPixelFormat(dc.m_hDC, nPixelFormat, &pfd);

	if (!bResult)
		return -1;
	
	m_hrc = wglCreateContext(dc.m_hDC);

	if (!m_hrc)
		return -1;

	return 0;
}

void CLabView::OnDestroy()
{
	CView::OnDestroy();

	wglDeleteContext(m_hrc);
}



void CLabView::OnLines()
{
	m_nShape = 1;
	Invalidate();
}

void CLabView::OnInitialUpdate()
{
	CView::OnInitialUpdate();

	CClientDC dc(this);

	wglMakeCurrent(dc.m_hDC, m_hrc);
	glClearColor(0.0, 0.0, 0.0, 0.0);
	wglMakeCurrent(NULL, NULL);
}

void CLabView::OnSize(UINT nType, int cx, int cy)
{
	CView::OnSize(nType, cx, cy);

	if (cx <= 0 || cy <= 0)
		return;

	CClientDC dc(this);

	BOOL bResult = wglMakeCurrent(dc.m_hDC, m_hrc);

	if (!bResult)
		return;
	
	glViewport(0, 0, cx, cx);

	wglMakeCurrent(NULL, NULL);
}
void CLabView::DrawBlack(void)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glFlush();
}


void CLabView::DrawLine(void)
{
  int n = 1024/*Количество отрезков*/,i,
   angle=270,/*Угол наклона первого отрезка*/
   old_angle=270;

  CPX = CPY = 0;
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glColor4d(1, 1, 1, 0.4);	
	glLineWidth(1);
	glBegin(GL_LINE_STRIP);
	
	glVertex2d( CPX/DIV_KOORD + DX, DY - (CPY/DIV_KOORD));
	//Invalidate(FALSE);
	CPX += len-a;
	glVertex2d( CPX/DIV_KOORD + DX, DY - (CPY/DIV_KOORD));
	//Invalidate(FALSE);
	  for (i=1; i<n; i++)
    {
	 angle=(angle+K(i)*90) % 360;
	
	//for(int j = 0; j < DELAY;j++);
     Step(angle, &old_angle);/*рисуем остальные отрезки линии*/
	//Invalidate(FALSE);
	
    }
	glEnd();
	glFlush();
}


/*Функция рисования отрезка ломаной и предшествующего ему "закругления" */
void Step(int angle, int *old_angle )
  {/*Рассматриваем 4 варианта направления перемещения.
  Вычерчиваем "закругление" и очередной отрезок*/
  switch (angle)
   {
	case 0:
      if ((*old_angle) == 90)
	  {
		  CPX -=a;
		  CPY -=a;
		  glVertex2d( CPX/DIV_KOORD + DX, DY - (CPY/DIV_KOORD));
		  //linerel(-a,-a);
	  }
	  else 
	  {	
		  CPX +=a;
		  CPY -=a;
		  glVertex2d( CPX/DIV_KOORD + DX, DY - (CPY/DIV_KOORD));
	  }
		  CPY -=(len-2*a);
  		  glVertex2d( CPX/DIV_KOORD + DX, DY - (CPY/DIV_KOORD));
	  
	break;
    case 180:
      if ((*old_angle) == 90)
	  {
  		  CPX -=a;
		  CPY +=a;
		  glVertex2d( CPX/DIV_KOORD + DX, DY - (CPY/DIV_KOORD));
		  //linerel(-a,a);
	  }
	  else
	  {
		  CPX +=a;
		  CPY +=a;
		  glVertex2d( CPX/DIV_KOORD + DX, DY - (CPY/DIV_KOORD));
		  //linerel(a,a);
	  }
		  CPY +=(len-2*a);
		  glVertex2d( CPX/DIV_KOORD + DX, DY - (CPY/DIV_KOORD));
		  //linerel(0,(len-2*a));
	  
	break;
    case 90:
      if ((*old_angle) == 0)
	  {
		  CPX -=a;
		  CPY -=a;
		  glVertex2d( CPX/DIV_KOORD + DX, DY - (CPY/DIV_KOORD));
		  //linerel(-a,-a); 
	  }
	  else
	  {
		  CPX -=a;
		  CPY +=a;
		  glVertex2d( CPX/DIV_KOORD + DX, DY - (CPY/DIV_KOORD));
		 // linerel(-a,a);
	  }
		  CPX -=(len-2*a);
		  glVertex2d( CPX/DIV_KOORD + DX, DY - (CPY/DIV_KOORD));
		  //linerel(-(len-2*a),0);
	  
	break;
    case 270:
      if ((*old_angle) == 0)
	  {
		  CPX +=a;
		  CPY -=a;
		  glVertex2d( CPX/DIV_KOORD + DX, DY - (CPY/DIV_KOORD));
		  //linerel(a,-a);
	  }
	  else 
	  {
		  CPX +=a;
		  CPY +=a;
		  glVertex2d( CPX/DIV_KOORD + DX, DY - (CPY/DIV_KOORD));
		  //linerel(a,a);
	  }
		  CPX +=(len - 2*a);
		  glVertex2d( CPX/DIV_KOORD + DX, DY - (CPY/DIV_KOORD));
		  //linerel(len-2*a,0);
	  
	break;
    }

	(*old_angle) = angle;

}


int K(int i)
  {if (i % 2 == 1) return i % 4; else return K(i/2);}
Соседние файлы в папке Лабораторная работа №41