Partage
  • Partager sur Facebook
  • Partager sur Twitter

Arbre à 2 branches récursif

    23 novembre 2017 à 11:44:09

    Bonjour,

    Dans le cadre d'un projet, je dois travailler sur la création d'un arbre récursif, qui, à partir d'une branche, en fait naître 2, en partant du milieu du segment précédent, et en effaçant la partie droite de ce segment. Puisqu'une image vaut mieux qu'un long discours :

    Voici mon code, je pense ne pas être loin mais je ne sais pas ce qui bloque...

    main.cpp

    void arbre(Vector a, Vector b, int branches, Color col, int pen_w)
    {
        Vector c,d,newb;
        newb.set_x(b.get_x()-a.get_x());b.get_y()-a.get_y();
        if (branches>0)
        {
            c.set_x(((a+b)/2).get_x());
            c.set_y(((a+b)/2).get_y());
            d.set_x(newb.Rotate(20).get_x()+a.get_x());
            d.set_y(newb.Rotate(20).get_y()+height/2);
            arbre(c,b,branches-1,WHITE,pen_w);
            arbre(c,d,branches-1,col,pen_w);
        }
        else
            drawLine(a,b,col,pen_w);
    }
    
    int main()
    {
        openWindow(width,height);
    
        // Question 6
        clearWindow();
        Vector d,e;
        d.set_x(100);d.set_y(250);e.set_x(400);e.set_y(250);
        arbre(d,e,4,BLACK,1);
        click();
    
        endGraphics();
        return 0;
    }

    vector.cpp

    #define _USE_MATH_DEFINES
    #include <cmath>
    using namespace std;
    #include "Vector.h"
    
    Vector Vector::operator+(Vector b) {
    	Vector c;
        for (int i=0;i<DIM;i++)
            c.coord[i] = coord[i] + b.coord[i];
    	return c;
    }
    
    Vector Vector::operator -(Vector b) {
    	Vector c;
        for (int i=0;i<DIM;i++)
            c.coord[i] = coord[i] - b.coord[i];
    	return c;
    }
    
    Vector Vector::operator*(double lambda) {
    	Vector c;
        for (int i=0;i<DIM;i++)
            c.coord[i] = coord[i] * lambda;
    	return c;
    }
    
    Vector Vector::operator/(double lambda) {
    	Vector c;
        for (int i=0;i<DIM;i++)
            c.coord[i] = coord[i] / lambda;
    	return c;
    }
    
    double Vector::operator*(Vector b) {
        double scalaire=0;
        for (int i=0;i<DIM;i++)
            scalaire+= coord[i] * b.coord[i];
        return scalaire;
    }
    
    double Vector::Norm() {
        double racine=0;
        for (int i=0;i<DIM;i++)
            racine+= coord[i] *coord[i];
        return sqrt(racine);
    }
    
    Vector Vector::Rotate(double angle) {
    	angle *= M_PI / 180;
    	Vector c;
    	double co = cos(angle);
    	double si = sin(angle);
        c.coord[0] = co * coord[0] + si * coord[1];
        c.coord[1] = - si * coord[1] + co * coord[1];
    	return c;
    }
    
    double Vector::get_x()
    {
        return coord[0];
    }
    
    double Vector::get_y()
    {
        return coord[1];
    }
    
    void Vector::set_x(double valx)
    {
        coord[0]=valx;
    }
    
    void Vector::set_y(double valy)
    {
        coord[1]=valy;
    }

    vector.h

    #pragma once
    
    // Question 7 : rien ne change dans le main puisque l'on a modifié les attributs et pas les méthodes !
    // Or dans le main on ne se sert que des méthodes puisque l'on a mis les attributs en privé !
    
    const int DIM=2;
    
    class Vector {
    
        double coord[DIM];
    
    public:
        // Somme de deux vecteurs
        Vector operator+(Vector b);
    
        // Difference de deux vecteurs
        Vector operator-(Vector b);
    
        // Multiplication scalaire * vecteur
        Vector operator*(double lambda);
        Vector operator/(double lambda);
    
        // Produit scalaire de deux vecteurs
        double operator*(Vector b);
    
        // Norme d'un vecteur
        double Norm();
    
        // Rotation (angle en degres)
        Vector Rotate(double angle);
    
        double get_x();
        double get_y();
        void set_x(double valx);
        void set_y(double valy);
    };
    

    Merci par avance pour votre aide,

    Louis

    • Partager sur Facebook
    • Partager sur Twitter
      23 novembre 2017 à 12:30:57

      > mais je ne sais pas ce qui bloque...

      Le débogueur est ton ami.

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        23 novembre 2017 à 12:47:33

        Merci pour ta réponse.

        J'ai déjà passé 4h sur ce problème et ai utilisé le débogueur, mais je n'arrive pas à modifier ce qui ne va pas...

        Honnêtement, ce n'est pas de la mauvaise volonté, il doit juste y avoir quelque chose que j'ai mal compris, sûrement par rapport à la manipulation des coordonnées dans la fenêtre...

        Merci,

        Louis

        • Partager sur Facebook
        • Partager sur Twitter
          23 novembre 2017 à 14:19:30

          >je n'arrive pas à modifier ce qui ne va pas...

          Si tu as déjà identifié ce qui ne va pas, tu as fait le plus dur.

          Donc, au lieu de nous balancer tout le code, donnes-nous la ligne dont le comportement ne correspond pas à tes attentes.

          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            23 novembre 2017 à 14:22:35

            LouisSuchier a écrit:

            je ne sais pas ce qui bloque...

            C'est tres light comme description du probleme. Qu'est ce qui se passe ? Tu as une erreur de compilation ? Un crash ? Un comportement pas attendu ? Si oui, quel est le comportement que tu observes ?

            Si c'est un probleme de comportement pas correct, commences par écrire des tests unitaires.

            • Partager sur Facebook
            • Partager sur Twitter

            Arbre à 2 branches récursif

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown