![]() |
Матрица статей Список статей Всячина Контакты | ||||||||||||
|
Папоротник
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. Смотрите также: Ссылки: |