|
|
|
|
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
#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);
}
}
Salut.
|
Salut,
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 |