Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа №41 / LabView
.cpp// 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