Эта программа производит замену либо одного горизонтального отрезка, либо каждой стороны правильного многоугольника фрактальной кривой Минковского
#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();
}