www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit 04f08e5362301b5b379e31bac37563d9459ed639
parent 3664e1260b653b89f6cfc19df30518a69d7d1169
Author: Yoann <yoann.b87@voila.fr>
Date:   Mon, 24 Oct 2011 11:18:12 +0200

Redéfinition de quelques fontion pour coller avec l'algo de génération
de route. Pas terminé.

Diffstat:
Mroads.c | 174++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
Mroads.h | 9++++++++-
2 files changed, 104 insertions(+), 79 deletions(-)

diff --git a/roads.c b/roads.c @@ -33,6 +33,41 @@ void roads(Polygon* quartier) { /* Fonctions de Yoann suffixée par "Y" */ +/* !!!!!!!! Modification de façon de gérer les routes. + * Au départ : + * - Une liste de routes vide. + * - Une grille de nœd de routes vide qui contiendra les nœds de de toutes les routes. + * Initialisation : + * - On initialise la grille avec la taille de la zone à remplir et le nombre max de nœds dans chaque cases. + * - On crée une ou plusieurs routes sue l'on insère dans la liste de routes et on place les nœds de + * ces routes dans la grille. + * Fonctionnement : + * -- La fonction addRoadNode : + * Ajoute un nœed à la route depuis un certain point de route. Si ce point de route n'est pas le dernier + * autrement dit si on crée une division de route alors la nouvelle voie créée constitue une nouvelle route. Et le + * point de route situé à l'intersection est le point d'origine de la nouvelle route. + */ + /* ForceField revision : + * - Initialisation de la grille en fonction de la zone à couvrir. + * - Création d'une ou plusieurs routes de départ et insertion dan sla liste de routes. + * - Création d'un file (fifo) permettant l'avancé parrallèle de la création de routes. + * Cette liste sera constituée de structures à deux champs, l'identifiant de la route et le nœd où on s'est arrêté. + * - Tant que l'on à pas atteint la fin de la file on utilise le premier point de route non vu. + * Et on ajoute à la route le ou les nouveau segments retournées par la fonction f potentiellement filtrée. + * Ces nouveau morceaux de routes seraont également ajouté dans la file pour qu'il puissent faire l'objet d'un + * nouveau départ de route(s). Si une route est créer par division de route existante alors cette route sera ajoutée dans la liste de routes. + * ... + * !!!!!!!!! */ + + + +/* Initialisation de la liste de routes. + */ +void initRoadslIst(int nb){ + roadsList = (roadPointY**) malloc(sizeof(roadPointY*)*nb); +} + + /* La route est constituée d'une série de points, chaque point contient un nœd de route qui peut-être propre à cette route comme * appartenir à plusieurs routes. Le nœd contient un Vertex qui permet de le positionner sur la carte. Il contient également * le nombre et les portions de routes auxquelles il appartient. @@ -46,6 +81,7 @@ int toX(Vertex *v) { return x; } + // Transforme des coordonnées du plan en coordonées du tableau sur y. int toY(Vertex *v) { int y = v->y*(nbYSubDivision)/quarterHeight; @@ -53,6 +89,7 @@ int toY(Vertex *v) { return y; } + /* Convertion de coordonnées polaires en coordonnées cartésiennes. * @param Vertex* origin : Origine du vecteur. * @param short angle : Angle. @@ -67,6 +104,7 @@ cartesianCoord* ptc(Vertex *origin, short angle, short length) { return cc; } + /* Convertion de coordonnées cartésiennes en coordonnées polaires. * @param Vertex* origin : Origine du vecteur. * @param Vertex* end : Fin du vecteur. @@ -80,6 +118,7 @@ polarCoord* ctp(Vertex *origin, Vertex *end) { return pc; } + /* Initialise la grille de nœuds. * @param int width : Largeur du quartier à remplir. * @param int height : Hauteur du quartier à remplir. @@ -109,6 +148,7 @@ void grid_initNodesGrid(int width, int height, int segmentSize) { } } + /* Détermine si il existe une intersection entre deux segments de droite. Dans le cas * ou une intersection existe les coordonnées du point d'intersection sont retournées. * Dans le cas contraire la fonction retourne NULL. @@ -139,7 +179,8 @@ Vertex* intersectionBetween(Vertex *va, Vertex *vb, Vertex *ua, Vertex *ub) { return NULL; return inter; - } +} + void grid_drawGrid() { int i, j; @@ -155,6 +196,7 @@ void grid_drawGrid() { } } + short grid_insertRoadNode(roadNodeY *rn) { if(rn == NULL || rn->v == NULL) return 0; @@ -170,23 +212,43 @@ short grid_insertRoadNode(roadNodeY *rn) { return 0; } -void addRoadNode(roadPointY *rp, roadNodeY *rn) { - if(rp->rn == NULL) { + +roadStep* addRoadNode(roadPointY *rp, roadPointY *rpc, roadNodeY *rn) { + roadStep * rStep = (roadStep*) malloc(sizeof(roadStep)); + + if(rpc == rp) { rp->next = NULL; + rp->previous = NULL; rp->rn = rn; - return; + rStep->roadId = rp; + rStep->rpc = rp; + return rStep; } - while(rp->next != NULL) - rp = rp->next; - + roadPointY *rpp = (roadPointY*) malloc(sizeof(roadPointY)); rpp->next = NULL; - rpp->rn = rn; - rp->next = rpp; - // TODO : previous + + if(rpc->next != NULL) { + rpp->previous = NULL; + rpp->rn = rn; + rStep->roadId = rpp; + rStep->rpc = rpp; + return rStep; + } + else { + rpp->previous = rpc; + rpp->rn = rn; + rpc->next = rpp; + rStep->roadId = rp; + rStep->rpc = rpp; + } + + return rStep; + // TODO modif les intersections de previous. } + /* Retourne le nœd le plus proche dans un certain voisinage. Si aucun nœd n'est trouvé alors * la fonction renvoie NULL. * @param Vertex *v : Le nœd pour lequel on souhaite trouver un nœd proche. @@ -229,6 +291,7 @@ roadNodeY* grid_getNearestRoadNode(Vertex *v) { return nearestNode; } + /* Ajoute un segment de route à la fin d'une route. * Le point d'origine du segment est le dernier de la route actuellement en place. Il est passé en paramètre pour * éviter le parcour de la route entière pour le trouver. @@ -244,20 +307,21 @@ roadNodeY* grid_getNearestRoadNode(Vertex *v) { * @param int lag : le décalage maximal autorisé pour le placement du nœd d'arrivé. * @return roadNodeY* : Le nœd d'arrivé du vecteur potentiellement modifié. */ -roadNodeY* insertRoadSegment(roadPointY *road, roadNodeY *rnb, roadNodeY *rne, int lag) { - int segLength = distBetween(rnb->v, rne->v); +roadStep* insertRoadSegment(roadPointY *road, roadPointY *rpb, roadNodeY *rne, int lag) { + int segLength = distBetween(rpb->rn->v, rne->v); float coef = ((float)segLength-lag)/(float)segLength; roadNodeY *nearestNode = NULL; Vertex tmpEnd; + roadStep * rstep; // ------- TODO à compléter et à vérifier. - Segment **segs = grid_getNearSegments(rnb->v->x,rnb->v->y); + Segment **segs = grid_getNearSegments(rpb->rn->v->x,rpb->rn->v->y); Segment *seg = segs[0]; int s = 0; int intersec = 0; // Booléen si intersection = 1 sinon = 0; while(seg != NULL) { - Vertex *intersection = intersectionBetween(rnb->v,rne->v,seg->u,seg->v); + Vertex *intersection = intersectionBetween(rpb->rn->v,rne->v,seg->u,seg->v); if(intersection != NULL) { // Créer un nœd, l'insérer au segment qui à causé l'intersection. @@ -268,10 +332,10 @@ roadNodeY* insertRoadSegment(roadPointY *road, roadNodeY *rnb, roadNodeY *rne, i } // ------- if(intersec == 0) { - tmpEnd.x = rnb->v->x+coef*(rne->v->x - rnb->v->x); - tmpEnd.y = rnb->v->y+coef*(rne->v->y - rnb->v->y); + tmpEnd.x = rpb->rn->v->x+coef*(rne->v->x - rpb->rn->v->x); + tmpEnd.y = rpb->rn->v->y+coef*(rne->v->y - rpb->rn->v->y); fprintf(stderr,"segLength : %d\n",segLength); - fprintf(stderr," ostart : %d %d\t oend : %d %d\n",rnb->v->x,rnb->v->y,rne->v->x,rne->v->y); + fprintf(stderr," ostart : %d %d\t oend : %d %d\n",rpb->rn->v->x,rpb->rn->v->y,rne->v->x,rne->v->y); fprintf(stderr," end : %d %d\n",tmpEnd.x,tmpEnd.y); nearestNode = grid_getNearestRoadNode(&tmpEnd); @@ -281,12 +345,12 @@ roadNodeY* insertRoadSegment(roadPointY *road, roadNodeY *rnb, roadNodeY *rne, i rne = nearestNode; } - grid_insertRoadNode(rnb); grid_insertRoadNode(rne); - addRoadNode(road,rne); - return rne; + rstep = addRoadNode(road,rpb,rne); + return rstep; } + int distBetween(Vertex *v, Vertex *u) { return sqrt((v->x-u->x)*(v->x-u->x)+(v->y-u->y)*(v->y-u->y)); } @@ -295,10 +359,12 @@ roadNodeY** grid_getNearNodes(Vertex *v) { return nodesGrid[toX(v)][toY(v)]; } + roadNodeY** grid_getNearNodes2(int x, int y) { return nodesGrid[x][y]; } + /* Récupère tout les segement potentiellement sécant avec un segment ayant pour arrivée x et y. */ Segment** grid_getNearSegments(int x, int y) { @@ -337,62 +403,10 @@ Segment** grid_getNearSegments(int x, int y) { return segs; } -void carreY() { - grid_initNodesGrid(800,600,10); - roadPointY *roada = (roadPointY*) malloc(sizeof(roadPointY)); - roadPointY *roadb = (roadPointY*) malloc(sizeof(roadPointY)); - roadNodeY *rn; - Vertex *v; - roadNodeY *lastNode = NULL; - int i; - - for(i=0;i<36;i++) { - rn = (roadNodeY*)malloc(sizeof(roadNodeY)); - v = (Vertex*) malloc(sizeof(Vertex)); - - v->x = (i+1)*16; - v->y = ((i+1)%3)*(61%(i+1))+100; - rn->v = v; - grid_insertRoadNode(rn); - addRoadNode(roada,rn); - } - - for(i=0;i<30;i++) { - rn = (roadNodeY*)malloc(sizeof(roadNodeY)); - v = (Vertex*) malloc(sizeof(Vertex)); - - v->x = (i+1)*22; - v->y = ((i+1)%5)*(61%(i+2))+120; - rn->v = v; - if(i==4) {fprintf(stderr,"x : %d y : %d\n",toX(v),toY(v));} - if(v->x < 800 && v->y < 600) { - fprintf(stderr,"Noed : %d\n",i); - if(i==0) { - addRoadNode(roadb,rn); - lastNode = rn; - } - else { - insertRoadSegment(roadb,lastNode,rn,10); - lastNode = rn; - } - } - } - - roadPointY *rd = roada; - while(rd->next != NULL) { - svg_line(rd->rn->v,rd->next->rn->v,1); - svg_circle(rd->rn->v->x,rd->rn->v->y,1); - rd = rd->next; - } - - rd = roadb; - while(rd->next != NULL) { - svg_line(rd->rn->v,rd->next->rn->v,2); - svg_circle(rd->rn->v->x,rd->rn->v->y,1); - rd = rd->next; - } -} + + + // Algo « champs de force » typedef struct FVector { float x; float y; } FVector; @@ -405,6 +419,7 @@ inline void fsegment_display(FSegment s) { printf("<line x1=\"%f\" y1=\"%f\" x2=\"%f\" y2=\"%f\" stroke=\"black\" />", s.from.x, s.from.y, s.to.x, s.to.y); } + // TODO : dimensionner correctement le tableau. #define FSegmentArray_SIZE 1024 typedef struct FSegmentArray { FSegment seg[FSegmentArray_SIZE]; int firstUnseen; int firstFree; /* + CollisionGrid collision; */ } FSegmentArray; @@ -417,6 +432,7 @@ inline FSegment fSegmentArray_pop(FSegmentArray* a) { return a->seg[a->firstUnseen++]; } + /* Choisir des champs de force. `f(x,y,vecteur)` renvoie tous les * vecteurs de routes qu'on peut faire partir du point `(x,y)`, * lorsqu'on y arrive par la direction `vecteur`. */ @@ -439,19 +455,20 @@ void f(FSegment s, FSegmentArray* a) { fSegmentArray_push(a, newS2); } + void forceFields() { /* Initialiser `fifo` à vide. */ /* Choisir un point de départ aléatoire, une direction aléatoire, * et insérer `(x,y,vecteur)` dans `fifo`. */ FSegmentArray a; a.seg[0] = (FSegment){ - .from = { .x = 100, .y = 100 }, - .to = { .x = 90, .y = 100 } + .from = { .x = 400, .y = 300 }, + .to = { .x = 360, .y = 300 } }; a.firstUnseen = 0; a.firstFree = 1; - grid_initNodesGrid(800, 600, 20); + grid_initNodesGrid(800, 600, 40); int i; for (i = 0; i < FSegmentArray_SIZE; i++) { @@ -464,6 +481,7 @@ void forceFields() { } } + int main() { Vertex points[] = { { .x=10, .y=10 }, diff --git a/roads.h b/roads.h @@ -49,7 +49,14 @@ typedef struct polarCoord { int length; // Norme du vecteur. } polarCoord; +typedef struct roadSet { + roadPointY *roadId; // Identifiant de la route. + roadPointY *rpc; // Nœd courrant. +} roadStep; + + roadNodeY ****nodesGrid; +roadPointY **roadsList; short nbXSubDivision; short nbYSubDivision; short maxSegmentSize; @@ -61,7 +68,7 @@ int toX(Vertex*); int toY(Vertex*); void grid_initNodesGrid(int w, int h, int maxSegmentSize); short grid_insertRoadNode(roadNodeY *rn); -void addRoadNode(roadPointY *rp, roadNodeY *rn); +roadStep* addRoadNode(roadPointY *rp, roadPointY *rpc, roadNodeY *rn); int distBetween(Vertex *v, Vertex *u); roadNodeY** grid_getNearNodes(Vertex *v); roadNodeY** grid_getNearNodes2(int x, int y);