Программа построения двухмерных L-фракталов (язык Си).
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <graphics.h>
#include <conio.h>
#define STEP 12 /* Шаг для рисования фрактала */
#define Х0 0
#define Y0 -200
/* Формат файла данных
1-я строка - аксиома
2-я строка - число, на которое надо
разделить 360 для получения угла поворота
3-я строка - число, равное количеству
правил
строки (количество которых определено в 3-й
строке),
в каждой из которых записано по
одному правилу строки,
не содержат пробелов,
1-й элемент - заменяемый символ,
остальные
элементы — символы, на которые заменяется 1-й
*/
/* Функции преобразования координат */
int xe(float
x)
{ return (int) (х+320);}
int ye(float у)
{ return (int)(240-у);}
/*
Функция рисования фрактала */
void ldraw(int x0, int y0,unsigned int step, int direct, char *ls)
{ float x=x0,y=y0;
float rangle=(360.0/direct)*M_PI/180,curangle=0;
struct { float x,y,curangle;} stack[100];
int pstack=-l;
moveto(xe(x0),ye(y0));
while (*ls)
{ switch (*ls)
{ case 'F': x=x+step*cos(curangle);
y=y+step*sin(curangie);
lineto(xe(x),ye(y)); break;
case '+': curangie-=rangle;
break;
case '-': curangle+=rangle;
break;
case '[': pstack++;
stack[pstack].x=x;
stack[pstack],y=y;
stack[pstack].curangle=curangle; break;
case ']': x=stack[pstack].x;
y=stack[pstack].y;
curangle=stack[pstack].curangle;
pstack--;moveto(xe(x),ye(y) ) ;
}
ls++;
}
}
/* Функция получения строки для рисования
фрактала */
void lstring( char *axiom, unsigned int rс,
char (*rules)[50], unsigned int n.char *ls)
{ unsigned int i,j,shift ;
char *result,*p,*pr;
strcpy(ls,axiom) ;
for (i=0;i<n;i++)
{ resuit=ls;
while (*result)
{ for (j=0;j<rc;j++)
if (*result==rules[j][0])
{ shift=strlen(rules[j])-1;
p=result+strlen(result);
while (p!=result) { *(p+shift-1)=*p; p--;}
for (pr=rules[j]+l;*pr;pr++)
{ *result=*pr; result++;}
result--;break;
}
result++;
}
}
}
/* Функция читает данные из файла filename и
возвращает:
строка axiom - аксиома,
direct - число для получения угла поворота
rc -
количество правил
массив строк rules - теоремы */
void readfra( char *filename, char *axiom, unsigned int *direct,
unsigned int *rc, char (*rules) [50])
{ unsigned int i,n;
FILE *f=fopen(filename,"r");
fscant(f,"%s",axiom) ;
fscanf(f,"%d\n",direct) ;
fscanf(f,"%d\n",rc) ;
for (i=0;i<*rc;i++) fscanf(f,"%s",rules[i] );
fclose(f) ;
}
void main(int argc.char* argv[])
{ int gd=DETECT,gm,inrec;
unsigned int direct,rc;
char ls[20000];
char axiom[20] ;
char rules [10] [50];
printf("Глубина рекурсии:\n") ;
scanf("%d", &inrec);
readfra(argv[1] ,axiom,&direct,&rc, rules);
lstring(axiom,rc,rules,inrec,ls);
puts (ls); /* Вывод на экран строки для
построения */
getch () ;
initgraph(&gd,&gm,"");
ldraw(X0,Y0,STEP,direct,ls);
getch () ;
closegraph() ;
}