Четверг, 28.03.2024, 16:27
Приветствую Вас Гость | RSS
Авторизация
Статистика


Rambler's Top100


Яндекс.Метрика
Контакты
356118831
Mr_Ser_Win
Поиск
Архив записей
Календарь
«  Май 2011  »
ПнВтСрЧтПтСбВс
      1
2345678
9101112131415
16171819202122
23242526272829
3031
Реклама

Книжный портал

Блог

Главная » 2011 » Май » 25 » Фрактал Минковского
21:50
Фрактал Минковского
Фрактал Минковского

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

Алгоритм
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();
 
}


Материал  позаимствован с сайта 

Просмотров: 536 | Добавил: Mr_Ser_Win | Теги: Фракталы | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Получить бонус WMR

Вы можете получить WMR-бонус в размере 0,01-0,10 WMR на свой кошелек 1 раз в сутки

Кошелек
Код Защитный код

Обмен Webmoney



Получить больше бонусов
Помощь сайту

Облако тегов
Реклама
Качественный хостинг
Бесплатная раскрутка сайтов и блогов - YouRaise.Ru
Начать Заработок на Блоге
Хранилище фотографий фото хостинг Храни фото здесь!
Драки: дом2 драки
обмен играми Все для геймера!
А ты играл в XBOX 360? продажа развивающие игры в твоем городе
AlfaInternet.Su - Регистрация сайта в каталогах поисковиках

Регистрация сайта в Каталогах
Ваше имя:
Ваш email:
Регистрация при поддержке AlfaInternet.Su
PR-CY.ru