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