[C]Arbre ayant 4 fils

Corine -  
 Corine -
Bonjour,

J'ai écrit la fonction de création de mon arbre quaternaire(quadtree)
Je ne mets que le code qui concerne le quadtree.
Si vous avez besoin de voir autres choses pour pouvoir m'aider, je rajouterai.

Le fichier quadtree.h, contient la structure :
#ifndef QUADTREE_H
#define QUADTREE_H

//Cellule
typedef struct cell{
  //les valeurs minimales et maximales du quad en X et en Y
  float xMin;
  float yMin;
  float xMax;
  float yMax;
  //Position du point central du quad
  float xCenter;
  float yCenter;
  
  //Pointeurs 
  struct cell *NW;
  struct cell *NE;
  struct cell *SW;
  struct cell *SE;
}t_Cell;

typedef t_Cell*t_Quadtree;

t_Cell *createCell(float xMin, float yMin, float xMax, float yMax);

//Creation du quadtree
void createQuadTree(t_Quadtree quadtree);

#endif


Mon quadtree est mal conçu mais je n'arrive pas à le corriger.
De plus, j'aurais à parcourir l'arbre pour récupérer les sommets(en évitant les doublons) et pour définir les faces du maillage qu'il faudra mettre dans des tableaux.
Ca permettra de créer le sol
Je voudrai savoir s'il faut que je rajoute des champs à ma structure et comment m'y prendre
#include <stdio.h>
#include <stdlib.h>
#include "quadtree.h"
#include "parsing.h"
#include "image.h"

t_Cell *createCell(float xMin, float yMin, float xMax, float yMax){
  t_Cell * c;
  c = (t_Cell*)malloc(sizeof(t_Cell));
  if(c == NULL){
    fprintf(stderr,"erreur allocation\n");
    exit(1);
  }
  
  c->xMin = xMin;
  c->yMin = yMin;
  c->xMax = xMax;
  c->yMax = yMax;
  c->xCenter = (c->xMax - c->xMin)/2;
  c->yCenter = (c->yMax - c->yMin)/2;
  
  c->NW = NULL;
  c->NE = NULL;
  c->SW = NULL;
  c->SE = NULL;
  
  return c;
}

//Creation du quadtree
void createQuadTree(t_Quadtree quadtree){
  gl_texture_t *image;
  char *png;
  double width, height, altitude_max, tolerance;
  int i, min, max, variations_fortes;
  //Parsing du fichier de description pour recuperer les infos
  if(parse("fichier.txt",png,&width,&height,&altitude_max,&tolerance) != 0){
    fprintf(stderr,"erreur lors du parsing du fichier \"fichier.txt\"\n");
    return ;
  }
  //image contient l'image
  image = ReadPNGFromFile(png);
  
  //On ajoute la racine qui contient l'image complete
  if(quadtree == NULL){
    quadtree = createCell(0, (double)image->width, 0, (double)image->height);
    if(quadtree == NULL){
      fprintf(stderr,"erreur lors de la creation d'une cellule\n");
      return;
    }
  }
  //min et max contiennent le premier pixel contenu dans le tableau texels
  min = image->texels[0];
  max = image->texels[0];
  for(i=1; i<image->width*image->height; i++){
    if(min > image->texels[i]) min = image->texels[i];
    if(max < image->texels[i]) max = image->texels[i];
  }
  
  variations_fortes = max-min;
  if(variations_fortes > tolerance){
    quadtree->NE = createCell(quadtree->xMin,quadtree->xCenter,quadtree->yCenter, quadtree->yMax);
    quadtree->NW = createCell(quadtree->xCenter,quadtree->xMax,quadtree->yCenter, quadtree->yMax);
    quadtree->SE = createCell(quadtree->xMin,quadtree->xCenter,quadtree->yMin, quadtree->yCenter);
    quadtree->SW = createCell(quadtree->xCenter,quadtree->xMax,quadtree->yMin, quadtree->yCenter);
    createQuadTree(quadtree->NE);
    createQuadTree(quadtree->NW);
    createQuadTree(quadtree->SE);
    createQuadTree(quadtree->SE);
  }
}

2 réponses

Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Salut.
Je me rappel plus de ce que tu veux faire. Je me souvien que c'etait un peut compliquer.
Décri brievement ce que fait parse().
Tu as deux fois 'quadtree->SE'
Je trouve le if(quadtree==NULL) un peu étrange si celui ci est différents de 0. C normale que tu refasse plusieurs fois la même chose ? create(quadtree->SE) va faire creat(quadtree->NW) : tu tourne en rond, non?
De plus tu n'avance qu'en diagonale, est-ce normale ? tu n'a pas de N S, E O...
0
Corine
 
Salut,
Je me rappel plus de ce que tu veux faire. Je me souvien que c'etait un peut compliquer.

Il me faut créer un quadtree à partir d'une image

Décri brievement ce que fait parse().

La fonction parse permet de récupérer des infos contenues dans un fichier.
Dans mon cas, le fichier est fichier.txt et est de cette forme :
image.png //image à charger
1000.0 1000.0 //dimension du terrain
240.0 //altitude_maximale du terrain
10.0 //tolérance du quadtree

Mon fichier prend en parametre :
char *png;
double width, height, altitude_max, tolerance;
int parse(char *filename, char *png, double *width, double *height, double *altitude_max, double *tolerance){

Tu as deux fois 'quadtree->SE'
C'est une erreur de ma part

Je trouve le if(quadtree==NULL) un peu étrange si celui ci est différents de 0. C normale que tu refasse plusieurs fois la même chose ? create(quadtree->SE) va faire creat(quadtree->NW) : tu tourne en rond, non?
De plus tu n'avance qu'en diagonale, est-ce normale ? tu n'a pas de N S, E O...

Si tu pouvais m'indiquer les changements à effectuer

Merci
0