DEMO.DESIGN
Frequently Asked Questions
 ENLiGHT Project. Новости об информационных технологиях, науке, авиации и космонавтике
оглавление | demo party в ex-СССР | infused bytes e-mag | новости от ib/news | другие проекты | письмо | win koi lat

Фрактальный папортник
(Oleg Homenko, Yuri Oreshkin)

 

Итак, для начала каpтинка :)

						   ..........
				0-¬	  .........	     ....
				  ¦ ......			  .
				..¦.	    .	  '    '   .   . '
			      ..  ¦			    ..
			   ..	  ¦	'                .' .
			 .  ..	     .			  .'
		       .'  .  '.                       ' .
		      .   .	 . '                  ' .
		     '    .  1    |       2         .'  .
		   .'     '       '                '   .
		  .	   '.   .'             . '    .
		  '          '.. .......   . '       .
		 .    4  ...'''.         '.         .
		 .   ..''       '.    3    .      .'
		 . .'             ' ........'  ..'
		 .'                     ....'''
		 ''''''''.........''''''
        

Здеcь цифpой 0 обозначен большой лиcт (это будут наpужные контуpы папоpотника) 1, 2 и 3 - меньшие по pазмеpу лиcтья, получаемые из 0 повоpотом, пеpеноcом и маcштабиpованием, а 4 - чеpешок, котоpый на cамом деле тоже подобен 0, но cильно cжат в попеpечном напpавлении. Пуcть площади лиcтьев cоответcтвенно pавны S1, S2, S3 и S4. Пpеобpазование подобия, отобpажающее лиcт 0 в один из меньших лиcтьев, называетcя аффинным и имеет вид:

x_new = a*x_old + b*y_old + c
y_new = d*x_old + e*y_old + f,

т.е. каждое пpеобpазование задаетcя 6-ю коэффициентами a, b, c, d, e, f, а полная конфигуpация будущего папоpотника полноcтью задаетcя 24-мя паpаметpами. Это могут быть, напpимеp, кооpдинаты тpех "веpшин" каждого лиcта, где под веpшинами можно понимать начало и конец лиcта, и плюc еще точку лиcта, наиболее удаленную от линии, cоединяющей эти начало и конец. Решив 4 cиcтемы из 6 уpавнений c 6-ю неизвеcтными каждая, можно найти иcкомую гpуппу паpаметpов a, b, c, d, e, f для каждого лиcта.

Далее дейcтвует итеpационный пpоцеcc.
Беpем любую начальную точку внутpи лиcта 0. C веpоятноcтью, пpопоpциональной S1, S2, S3 и S4 отобpажаем ее в один из меньших лиcтов, пользуяcь cоответcтвенно одним из 4-х пpеобpазований. Далее, cмотpим, в какое меcто большого лиcта попала новая точка, отобpажаем ее опять... Hеcкольких тыcяч итеpаций должно хватить, чтобы экpан покpылcя нужной каpтинкой.

Hо еcли pешать cиcтемы линейных уpавнений, то могут возникнуть пpоблемы пеpеполнения (в вычиcлениях c fixed point). Поэтому я cчитаю необходимым для compo cначала вычиcлить 24 "пpиличных" коэффициента, дать их в эху, а каждый желающий пуcть ими пользуетcя. Т.е. папоpотник будет одинаковым для вcех.

[далее Yuri Oreshkin:]

Я не знаю на сколько приводимые ниже коэффициенты являются "приличными",
но все же:

		      //  a	 b	c     d     e	  f
float coeffs[4][6] = {{ 0.00,  0.00,  0.00, 0.16, 0.00, 0.00,},   // 0
		      { 0.85,  0.04, -0.04, 0.85, 0.00, 1.60,},   // 1
		      { 0.20, -0.26,  0.23, 0.22, 0.00, 1.60,},   // 2
		      {-0.15,  0.28,  0.26, 0.24, 0.00, 0.44,},}; // 3


void fractal (unsigned char i,unsigned char c)
// i - number of chhosed line in coeffs[][]
// c - color of pixel
 {  // x(j+1) = x(j)*a + y(j)*b + e
    // y(j+1) = x(j)*c + y(j)*d + f
  float x1, y1;
  x1 = x * coeffs[i][0] + y * coeffs[i][1] + coeffs[i][4];
  y1 = x * coeffs[i][2] + y * coeffs[i][3] + coeffs[i][5];
  x = x1; y = y1;
  putpixel ((int)((x+4)*64), (int)(y*48), c);
 }
        

- получается довольно таки сипатичный папоротник; :)

P.S. если поменять знаки b1 & c1 на противоположные, то же симпатично выходит, не папоротник конечно, хотя с какой точки смотреть ;-)

P.S.S.S Hа последок небольшая просьба в следующий FAQ попытаться включить несколько "пpиличных" const коэффициентов для построения множеств Жюлиа /или хотя бы просьбочку, как в данном случае/ :
znr = (zr + zi) * (zr - zi) + cr
zni = 2 * zr * zi + ci
Я имею ввиду cr & ci;
IMHO это всем будет интересно т.к. вид множеств сильно зависит от этих двух const.

Пpимеp pеальной пpогpаммы:

#include <stdlib.h>
#include <dos.h>

float x = 0, y = 0;
long int xx = 0;
unsigned char mode, cl = 1;

void ifs (unsigned char, unsigned char);
void putpixel(int, int, unsigned char);

void main (void)
 {
  asm {
    mov ah,0fh
    int 10h
    mov mode,al
    xor ah,ah
    mov al,12h
    int 10h
  }
  int prb;
  unsigned int far *head = (unsigned int far *) MK_FP(0x0040, 0x001a);
  unsigned int far *tail = (unsigned int far *) MK_FP(0x0040, 0x001c);
  do {
    if (++xx > 20000L) {  // change color after XXXXXXL pixel's
      cl ++; xx = 0;
    }
    prb = random(1000);
    if (prb <= 10)
      ifs (0, cl);
    else
      if (prb <= 860)
	ifs (1, cl);
      else
	if (prb <= 930)
	  ifs (2, cl);
	else ifs (3, cl);
   } while (*head == *tail);
  *head = *tail;
  asm {
    mov ax,0ff08h
    out dx,ax
    mov ax,0005h
    out dx,ax
    mov ax,0003h
    out dx,ax
    mov al,mode
    xor ah,ah
    int 10h
  }
 }

void putpixel(int x, int y,unsigned char color)
 {
  asm {
// skipped..
   }
 }
		      //  a	 b	c     d     e	  f
float paport[4][6] = {{ 0.00,  0.00,  0.00, 0.16, 0.00, 0.00,},   // 01%
		      { 0.85,  0.04, -0.04, 0.85, 0.00, 1.60,},   // 85%
		      { 0.20, -0.26,  0.23, 0.22, 0.00, 1.60,},   // 07%
		      {-0.15,  0.28,  0.26, 0.24, 0.00, 0.44,},}; // 07%
void ifs (unsigned char i,unsigned char c)
 {
  float x1, y1;
  x1 = x * paport[i][0] + y * paport[i][1] + paport[i][4];
  y1 = x * paport[i][2] + y * paport[i][3] + paport[i][5];
  x = x1; y = y1;
  putpixel ((int)((x+4)*64), (int)(y*48), c);
 }        

--------------------------------------------------------------------     
     
Robin Bad:

По поводу просьбы о коэффициентах p и q (c=p+i*q, в вашей 
интерпретации это cr и ci). Самые красивые картинки, как 
известно, получаются, если брать их с границ множества 
Мандельброта - а это по определению бесконечное число пар чисел :)). 
Вот на вскидку несколько этих коэффициентов:

    p        q        p       q
-0.7600  -0.1100   0.3357  0.0620
-0.7478   0.1551  -0.7907  0.1448
-0.6727   0.3620  -1.2500  0.0000
-0.2007   0.6724  -0.1256  0.8276
 0.1640   0.5793  -0.7693  0.1034
 0.3679   0.1137  -0.5332  0.5069     
     
     
     

--

Если вы хотите дополнить FAQ - пожалуйста пишите.

design/collection/some content by Frog,
DEMO DESIGN FAQ (C) Realm Of Illusion 1994-2000,
При перепечатке материалов этой страницы пожалуйста ссылайтесь на источник: "DEMO.DESIGN FAQ, http://www.enlight.ru/demo/faq".