www

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

commit f04aebd192ac09aefa02ff0590400085009ea41f
parent c7d4cf0ab09f145e9fa6295f48112d5c06115529
Author: Yoann <yoann.b87@voila.fr>
Date:   Sat, 29 Oct 2011 09:39:15 +0200

Tentative d'ajout de la détection des intersection dans la création de
route mais résultats assez particuliers.

Diffstat:
Mroads.c | 78++++++++++++++++++++++++++++++++++++++++--------------------------------------
Mroads.h | 15++++++++++++++-
2 files changed, 54 insertions(+), 39 deletions(-)

diff --git a/roads.c b/roads.c @@ -298,20 +298,17 @@ Vertex** grid_getNearVertices2(int x, int 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) { +void grid_getNearSegments(Map *m, int x, int y) { Vertex **vtx, *tmpVtx; -Segment** segs = (Segment**) malloc(sizeof(Segment*)*9*maxNodesInGrid+1); Segment *tmpSegs; - int segCount = 0; int i, j, s, k; - for(i=0;i<9*maxNodesInGrid+1;i++) { - segs[i] = NULL; - } s = 0; Vertex vv = {.x = x, .y = y}; x = toX(&vv); y = toY(&vv); + + m->segments2_firstFree = 0; for(i=x-1;i<x+2;i++) { for(j=y-1;j<y+2;j++) { @@ -319,17 +316,19 @@ Segment** segs = (Segment**) malloc(sizeof(Segment*)*9*maxNodesInGrid+1); vtx = grid_getNearVertices2(i,j); k = 0; tmpVtx = vtx[0]; - fprintf(stderr,"Bonjour\n"); + //fprintf(stderr,"Bonjour\n"); // TODO Tester si le segment existe déjà dans la liste pour ne pas l'insérer en double. while(tmpVtx != NULL) { + if(m->segments_firstFree >= segments_array_size) + return; + for(tmpSegs = tmpVtx->s; tmpSegs != NULL; tmpSegs = tmpSegs->nextU) { - segs[segCount++] = tmpSegs; + m->segments2[m->segments2_firstFree++] = tmpSegs; } for(tmpSegs = tmpVtx->s; tmpSegs != NULL; tmpSegs = tmpSegs->nextV) { - fprintf(stderr,"- Bonjour %d\n",segCount); - segs[segCount++] = tmpSegs; + m->segments2[m->segments2_firstFree++] = tmpSegs; } tmpVtx = vtx[k++]; @@ -337,8 +336,6 @@ Segment** segs = (Segment**) malloc(sizeof(Segment*)*9*maxNodesInGrid+1); } } } - fprintf(stderr,"Casse toi\n"); - return segs; } @@ -396,18 +393,6 @@ void f(FSegment s, FSegmentArray* a) { /* ***************************** */ // Nouvelle version : -#define vertices_array_size 800 -#define segments_array_size 1024 -typedef struct Map { - Vertex vertices[vertices_array_size]; - Segment segments[segments_array_size]; - int vertices_firstUnseen; - int vertices_firstFree; - int segments_firstFree; - // TODO : champ grid & co. On peut même l'utiliser à la place de - // vertices. -} Map; - Segment* segment_to(Map* m, Vertex* u, int x, int y) { if(m->vertices_firstFree >= vertices_array_size) @@ -435,25 +420,44 @@ Segment* segment_to(Map* m, Vertex* u, int x, int y) { return NULL; // Code pour le calcul d'intersections. - /*Segment **nearSegments = grid_getNearSegments(u->x,u->y); - + int distance = 1000; - Segment *ns = nearSegments[0]; + int i; Segment tmpSeg = { .u = u, .v = v}; Segment *segmentCut = NULL; + Vertex *coordInter = NULL; - int i; - for(i = 0, ns = nearSegments[0]; ns != NULL; ns = nearSegments[i++]) { - fprintf(stderr,"Tu fait chier\n"); - Vertex *intersection = intersectionBetween(ns,&tmpSeg); + grid_getNearSegments(m,u->x,u->y); + + for(i = 0; i < m->segments2_firstFree; i++) { + Vertex *intersection = intersectionBetween(m->segments2[i],&tmpSeg); if(intersection != NULL && distBetween(u,intersection) < distance) { distance = distBetween(u, intersection); - segmentCut = ns; + segmentCut = m->segments2[i]; + coordInter = intersection; } } - - free(nearSegments); - */ + + if(segmentCut != NULL) { + Vertex *vInter = &(m->vertices[m->vertices_firstFree++]); + Segment *segmentPartA = segmentCut; + Segment *segmentPartB = &(m->segments[m->segments_firstFree++]); + + vInter->x = coordInter->x; + vInter->y = coordInter->y; + + segmentPartA->v = vInter; + + segmentPartB->u = vInter; + segmentPartB->nextU = NULL; + segmentPartB->v = segmentPartA->v; + segmentPartB->nextV = segmentPartA->nextV; + + segmentPartA->nextV = NULL; + + v = vInter; + m->vertices_firstFree--; + } Segment* s = &(m->segments[m->segments_firstFree++]); s->u = u; @@ -472,7 +476,6 @@ void fv(Map* m, Vertex *from) { return; Vertex *existing = from->s->u == from ? from->s->v : from->s->u; - fprintf(stderr,"from existing %d %d %d %d\n",from->x,from->y, existing->x,existing->y); // Segment dans la continuation //Vertex new1 = vertex_add(from, vertex_substract(from, existing)); // from + (from - existing) Vertex new1 = { .x = from->x + (from->x - existing->x), @@ -481,12 +484,10 @@ void fv(Map* m, Vertex *from) { // Segment perpendiculaire polarCoord *polar = ctp(existing,from); - fprintf(stderr,"polar : %d %d\n",polar->angle,polar->length); polar->angle += 90; cartesianCoord *c = ptc(from,polar->angle,polar->length); Vertex new2 = { .x = c->x, .y = c->y}; -fprintf(stderr,"from new2 %d %d %d %d\n",from->x,from->y, new2.x,new2.y); segment_to(m, from, new1.x, new1.y); segment_to(m, from, new2.x, new2.y); @@ -499,6 +500,7 @@ void segment_display(Segment* s) { void forceFields() { Map m; + m.segments2_firstFree = 0; m.vertices[0] = (Vertex){ .x = 400, .y = 300, .s = NULL}; m.vertices[1] = (Vertex){ .x = 401, .y = 309, .s = NULL}; m.vertices_firstUnseen = 1; diff --git a/roads.h b/roads.h @@ -57,6 +57,19 @@ typedef struct roadSet { roadPointY *rpc; // Nœd courrant. } roadStep; +#define vertices_array_size 800 +#define segments_array_size 1024 +typedef struct Map { + Vertex vertices[vertices_array_size]; + Segment segments[segments_array_size]; + Segment* segments2[segments_array_size]; // Stockage temporaire d'un sous ensemble de segments. + int vertices_firstUnseen; + int vertices_firstFree; + int segments_firstFree; + int segments2_firstFree; + // TODO : champ grid & co. On peut même l'utiliser à la place de + // vertices. +} Map; Vertex ****vGrid; roadPointY **roadsList; @@ -80,4 +93,4 @@ void grid_drawGrid(); cartesianCoord* ptc(Vertex *origin, short angle, short length); polarCoord* ctp(Vertex *origin, Vertex *end); -Segment** grid_getNearSegments(int x, int y); +void grid_getNearSegments(Map*, int x, int y);