Матрица статей        Список статей        Всячина        Контакты       

Папоротник


Фрактальный папоротник

program Fern_Constr;

uses Graph, CRT;

const
	min = 1;
	
var
	gd, gm : Integer;

procedure lineto1(x, y : Integer; l, u : real);
begin
	Line(x, y, Round(x + l * cos(u)), Round(y - l * sin(u)));
end;

procedure Draw(x, y : Integer; l, u : real);

begin
	if KeyPressed then 
		exit;
	if l > min then 
	begin
		lineto1(x, y, l, u);
		x := Round(x + l * cos(u));
		y := Round(y - l * sin(u));
		Draw(x, y, l*0.4, u - 14*pi/30);
		Draw(x, y, l*0.4, u + 14*pi/30);
		Draw(x, y, l*0.7, u + pi/30);
	end;
end;

begin
	gd := Detect;
	InitGraph(gd, gm, 'c:\bp\bgi');
	Draw(320, 460, 140, pi/2);
	ReadKey;
	CloseGraph;
end.

Фрактальный папоротник

Приведённая ниже программа использует следующие преобразования:

Fern_1 {
	 0     0     0    0.16 0 0    0.01
	 0.85  0.04 -0.04 0.85 0 1.60 0.85
	 0.20 -0.26  0.23 0.22 0 1.60 0.07
	-0.15  0.28  0.26 0.24 0 0.44 0.07
}

Но можно использовать и другие, при этом папоротник принимает другой вид.

Fern_2 {
	 0       0       0      0.16   0 0    0.01 
	 0.8235  0.1629 -0.1324 0.8977 0 1.6  0.85 
	 0.2    -0.3901  0.23   0.2239 0 1.6  0.07 
	-0.15    0.28    0.26   0.24   0 0.44 0.07 
}

Fern_3 {
	 0      0     0     0.165 0 0    0.01 
	 0.84  -0.045 0.045 0.86  0 1.6  0.85 
	 0.25  -0.26  0.23  0.25  0 1.6  0.07 
	-0.135  0.28  0.26  0.245 0 0.44 0.07 
}
program fern;

uses crt, graph;

var
	gd, gm: integer;
  
procedure draw;

const
	iterations = 50000;
  
var
	t, x, y, p: real;
	k: longint;
	mid_x, mid_y, radius: integer;
  
begin
	mid_x := getmaxX div 2;
	mid_y := getmaxY;
	radius := trunc(0.1 * mid_y);
	randomize;
	x := 1.0; 
	y := 0.0;
	for k := 1 to iterations do 
	begin
		p := random;
		t := x;
		if p <= 0.85 then 
		begin
			x := 0.85 * x + 0.04 * y;
			y := -0.04 * t + 0.85 * y + 1.6
		end 
		else 
		if p <= 0.92 then 
		begin
			x := 0.2 * x - 0.26 * y;
			y := 0.23 * t + 0.22 * y + 1.6
		end 
		else if p <= 0.99 then 
		begin
			x := -0.15 * x + 0.28 * y;
			y := 0.26 * t + 0.24 * y + 0.44
		end 
		else 
		begin
			x := 0.0;
			y := 0.16 * y
		end;
		putpixel(mid_x+round(radius*x), mid_y-round(radius*y), 
			lightgreen)
	end
end;

begin
	gd := detect;
	initgraph(gd, gm, 'c:\bp\bgi');
	draw;
	readkey;
	closegraph
end.

Смотрите также:

Ссылки: