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

#include "stdafx.h"
#include "GLlab.h"
#include "Fractal.h"
#include "math.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// Fractal

IMPLEMENT_DYNCREATE(Fractal, CDocument)

Fractal::Fractal()
{
}

Fractal::~Fractal()
{
}


BEGIN_MESSAGE_MAP(Fractal, CDocument)
	//{{AFX_MSG_MAP(Fractal)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// Fractal diagnostics

#ifdef _DEBUG
void Fractal::AssertValid() const
{
	CDocument::AssertValid();
}

void Fractal::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// Fractal commands
void Fractal::DrawList(float x,float y,int angle,int my_n,int n)
{
//Коэффициент стороны
	float K=1;
	
	int i=0;
	while (i<my_n)
	{K=K*(sqrt(2)/2);
	 i++;
	}

	float B=A*K;

//Исправление угла
	if (angle>4) {angle=angle-8;}
	if (angle<-4){angle=angle+8;}
	
//Пересчет координат точек
	
	
	
	float x2,y2,x3,y3,x4,y4,x5,y5;
	

	if (angle==0) {x2=x;y2=y+B;x3=x+B;y3=y+B;x4=x+B;y4=y;x5=x+0.5*B;y5=y+1.5*B;}
	if (angle==1) {x2=x+(sqrt(2)/2)*B;y2=y+(sqrt(2)/2)*B;
				   x3=x+sqrt(2)*B;y3=y;
				   x4=x2;y4=y-(sqrt(2)/2)*B;
				   x5=x3;y5=y2;}
	if (angle==-1){x2=x-(sqrt(2)/2)*B;y2=y+(sqrt(2)/2)*B;
				   x3=x;y3=y+sqrt(2)*B;
				   x4=x+(sqrt(2)/2)*B;y4=y2;
				   x5=x2;y5=y3;}
	if (angle==2) {x2=x+B;y2=y;x3=x2;y3=y-B;x4=x;y4=y3;x5=x+1.5*B;y5=y-0.5*B;}
	if (angle==-2){x2=x-B;y2=y;x3=x2;y3=y+B;x4=x;y4=y3;x5=x-1.5*B;y5=y+0.5*B;}
	if (angle==3) {x2=x+(sqrt(2)/2)*B;y2=y-(sqrt(2)/2)*B;
				   x3=x;y3=y-sqrt(2)*B;
				   x4=x-(sqrt(2)/2)*B;y4=y2;
				   x5=x2;y5=y3;}
	if (angle==-3){x2=x-(sqrt(2)/2)*B;y2=y-(sqrt(2)/2)*B;
				   x3=x-sqrt(2)*B;y3=y;
				   x4=x2;y4=y+(sqrt(2)/2)*B;
				   x5=x3;y5=y2;}
	if ((angle==4) || (angle==-4)) 
				{x2=x;y2=y-B;x3=x-B;y3=y2;x4=x3;y4=y;x5=x-0.5*B;y5=y-1.5*B;}
					

//Рисуем Фигурку
	glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
	glLineWidth(2);
	
	glBegin(GL_QUADS);

	glColor3f(0.0,1.0,0.0);
	glVertex2f(x, y);
	glVertex2f(x2, y2);
	glVertex2f(x3, y3);
	glVertex2f(x4, y4);

	glEnd();
	
	glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
	glLineWidth(2);
	
	glBegin(GL_TRIANGLES);

	glColor3f(0.0,1.0,0.0);
	glVertex2f(x2, y2);
	glVertex2f(x5, y5);
	glVertex2f(x3, y3);	

	glEnd();

//Рекурсивный переход
	my_n++;		//След шаг
	if (my_n>n) {return;}
	else
	{DrawList(x2,y2,angle-1,my_n,n);
	DrawList(x5,y5,angle+1,my_n,n);}

}


void Fractal::DrawTree(float x,float y,int n)
{	glTranslatef(x,y,0);

	x=x-A/2;
	DrawList(x,y,0,0,n);

	glLoadIdentity();
}
Соседние файлы в папке Лабораторная работа №42