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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
program etoile;
uses
SysUtils, Cairo;
(* http://www.eschecs.fr/fichiers/freebasic/cairodll.zip *)
type
TData = array[0..5] of record
scale, value: integer;
end;
const
CData: TData = (
(scale: 100; value: 0),
(scale: 100; value: 0),
(scale: 100; value: 0),
(scale: 100; value: 0),
(scale: 100; value: 0),
(scale: 100; value: 0)
);
procedure DrawBackground(c: Pcairo_t; r, g, b, a: double);
var
i: integer;
begin
cairo_set_source_rgba(c, r, g, b, a);
for i := 0 to 5 do
begin
cairo_move_to(c, 0.0, 0.0);
cairo_line_to(c, 1 / 2, 0.0);
cairo_rotate(c, PI / 3);
end;
cairo_stroke(c);
end;
procedure DrawData(c: Pcairo_t; aData: TData; r, g, b, a: double);
function X(i: integer; r: double): double; begin result := 0.0 + (1 / 2) * cos(i * (PI / 3)) * r; end;
function Y(i: integer; r: double): double; begin result := 0.0 + (1 / 2) * sin(i * (PI / 3)) * r; end;
var
i: integer;
begin
cairo_set_source_rgba(c, r, g, b, a);
i := 5;
cairo_move_to(
c,
X(i, aData[i].value / aData[i].scale),
Y(i, aData[i].value / aData[i].scale)
);
for i := 0 to 5 do
cairo_line_to(
c,
X(i, aData[i].value / aData[i].scale),
Y(i, aData[i].value / aData[i].scale)
);
cairo_stroke(c);
end;
var
data: TData;
const
WIDTH = 512;
var
c: Pcairo_t;
s: Pcairo_surface_t;
i: integer;
begin
Randomize;
data := CData;
s := cairo_image_surface_create(CAIRO_FORMAT_ARGB32, WIDTH, WIDTH);
c := cairo_create(s);
cairo_scale(c, WIDTH, WIDTH);
cairo_translate(c, 1 / 2, 1 / 2);
cairo_set_source_rgb(c, 1.0, 1.0, 1.0);
cairo_paint(c);
cairo_set_line_width(c, 1 / 1000);
DrawBackground(c, 0.0, 0.0, 0.0, 1.0);
cairo_set_line_width(c, 1 / 200);
for i := Low(data) to High(data) do data[i].value := Random(data[i].scale div 3) + data[i].scale div 3;
DrawData(c, data, 1.0, 0.0, 0.0, 1.0);
for i := Low(data) to High(data) do data[i].value := data[i].value + (Random(3) - 1) * data[i].scale div 9;
DrawData(c, data, 0.0, 1.0, 0.0, 1.0);
for i := Low(data) to High(data) do data[i].value := data[i].value + (Random(3) - 1) * data[i].scale div 9;
DrawData(c, data, 0.0, 0.0, 1.0, 1.0);
cairo_surface_write_to_png(s, pchar(ChangeFileExt(ParamStr(0), '.png')));
cairo_destroy(c);
cairo_surface_destroy(s);
end. |
Partager