Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {Program wyswietlajacy fraktale - zbiory Julii, Mandelbrota oraz "Plonacy statek"}
- {kompilacja: tpc fractals -$N+ -$G+}
- program Fractals;
- const
- MAX_X = 320;
- MAX_Y = 200;
- {typy fraktali}
- JULIA = 0;
- MANDELBROT = 1;
- BURNING_SHIP = 2;
- var
- {parametry fraktala:}
- c_re :double; {czesc Re}
- c_im :double; {czesc Im}
- fractalType :byte; {typ fraktala}
- {tablica ekranu:}
- tab :Array[0..MAX_X-1, 0..MAX_Y-1] of byte;
- {procedury zewnetrzne}
- procedure PutPixel(kolor :byte; x,y :word); external;
- procedure Init13h; external;
- procedure Close13h; external;
- function PauseKey :char; external;
- procedure Cls; external;
- {dolacz plik OBJ odpowiedni}
- {$L proc.obj}
- function SprawdzPunkt(z_re, z_im :double; iter, fract :byte) :byte; assembler;
- var
- x, y :double;
- xtemp :double;
- asm
- finit
- push CX
- mov CL, 0 {Julia}
- cmp CL, fract
- je @@jul
- inc CL {Mandelbrot}
- cmp CL, fract
- je @@mand
- jmp @@burn {Plonacy statek}
- @@jul: {fraktal zbior Julii}
- mov CL, 0
- @@petlaj:
- cmp CL, iter
- je @@koniec
- fld z_re {po: z_re#}
- fld z_re {po: z_re; z_re#}
- fmulp {po: z_re*z_re#}
- fld z_im {po: z_im; z_re*z_re#}
- fld z_im {po: z_im; z_im; z_re*z_re#}
- fmulp {po: z_im*z_im; z_re*z_re#}
- faddp {po: z_im*z_im+z_re*z_re#}
- fld1 {po: 1.0; z_im*z_im+z_re*z_re#}
- fld1 {po: 1.0; 1.0; z_im*z_im+z_re*z_re#}
- fld1 {po: 1.0; 1.0; 1.0; z_im*z_im+z_re*z_re#}
- fld1 {po: 1.0; 1.0; 1.0; 1.0; z_im*z_im+z_re*z_re#}
- faddp {po: 2.0; 1.0; 1.0; z_im*z_im+z_re*z_re#}
- faddp {po: 3.0; 1.0; z_im*z_im+z_re*z_re#}
- faddp {po: 4.0; z_im*z_im+z_re*z_re#}
- fcompp {po: #}
- fstsw AX
- sahf
- jb @@koniec
- fld z_re {po: z_re#}
- fld z_re {po: z_re; z_re#}
- fld z_re {po: z_re; z_re; z_re#}
- fmulp {po: z_re*z_re; z_re#}
- fld z_im {po: z_im; z_re*z_re; z_re#}
- fld z_im {po: z_im; z_im; z_re*z_re; z_re#}
- fmulp {po: z_im*z_im; z_re*z_re; z_re#}
- fsubp {po: z_re*z_re - z_im*z_im; z_re#}
- fld c_re {po: c_re; z_re*z_re - z_im*z_im; z_re#}
- faddp {po: c_re + z_re*z_re - z_im*z_im; z_re#}
- fstp z_re {po: z_re#}
- fld z_im {po: z_im; z_re#}
- fld1 {po: 1.0; z_im; z_re#}
- fld1 {po: 1.0; 1.0; z_im; z_re#}
- faddp {po: 2.0; z_im; z_re#}
- fmulp {po: 2.0*z_im; z_re#}
- fmulp {po: 2.0*z_im*z_re#}
- fld c_im {po: c_im; 2.0*z_im*z_re#}
- faddp {po: c_im + 2.0*z_im*z_re#}
- fstp z_im {po: #}
- inc CL
- jmp @@petlaj
- @@mand: {fraktal zbior Mandelbrota}
- mov CL, 0
- fldz {po: 0.0#}
- fstp x {po: #}
- fldz {po: 0.0#}
- fstp y {po: #}
- @@petlam:
- cmp CL, iter
- je @@koniec
- fld x {po: x#}
- fld x {po: x; x#}
- fmulp {po: x*x#}
- fld y {po: y; x*x#}
- fld y {po: y; y; x*x#}
- fmulp {po: y*y; x*x#}
- faddp {po: y*y + x*x#}
- fld1 {po: 1.0; y*y + x*x#}
- fld1 {po: 1.0; 1.0; y*y + x*x#}
- fld1 {po: 1.0; 1.0; 1.0; y*y + x*x#}
- fld1 {po: 1.0; 1.0; 1.0; 1.0; y*y + x*x#}
- faddp {po: 2.0; 1.0; 1.0; y*y + x*x#}
- faddp {po: 3.0; 1.0; y*y + x*x#}
- faddp {po: 4.0; y*y + x*x#}
- fcompp {po: #}
- fstsw AX
- sahf
- jb @@koniec
- fld z_re {po: z_re#}
- fld x {po: x; z_re#}
- fld x {po: x; x; z_re#}
- fmulp {po: x*x; z_re#}
- fld y {po: y; x*x; z_re#}
- fld y {po: y; y; x*x; z_re#}
- fmulp {po: y*y; x*x; z_re#}
- fsubp {po: x*x - y*y; z_re#}
- faddp {po: x*x - y*y + z_re#}
- fstp xtemp {po: #}
- fld y {po: y#}
- fld x {po: x; y#}
- fld1 {po: 1.0; x; y#}
- fld1 {po: 1.0; 1.0; x; y#}
- faddp {po: 2.0; x; y#}
- fmulp {po: 2.0*x; y#}
- fmulp {po: 2.0*x*y#}
- fld z_im {po: z_im; 2.0*x*y#}
- faddp {po: 2.0*x*y + z_im#}
- fstp y {po: #}
- fld xtemp {po: xtemp#}
- fstp x {po: #}
- inc CL
- jmp @@petlam
- @@burn: {fraktal Plonacy Statek}
- mov CL, 0
- fldz {po: 0.0#}
- fstp x {po: #}
- fldz {po: 0.0#}
- fstp y {po: #}
- @@petlab:
- cmp CL, iter
- je @@koniec
- fld x {po: x#}
- fabs {po: |x|#}
- fstp x {po: #}
- fld y {po: y#}
- fabs {po: |y|#}
- fstp y {po: #}
- fld x {po: x#}
- fld x {po: x; x#}
- fmulp {po: x*x#}
- fld y {po: y; x*x#}
- fld y {po: y; y; x*x#}
- fmulp {po: y*y; x*x#}
- faddp {po: y*y + x*x#}
- fld1 {po: 1.0; y*y + x*x#}
- fld1 {po: 1.0; 1.0; y*y + x*x#}
- fld1 {po: 1.0; 1.0; 1.0; y*y + x*x#}
- fld1 {po: 1.0; 1.0; 1.0; 1.0; y*y + x*x#}
- faddp {po: 2.0; 1.0; 1.0; y*y + x*x#}
- faddp {po: 3.0; 1.0; y*y + x*x#}
- faddp {po: 4.0; y*y + x*x#}
- fcompp {po: #}
- fstsw AX
- sahf
- jb @@koniec
- fld z_re {po: z_re#}
- fld x {po: x; z_re#}
- fld x {po: x; x; z_re#}
- fmulp {po: x*x; z_re#}
- fld y {po: y; x*x; z_re#}
- fld y {po: y; y; x*x; z_re#}
- fmulp {po: y*y; x*x; z_re#}
- fsubp {po: x*x - y*y; z_re#}
- faddp {po: x*x - y*y + z_re#}
- fstp xtemp {po: #}
- fld y {po: y#}
- fld x {po: x; y#}
- fld1 {po: 1.0; x; y#}
- fld1 {po: 1.0; 1.0; x; y#}
- faddp {po: 2.0; x; y#}
- fmulp {po: 2.0*x; y#}
- fmulp {po: 2.0*x*y#}
- fld z_im {po: z_im; 2.0*x*y#}
- faddp {po: 2.0*x*y + z_im#}
- fstp y {po: #}
- fld xtemp {po: xtemp#}
- fstp x {po: #}
- inc CL
- jmp @@petlab
- @@koniec:
- {wynik w AL}
- mov AL, CL
- pop CX
- end;{SprawdzPunkt}
- procedure RysujFraktal(x_min, x_max, y_min, y_max :double; iter, fract :byte);
- var
- z_re :double;
- z_im :double;
- x :word;
- y :word;
- x_res :double;
- y_res :double;
- wynik :byte;
- maxx :word;
- maxy :word;
- begin
- asm
- {x_res := (x_max - x_min) / MAX_X;}
- finit
- fld x_max
- fsub x_min
- mov maxx, MAX_X
- fidiv maxx
- fstp x_res
- {y_res := (y_max - y_min) / MAX_Y;}
- fld y_max
- fsub y_min
- mov maxy, MAX_Y
- fidiv maxy
- fstp y_res
- end;
- z_re := x_min;
- for x := 0 to (MAX_X - 1) do begin
- z_im := y_min;
- for y := 0 to (MAX_Y - 1) do begin
- wynik := SprawdzPunkt(z_re, z_im, iter, fract) + 15 - iter;
- if (wynik > 15) then
- wynik := 0;
- tab[x, y] := wynik + 16;
- z_im := z_im + y_res;
- end;
- z_re := z_re + x_res;
- end;
- for x := 0 to (MAX_X - 1) do
- for y := 0 to (MAX_Y - 1) do
- PutPixel(tab[x,y],x,y);
- end;{RysujFraktal}
- procedure Dzialaj;
- var
- key :char;
- x :double;
- y :double;
- skala :double;
- it :byte;
- begin
- x := -2.5;
- y := -1.5625;
- skala := 1/64;
- it := 16;
- repeat
- RysujFraktal(x, x + skala * MAX_X, y, y + skala * MAX_Y, it, fractalType);
- key := PauseKey;
- case key of
- '=': {wlasciwie '+'}
- it := it + 4;
- '-':
- it := it - 4;
- 'e':
- begin
- skala := skala / 2;
- x := x + 160*skala;
- y := y + 100*skala;
- end;
- 'q':
- begin
- x := x - 160*skala;
- y := y - 100*skala;
- skala := skala * 2;
- end;
- 'w':
- y := y - 5*skala;
- 's':
- y := y + 5*skala;
- 'a':
- x := x - 5*skala;
- 'd':
- x := x + 5*skala;
- 'u':
- c_re := c_re - 0.01;
- 'j':
- c_re := c_re + 0.01;
- 'i':
- c_im := c_im - 0.01;
- 'k':
- c_im := c_im + 0.01;
- '1': {Julia}
- fractalType := JULIA;
- '2': {Mandelbrot}
- fractalType := MANDELBROT;
- '3': {Plonacy statek}
- fractalType := BURNING_SHIP;
- end;
- if (it < 16) then
- it := 16;
- if (it > 64) then
- it := 64;
- if (skala > 1/64) then
- begin
- skala := 1/64;
- x := x + 160*skala;
- y := y + 100*skala;
- end;
- if (c_re > 1) then
- c_re := 1;
- if (c_im > 1) then
- c_im := 1;
- if (c_re < -1) then
- c_re := -1;
- if (c_im < -1) then
- c_im := -1;
- until key = 'z';
- end;{Dzialaj}
- {glowny program}
- begin
- c_re := 0;
- c_im := 0;
- fractalType := JULIA; {Julia}
- Init13h;
- Dzialaj;
- Close13h;
- end.{Julia}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement