1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| program Snowflake;
{ http://www.informatik.uni-kiel.de/~sb/WissRech/cairo3_recursion.c }
uses
cairo;
procedure snowflake_arm(cr: pcairo_t; l: integer);
begin
cairo_move_to(cr, 0.0, 0.0);
cairo_line_to(cr, 0.0, 0.5);
cairo_stroke(cr);
if l > 0 then
begin
cairo_save(cr);
cairo_translate(cr, 0.0, 0.5);
cairo_scale(cr, 0.45, 0.45);
snowflake_arm(cr, l - 1);
cairo_rotate(cr, 1.2);
snowflake_arm(cr, l - 1);
cairo_rotate(cr, -2.4);
snowflake_arm(cr, l - 1);
cairo_restore(cr);
end;
end;
const
ZOOM = 3;
var
cr: pcairo_t;
surface: pcairo_surface_t;
i, l: integer;
begin
surface := cairo_image_surface_create(CAIRO_FORMAT_ARGB32, ZOOM * 400, ZOOM * 80);
cr := cairo_create(surface);
cairo_set_source_rgba(cr, 1, 1, 1, 1);
cairo_paint(cr);
cairo_set_source_rgba(cr, 0, 0, 0, 1);
for l := 0 to 4 do
begin
cairo_save(cr);
cairo_translate(cr, ZOOM * 40.0 + l * ZOOM * 80.0, ZOOM * 40.0);
cairo_scale(cr, ZOOM * 40.0, ZOOM * 40.0);
cairo_set_line_width(cr, 0.01);
for i := 0 to 4 do
begin
cairo_save(cr);
cairo_rotate(cr, 2.0 * PI * i / 5);
snowflake_arm(cr, l);
cairo_restore(cr);
end;
cairo_restore(cr);
end;
cairo_surface_write_to_png(surface, 'snowflake.png');
cairo_destroy(cr);
cairo_surface_destroy(surface);
end. |
Partager