Фрактал Минковского

Фрактал Минковского, основная фигура квадрат, глибина рекурсии 4

Эта программа производит замену либо одного горизонтального отрезка, либо каждой стороны правильного многоугольника фрактальной кривой Минковского

Алгоритм
1) Считываеться колличество сторон основной фигуры, глубина рукурсии, тип фрактала
2) Для каждой стороны основной фигуры вызывается построение заданного типа фрактальной кривой
3) Процесс повторяеться для каждой стороны получившейся фигуры в зависимости от глубины рукурсии

#include <conio.h>
#include <graphics.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
 
int X_max, Y_max, foregrcolor, backgrcolor, colorsum;
static int Xcur, Ycur;
float x_max, y_max, horfact, vertfact;
 
void boundaries_uc()
{
 
  int w, h;
  getaspectratio( &w, &h );							//Возвращает текущее   отношение  ширины  изображения  к   его   высоте
  y_max = x_max * ( float )Y_max * h / ( ( float )X_max * w );
  horfact = X_max / x_max;
  vertfact = Y_max / y_max;
 
}
 
void initgr()
{
 
  int grdriver = DETECT, grmode;
 
  detectgraph( &grdriver, &grmode ); //Определяет графический драйвер и графический режим при проверке аппаратуры.
 
  initgraph( &grdriver, &grmode, "" ); // Инициализирует графическую систему. Между "" должен быть написан путь к файлу egavga.bgi
 
  if ( graphresult() != grOk )
   printf("\nError!\n");
 
  foregrcolor = getcolor();			// Возвращает текущий цвет рисунка
  backgrcolor = getbkcolor();		// Возвращает текущий цвет фона
  colorsum = foregrcolor + backgrcolor;
 
  X_max = getmaxx(); // Возвращает максимальную координату х экрана
  Y_max = getmaxy(); // Возвращает максимальную координату y экрана
 
  x_max = 10.0;
 
  boundaries_uc();
 
}
 
int IX( float x ) // Функция перевода х координат из реальных в экранные
{
 
  return ( int )(x * horfact + 0.5);
 
}
 
int IY( float y ) // Функция перевода y координат из реальных в экранные
{
 
  return Y_max - ( int )(y * vertfact + 0.5);
 
}
 
void move( float x, float y ) // Функция получает на вход реальные координаты, переводит их в экранные,
//и переносит курсор в определяемую координатами точку
{
 
  Xcur = IX( x );
  Ycur = IY( y );
  moveto( Xcur, Ycur ); // Переводит курсор в точку, задаваемую координатами
 
}
 
void draw( float x, float y ) // Функция получает на вход реальные координаты, переводит их в экранные,
//проводит линию из текущего положения курсора в точку, определяемую координатами, а затем переводит в эту точку курсор
{
 
  int X0 = Xcur, Y0 = Ycur;
  Xcur = IX( x );
  Ycur = IY( y );
  line( X0, Y0, Xcur, Ycur ); // Рисует линию между двумя указанными точками
  moveto(Xcur, Ycur);
 
}
 
void endgr( void )
{
 
  getch();
  closegraph(); // Прекращает работу графической системы
 
}
 
int nmodel = 0;
float xx[30], yy[30];
 
void side( float xA, float yA, float xB, float yB, int n )//Функция, рисующая фрактальную линию. Получает на вход реальные кооронаты начала и конца
// отрезка, а так же параметр n определяющий глубину рекурсии
{
  int i;
  float x, y, x1, y1, dx = xB - xA, dy = yB - yA;
 
  if ( n == 0 )
   {
 
	 move(xA, yA);
	 draw(xB, yB);
 
   }
  else {
 
		 x1 = xA;
		 y1 = yA;
		 for (i = 1; i <= nmodel; i++)
		  {
 
			x = x1;
			y = y1;
			x1 = xA + dx * xx[i] - dy * yy[i];
			y1 = yA + dy * xx[i] + dx * yy[i];
			side(x, y, x1, y1, n - 1);
 
		  }
 
	   }
 
}
 
void main()
{
 
  clrscr();
  int n, k, i;
  float pi, theta, r, x, y, x1, y1, xC, yC, sizefactor, xmargin, phi;
 
  printf("\nVvedite kollichestvo storon figuri, berysiisya za osnovy: ");
  scanf("%d", &k);
  printf("\nGlubina rekyrsii: ");
  scanf("%d", &n);
  printf("\nVvedite 1 elsu xotite yvidet' kruvuy Minkovskogo, 0 esli dryguy: ");
  int mod;
  scanf("%d", &mod);
 
  if( mod == 0 )
  {
	  xx[ 1 ] = 0.45; yy[ 1 ] = 0;
	  xx[ 2 ] = 0.5;  yy[ 2 ] = 0.45;
	  xx[ 3 ] = 0.55; yy[ 3 ] = 0;
	  nmodel = 3;
  }
  if( mod == 1 )
  {
	  xx[ 1 ] = 0.25; yy[ 1 ] = 0;
	  xx[ 2 ] = 0.25;  yy[ 2 ] = 0.25;
	  xx[ 3 ] = 0.5; yy[ 3 ] = 0.25;
	  xx[ 4 ] = 0.5; yy[ 4 ] = 0;
	  xx[ 5 ] = 0.5;  yy[ 5 ] = -0.25;
	  xx[ 6 ] = 0.75; yy[ 6 ] = -0.25;
	  xx[ 7 ] = 0.75; yy[ 7 ] = 0;
	  nmodel = 7;
  }
 
 
  nmodel++;
 
  sizefactor = 1.0; // коэффициент масштабирования
 
  /*
	 Остальные элементы массива инициализируются нулями
  */
  xx[nmodel] = 1.0;
 
  initgr();
 
  if ( k < 3 ) // построение основной фигуры
   {
 
	 xmargin = 0.5 * (x_max - sizefactor * (x_max - 1));
	 side(xmargin, 0.5 * y_max, x_max - xmargin, 0.5 * y_max, n);
 
   }
  else {
 
		 xC = x_max/2;
		 yC = y_max/2;
		 r = 0.9 * yC * sizefactor;
		 pi = 4 * atan(1.0);
		 theta = 2 * pi/k;
		 phi = -0.5 * theta;
		 x1 = xC + r * cos(phi);
		 y1 = yC + r * sin(phi);
 
		 for (i = 0; i < k; i++) 
		  {
 
			x = x1;
			y = y1;
			phi += theta;
			x1 = xC + r * cos(phi);
			y1 = yC + r * sin(phi);
			side(x, y, x1, y1, n);
 
		  }
 
	   }
  endgr();
 
}

ВложениеРазмер
c.rar23.75 кб