Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Mandelbrot set   Mihail Popov   08 Nov 2001 21:57:06 
 Mandelbrot set   Aleksey Malov   09 Nov 2001 14:36:19 
 Re: Mandelbrot set   Michael Ryazanov   11 Nov 2001 01:23:00 
 Mandelbrot set   Mihail Popov   13 Nov 2001 00:12:57 
 Mandelbrot set   Alex Astafiev   16 Nov 2001 05:30:11 
 Mandelbrot set   Mihail Popov   17 Nov 2001 01:30:30 
 Mandelbrot set   Egorov Pavel   18 Nov 2001 02:38:43 
 Mandelbrot set   Mihail Popov   19 Nov 2001 23:12:40 
 Mandelbrot set   Alex Astafiev   20 Nov 2001 10:53:16 
 Re: Mandelbrot set   Michael Ryazanov   16 Nov 2001 22:33:00 
 Re: Mandelbrot set   Nick Voronin   17 Nov 2001 23:49:28 
 Mandelbrot set   Alex Astafiev   16 Nov 2001 05:04:03 
 Mandelbrot set   Nickita A Startcev   17 Nov 2001 18:06:52 
 Re: Mandelbrot set   Michael Ryazanov   19 Nov 2001 21:18:00 
Архивное /ru.algorithms/45633bf588cf.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional