[C]Arbre ayant 4 fils

Fermé
Corine - 10 nov. 2006 à 14:55
 Corine - 10 nov. 2006 à 17:53
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);
  }
}

A voir également:

2 réponses

Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
10 nov. 2006 à 16:41
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
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