Блог
Главная » 2011 » Май » 25 » Фрактал Минковского21:50 Фрактал Минковского |
Фрактал Минковского Эта программа производит замену либо одного горизонтального отрезка, либо каждой стороны правильного многоугольника фрактальной кривой Минковского Алгоритм #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(); } Материал позаимствован с сайта |
|
Всего комментариев: 0 | |