Rechercher : dans
Par :

[C]Arbre ayant 4 fils

Dernière réponse le 10 nov 2006 à 17:53:57 Corine, le 10 nov 2006 à 14:55:04 
 Signaler ce message aux modérateurs

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);
  }
}

Meilleures réponses pour « [C]Arbre ayant 4 fils » dans :
Langage C - Les listes chaînées VoirLa notion de structure autoréferrentielle Une structure autoréferrentielle (parfois appelée structure récursive) correspond à une structure dont au moins un des champs contient un pointeur vers une structure de même type. De cette façon on crée...

1

Char Snipeur, le 10 nov 2006 à 16:41:05

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... Salutation !
Char Snipeur

Répondre à Char Snipeur

2

 Corine, le 10 nov 2006 à 17:53:57

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

Répondre à Corine