Exercice langage C: Fonction Arbre

Reprenez le programme vu en cours et permettant de dessiner un arbre:

#include
#include "swindow.h"
void dessine_arbre(SimpleWindow * window,
int x1, int y1, int x2, int y2, int nb_niveaux)
{
window->drawLine(x1, y1, x2, y2);
if (nb_niveaux > 0) {
int vx = 0.8 * (x2 - x1);
int vy = 0.8 * (y2 - y1);
float angle = 30 * 3.14159 / 180;
int xA = x2 + cos(angle) * vx - sin(angle) * vy;
int yA = y2 + sin(angle) * vx + cos(angle) * vy;
int xB = x2 + cos(-angle) * vx - sin(-angle) * vy;
int yB = y2 + sin(-angle) * vx + cos(-angle) * vy;
dessine_arbre(window, x2, y2, xA, yA, nb_niveaux - 1);
dessine_arbre(window, x2, y2, xB, yB, nb_niveaux - 1);
}
}
int main(int argc, char ** argv)
{
const int longueur = 500;
const int hauteur = 500;
SimpleWindow window("arbre", longueur, hauteur);
window.map();
// Remplit la fenetre en blanc:
window.color(1, 1, 1);
window.fill();
// Dessine en noir:
window.color(0, 0, 0);
// Instructions de dessin:
dessine_arbre(&window, 250, 450, 250, 350, 5);
window.show();
getchar();
return 0;
}

  1. Comment modifier le programme pour que les segments les plus petits soient affichés en vert, le reste de l'arbre étant toujours affiché en noir ?

Il y plusieurs choses à faire pour rendre l'arbre moins régulier. Premièrement, on peut varier l'angle entre les branches. Pour un meilleur résultat, on choisira un angle différent pour chacune des deux nouvelles branches.

Ensuite, on peut faire varier la longueur des nouvelles branches. Ici aussi, il vaut mieux utiliser des coefficients différents pour chacune des nouvelles branches.

Pour obtenir un résultat similaire à la figure d'exemple, il convient de bien choisir l'angle maximum entre les branches, ainsi que les coefficients minimum et maximum de longueur. Il est aussi conseillé d'augmenter le nombre de niveaux de l'arbre.

#include
#include "swindow.h"
void dessine_arbre(SimpleWindow * window,
int x1, int y1, int x2, int y2, int nb_niveaux)
{
// Dessine en vert si on se trouve au dernier niveau, en noir sinon.
if (nb_niveaux == 0)
window->color(0, 1, 0);
else
window->color(0, 0, 0);
window->drawLine(x1, y1, x2, y2);
if (nb_niveaux > 0) {
const int angle_max = 50;
const float ratio_min = 0.5;
const float ratio_max = 0.8;
float ratio;
// Choisit aleatoirement la longueur des prochains segments
// premiere branche
ratio = (float(rand()) / RAND_MAX * (ratio_max-ratio_min)) + ratio_min;
int vx1 = int(ratio * (x2 - x1));
int vy1 = int(ratio * (y2 - y1));
// deuxieme branche
ratio = (float(rand()) / RAND_MAX * (ratio_max-ratio_min)) + ratio_min;
int vx2 = int(ratio * (x2 - x1));
int vy2 = int(ratio * (y2 - y1));
// Choisit l'angle aleatoirement entre 0 et angle_max (et le convertit en radians)
float angle = (rand() % angle_max) * 3.14159 / 180;
int xA = int(x2 + cos(angle) * vx1 - sin(angle) * vy1);
int yA = int(y2 + sin(angle) * vx1 + cos(angle) * vy1);
// Angle different pour la deuxieme branche
angle = (rand() % angle_max) * 3.14159 / 180;
int xB = int(x2 + cos(-angle) * vx2 - sin(-angle) * vy2);
int yB = int(y2 + sin(-angle) * vx2 + cos(-angle) * vy2);
dessine_arbre(window, x2, y2, xA, yA, nb_niveaux - 1);
dessine_arbre(window, x2, y2, xB, yB, nb_niveaux - 1);
}
}
int main(int argc, char ** argv)
{
const int longueur = 500;
const int hauteur = 500;
// Initialise le generateur de nombres aleatoires
srand(time(0));
SimpleWindow window("arbre", longueur, hauteur);
window.map();
// Remplit la fenetre en blanc:
window.color(1, 1, 1);
window.fill();
// Dessine en noir:
window.color(0, 0, 0);
// Instructions de dessin:
dessine_arbre(&window, 250, 450, 250, 350, 10);
window.show();
getchar();
return 0;
}

Article publié le 17 Mars 2012 Mise à jour le Lundi, 07 Novembre 2022 09:20 par Babachekhe Mohamed