IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Arbre de Pythagore

Dessin d'un arbre de Pythagore dans une image PNG, au moyen de la bibliothèque Cairo.
Avatar de nathaspacig
Membre à l'essai https://www.developpez.com
Le 11/09/2016 à 14:37
C'est jolie et plutôt bien fait! ;-)
Avatar de Jipété
Expert éminent sénior https://www.developpez.com
Le 12/09/2016 à 12:53
Citation Envoyé par Roland Chastain Voir le message
Qu'en pensez-vous ?
Que c'est vraiment dommage que je n'arrive pas à faire afficher quelque chose avec Cairo sous Linux : ton programme fonctionne et me génère bien un fichier, moi ce que je voudrais ça serait voir la même image dans un TImage ou TPaintbox ou simplement sur le canvas de TForm1, mais bon, voir quelque chose et j'ai encore passé un temps dément sans rien trouver.

À croire que personne n'a jamais fait tourner Cairo sous Linux avec Pascal

Maintenant, je me demande si ça vaut le coup de se décarcasser avec cette librairie : lors de mes essais, j'ai trouvé une instruction qui devrait permettre (on dirait, tout au moins, vu le nom : surface := cairo_image_surface_create_from_png (PChar(ExtractFilePath(Application.ExeName) + 'bidon.png'));) de lire un fichier.
Ne voyant toujours rien s'afficher, j'ai utilisé la méthode bourrin : changement du nom du fichier, et relance. Je m'attendais à un message d'erreur, et non, rien de chez rien...
Ça n'inspire pas confiance...
Avatar de Roland Chastain
Rédacteur/Modérateur https://www.developpez.com
Le 12/09/2016 à 15:26
Citation Envoyé par nathaspacig Voir le message
C'est jolie et plutôt bien fait! ;-)
Merci.

Citation Envoyé par Jipété Voir le message
Que c'est vraiment dommage que je n'arrive pas à faire afficher quelque chose avec Cairo sous Linux : ton programme fonctionne et me génère bien un fichier, moi ce que je voudrais ça serait voir la même image dans un TImage ou TPaintbox ou simplement sur le canvas de TForm1, mais bon, voir quelque chose et j'ai encore passé un temps dément sans rien trouver.

À croire que personne n'a jamais fait tourner Cairo sous Linux avec Pascal
Oui, c'est dommage. J'attends que quelqu'un nous donne la solution. En tout cas merci pour le temps que tu as passé à chercher.
Avatar de Roland Chastain
Rédacteur/Modérateur https://www.developpez.com
Le 18/09/2016 à 6:51
Citation Envoyé par Jipété Voir le message
À croire que personne n'a jamais fait tourner Cairo sous Linux avec Pascal
En y pensant, je me souviens avoir lu que le composant TCairoPaintBox est utilisable sous Linux. Donc la solution existe.

Il faudrait regarder dans le code du composant ou même interroger directement l'auteur. Personnellement, n'étant pas utilisateur de Linux, je ne suis pas bien placé pour le faire.
Avatar de Jipété
Expert éminent sénior https://www.developpez.com
Le 18/09/2016 à 19:38
Bonsoir, Roland,

et merci de ce retour.
Citation Envoyé par Roland Chastain Voir le message
En y pensant, je me souviens avoir lu que le composant TCairoPaintBox est utilisable sous Linux. Donc la solution existe.

Il faudrait regarder dans le code du composant ou même interroger directement l'auteur.
Je t'avoue franchement qu'avec toutes les misères que me fait un simple TImage, il y a des fois où je suis vraiment découragé par tout ça... Alors, s'il faut encore aller farfouiller dans du code pour un résultat plus qu'incertain (si encore l'auteur avait précisé la compatibilité de ses composants mais non, il n'y a rien sur la page à ce propos...), je me demande si le jeu en vaut la chandelle.
En tout cas, pas en ce moment, où j'ai d'autres chats à fouetter (les pauvres bêtes )

Mais merci d'y avoir pensé.
Avatar de Roland Chastain
Rédacteur/Modérateur https://www.developpez.com
Le 19/09/2016 à 18:35
Voici une variation de l'arbre de Pythagore : la taille de l'un des carrés est choisie au hasard (mais toujours inférieure à celle de l'autre carré).



Code : Sélectionner tout
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
uses
  Cairo, Math;

function RandomRange(const first, last: double): double;
begin
  result := (Random(1000) / 1000) * (last - first) + first
end;

var 
  context: pcairo_t;
  surface: pcairo_surface_t;

procedure draw_branches(const x1, y1, s1: double; const n: integer);
procedure draw_branch(const x2, y2, a, x3, y3, s2: double);
begin
  cairo_save(context);
  
  cairo_translate(context, x2, y2);
  cairo_rotate(context, a);
  
  cairo_rectangle(context, x3, y3, s2, s2);
  cairo_fill(context);
  
  draw_branches(x3, y3, s2, n - 1);
  
  cairo_restore(context);
end;
var
  s2, s3, a1, a2: double;  
begin
  if n > 0 then
  begin
    s2 := s1 / Sqrt(2);
    s3 := s1 / RandomRange(Sqrt(2), 2);
    
    a1 := ArcCos((s2 * s2 + s1 * s1 - s3 * s3) / (2 * s2 * s1));
    a2 := ArcCos((s3 * s3 + s1 * s1 - s2 * s2) / (2 * s3 * s1));
    
    draw_branch(x1,      y1, -a1,   0, -s2, s2);
    draw_branch(x1 + s1, y1,  a2, -s3, -s3, s3);
  end;
end;

const
  SURFACE_WIDTH = 600;
  SURFACE_HEIGHT = 2 * SURFACE_WIDTH div 3;
  SQUARE_SIZE = SURFACE_HEIGHT / 4;
  X = (SURFACE_WIDTH - SQUARE_SIZE) / 2;
  Y = SURFACE_HEIGHT - SQUARE_SIZE;
  
begin
  surface := cairo_image_surface_create(CAIRO_FORMAT_ARGB32, SURFACE_WIDTH, SURFACE_HEIGHT);
  context := cairo_create(surface);
  
  cairo_set_line_width(context, 2);
  
  cairo_rectangle(context, X, Y, SQUARE_SIZE, SQUARE_SIZE);
  cairo_set_source_rgba(context, 0, 0, 1, 0.8);
  cairo_fill(context);

  draw_branches(X, Y, SQUARE_SIZE, 8);
  
  cairo_surface_write_to_png(surface, 'image.png');
  cairo_destroy(context);
  cairo_surface_destroy(surface);
end.
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.