| оглавление | demo party в ex-СССР | infused bytes e-mag | новости от ib/news | другие проекты | письмо | | win koi lat |
|
Фрактальный
папортник
Итак, для начала ка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 т.е. каждое п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. 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 на противоположные, то же симпатично
выходит, не папоротник конечно, хотя с какой точки смотреть ;-)
#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, |