Кривая Гильберта

2_1.gif

Построить фрактал Кривая Гильберта

Возьмем квадрат со стороной 1\2, уберем одну из его сторон, и поместим его точно в середину единичного квадрата.Получилась Гильбертова кривая порядка 1.
Кривая второго порядка получается путем соединения прямыми линиями четырех кривых первого порядка. Аналогичным образом получается кривая третьего порядка, но при этом в качестве "кирпичиков" используются кривые второго порядка. Таким образом, чтобы нарисовать кривую третьего порядка, надо нарисовать четыре кривых второго порядка. В свою очередь, чтобы нарисовать кривую второго порядка, надо нарисовать четыре кривых первого порядка. Таким образом, алгоритм вычерчивания кривой Гильберта является рекурсивным.

void main()
{
#include <graphics.h>
#include <conio.h>
#include <math.h>
#include <stdio.h>
#include  <stdlib.h>
 
const int u=10; // длина штриха
const int p=5;  // порядок кривой
int i;
 
 
void a(int i) ;
void b(int i) ;
void c(int i) ;
void d(int i) ;
 
 //элементы кривой
void a(int i)
{
	if (i > 0)
	{
		d(i-1);
		linerel(+u,0);
		a(i-1);
		linerel(0, u);
		a(i - 1);
		linerel(-u, 0);
		c(i - 1);
	}
}
 
void b(int i)
{
	if (i > 0)
	{
		c(i - 1);
		 linerel(-u, 0);
		 b(i - 1);
		 linerel(0, -u);
		 b(i - 1);
		 linerel(u, 0);
		d(i - 1);
	}
}
 
void c(int i)
{
	if (i > 0)
	{
		b(i - 1);
		linerel(0, -u);
		c(i - 1);
		linerel(-u, 0);
		c(i - 1);
		linerel(0, u);
		a(i - 1);
	}
}
void d(int i)
{
	if (i > 0)
	{
		a(i - 1);
		linerel(0, u);
		d(i - 1);
		linerel(u, 0);
		d(i - 1);
		linerel(0, -u);
		b(i - 1);
	}
}
 
 
int main ()
{
	int gdriver = DETECT, gmode, errorcode;
	initgraph(&gdriver, &gmode, " bgi");
	errorcode = graphresult();
	if (errorcode != grOk)
	{
		printf("Graphics error: %s\n", grapherrormsg(errorcode));
		printf("Press any key to halt:\n");
		getch();
		exit(1);
	}
 
 
moveto(100, 100);
 
	a(p); //вычертить кривую Гильберта
 
	getch();
	closegraph();
	return 0;
}
}

Ключевые слова: 
фрактал кривая Гильберта
ВложениеРазмер
GIL.rar24.66 кб