Фрактал KAM Torus

fr.JPG

Построить фрактал KAM Torus

Данный фрактал рисуется с помощью уравнений, в которых переменная на каждом шаге увеличивается на единицу:

x(0) = y(0) = num
x(n+1) = x(n)*cos(a) + (x2 - y(n))*sin(a)
y(n+1) = x(n)*sin(a) + (x2 - y(n))*cos(a)

где num - некоторое начальное значение, а - угол в радианах

Так же нам необходимо задать количество точек на орбите (т.е. число проходов цикла), величину шага для num и конечное значение для этой переменной.

Т.к. величина угла - случайное число, то изображение будет менятся (в программе для этого необходимо нажать правую кнопку мышки).

Функция рисования фрактала KAM Torus:

void KamTorus (HWND hwnd, HDC hdc)		
 
 
{
 
    int a, nx, ny;
    time_t t;
    double an, can, san, can1, san1, e, r, ax, ay;
    double x, xa, x1, x2, x3, y, y1, y2, y3, rand1, rand2;
 
    HPEN DrawPen;                     // перо
    RECT rect;                        // клиентская область
    DrawPen = CreatePen(PS_SOLID, 1, RGB(0,0,0));    
 
    GetClientRect(hwnd, &rect);		
    nx = rect.right / 2;		 // находим координаты середины окна	
    ny = rect.bottom / 2;
 
    ax = 400.0;		             // начальное значение
    ay = ax;
 
 
 
    srand((unsigned) time(&t));	      // генерация случайных чисел
    rand1 = rand() % 20000;
    rand2 = rand() % 20000;
    rand1 = 50000-5*rand1;
    rand2 = 50000-5*rand2;
 
    an = 10.0*(rand1-rand2);              
    can = 0.99*cos(an);                 // вычисление синусов и косинусов
    san = 0.99*sin(an);
    can1 = 1.01*cos(an);
    san1 = 1.01*sin(an);
 
 
    x3 = 0.01;               //начальные значения
    y3 = 0.01;
    e = 0.0;
 
 
 
    do {
        xa = x3*x3 - y3;
	    x2 = x3*can1 + xa*san1;
	    y2 = x3*san1 - xa*can1;
	    x3 = x2;
	    y3 = y2;
	    x = x2;
	    y = y2;
	    a = 0;
	    do {                            // рисуем орбиту
	        xa = x*x - y;			// вычисляем координаты текущей точки
		    x1 = x*can + xa*san;
		    y1 = x*san - xa*can;
		    x  = x1;
		    y  = y1;
		    a++;
		    MoveToEx(hdc, (int)(ax*x+nx), (int)(ay*y+ny), NULL);
		    LineTo(hdc, (int)(ax*x+nx) - 1, (int)(ay*y+ny) + 1);
	    } while ((fabs(x1)<=10000) && (fabs(y1)<=10000) && a <=100);
	    e = e + 0.1;
    } while ((fabs(x2) <= 10000) && (fabs(y2) <= 10000));
 
}

Ключевые слова: 
Фрактал KAM Torus
ВложениеРазмер
fractal.rar784.48 кб