|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Michael Ryazanov 2:5030/1006.64 16 Nov 2001 22:33:00 To : Mihail Popov Subject : Re: Mandelbrot set -------------------------------------------------------------------------------- 12.11 23:12 Mihail Popov, 2:5026/61.13 -> Michael Ryazanov MP>>> Существует-ли в природе алгоритм быстрого построения subj? MR>> Это смотря что считать быстрым. :-) В принципе, множество Мандельброта MR>> односвязно, поэтому можно просто нарисовать границу и MP> А как это нарисовать границу? MP> Я знаю только как по точкам его строить - это долго. Вот по точкам границу и рисовать. Пример программки (компилируется bcc 3.1), дальше будут комментарии: ___/~~~M.CPP~~~\___ __ _ . #include <conio.h> #include <graphics.h> #define for if(0); else for int xscr, yscr; // экранные координаты double x, y; // координаты (z = x + iy) double delta; // шаг int dir; // текущее направление int maxloop = 1; // макс. длина последовательности int iter(const double X, const double Y) { double x = X, y = Y; int i; for (i = 0; i < maxloop; ++i) { double Re = x * x, Im = y * y; if (Re + Im >= 4) break; y = 2 * x * y + Y; x = (Re - Im) + X; } return i; } void move(void) { const struct { // направление -> координаты int x, y; } d2c[8] = {{-1,-1},{0,-1},{1,-1},{1,0},{1,1},{0,1},{-1,1},{-1,0}}; dir = (dir + 6) & 7; while (iter(x + delta * d2c[dir].x, y + delta * d2c[dir].y) < maxloop) dir = (dir + 1) & 7; x += delta * d2c[dir].x; y += delta * d2c[dir].y; xscr += d2c[dir].x; yscr += d2c[dir].y; } void main(void) { int gd = installuserdriver("svga256", 0), gm = 2; initgraph(&gd, &gm, ""); for (int i = 0; i < 64; ++i) setrgbpalette(i, i, i, i); delta = 2.0/getmaxy(); for (int i = 1; i < 64; ++i) { x = -2; y = 0; xscr = 0; yscr = getmaxy(); do { putpixel(xscr, yscr, i); move(); } while (y <= 0); maxloop += 1; } while (!kbhit()); while (kbhit()) getch(); closegraph(); } ~~~\___M.CPP___/~~~ ~~ ~ ' Интерес тут представляет функция move(), которая, собственно, и осуществляет перемещение по границе. Принцип простой -- проверить окружающие 8 точек: ЪДВДВДї і0і1і2і ГДЕДЕДґ і7і і3і ГДЕДЕДґ і6і5і4і АДБДБДЩ и шагнуть в нужную ("следующую"). MP> Hа закраску темных пикселей больше всего времени и уходит, а граничные MP> точки быстрее рисуются. FRACTINT считает вначале крупными клетками, а потом нужные пересчитывает помельче. Как он определяет "нужные", я не знаю... |V|uxau/\ --- -- - ъ * Origin: Ф И З Ф А К - Ч Е М П И О H ! (2:5030/1006.64) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/45633bf588cf.html, оценка из 5, голосов 10
|