From c2f564bc2d7385904b87a4c1772b24768d26219e Mon Sep 17 00:00:00 2001 From: Yoann Date: Thu, 27 Oct 2011 17:48:49 +0200 Subject: [PATCH] =?UTF-8?q?Impl=C3=A9mentation=20de=20l'algo=20de=20cr?= =?UTF-8?q?=C3=A9ation=20de=20routes.=20Erreur=20de=20segmentation=20Lors?= =?UTF-8?q?=20du=20dessin,=20certains=20segments=20pointent=20vers=20rien.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- roads.c | 166 +++++++++++++++++++++++++++++++------------------------- roads.h | 10 ++-- 2 files changed, 98 insertions(+), 78 deletions(-) diff --git a/roads.c b/roads.c index a3d175e..6c618bf 100644 --- a/roads.c +++ b/roads.c @@ -97,7 +97,7 @@ polarCoord* ctp(Vertex *origin, Vertex *end) { * @param int height : Hauteur du quartier à remplir. * @param int maxSegmentSize : Taille maximale d'un segment de route. */ -void grid_initNodesGrid(int width, int height, int segmentSize) { +void grid_initvGrid(int width, int height, int segmentSize) { int xSize, ySize; xSize = (int)(width/segmentSize); ySize = (int)(height/segmentSize); @@ -134,9 +134,15 @@ void grid_initNodesGrid(int width, int height, int segmentSize) { Vertex* intersectionBetween(Segment *sega, Segment *segb) { sega = sega; segb = segb; - /*Vertex *inter = (Vertex*) malloc(sizeof(Vertex)); + Vertex *inter = (Vertex*) malloc(sizeof(Vertex)); float m, k; // Coordonnées de l'intersection des vecteurs sur les droites. int Ix, Iy, Jx, Jy; // Vecteur I et J corespondant au segment v et u; + Vertex *va, *vb, *ua, *ub; + + va = sega->u; + vb = sega->v; + ua = segb->u; + ub = segb->v; Ix = vb->x - va->x; Iy = vb->y - va->y; @@ -152,7 +158,7 @@ Vertex* intersectionBetween(Segment *sega, Segment *segb) { } else return NULL; - */ + return NULL; //return inter; } @@ -172,14 +178,14 @@ void grid_drawGrid() { } -short grid_insertRoadNode(roadNodeY *rn) { - if(rn == NULL || rn->v == NULL) +short grid_insertVertex(Vertex *vtx) { + if(vtx == NULL) return 0; int i; for(i=0;iv)][toY(rn->v)][i] == NULL) { - nodesGrid[toX(rn->v)][toY(rn->v)][i] = rn; + if(vGrid[toX(vtx)][toY(vtx)][i] == NULL) { + vGrid[toX(vtx)][toY(vtx)][i] = vtx; return 1; } } @@ -193,14 +199,14 @@ short grid_insertRoadNode(roadNodeY *rn) { * @param Vertex *v : Le nœd pour lequel on souhaite trouver un nœd proche. * @return roadNodeY* : le nœd de route le plus proche. */ -roadNodeY* grid_getNearestRoadNode(Vertex *v) { - roadNodeY **nr; - roadNodeY *nearestNode = NULL; +Vertex* grid_getNearestVertex(Vertex *v) { + Vertex **vtx; + Vertex *nearestVertex = NULL; int i,j; int x = toX(v); int y = toY(v); int distance = maxSegmentSize*2; - roadNodeY *tmp = NULL; + Vertex *tmp = NULL; int count = 0; fprintf(stderr,"colones : %d\n",nbXSubDivision); fprintf(stderr,"lignes : %d\n",nbYSubDivision); @@ -208,41 +214,45 @@ roadNodeY* grid_getNearestRoadNode(Vertex *v) { for(j=y-1; j= 0 && i < nbXSubDivision && y >= 0 && y < nbYSubDivision) { - nr = grid_getNearNodes2(i,j); + vtx = grid_getNearVertices2(i,j); int ind; - //tmp = nr[0]; + fprintf(stderr,"passage %d\t\t %d %d\n",count,i,j); - for(tmp = nr[0], ind = 0; tmp != NULL && ind < maxNodesInGrid; tmp = nr[ind++]) { + for(tmp = vtx[0], ind = 0; tmp != NULL && ind < maxNodesInGrid; tmp = vtx[ind++]) { fprintf(stderr,"noed\n"); - int dist = distBetween(v,tmp->v); + int dist = distBetween(v,tmp); if(dist < distance) { distance = dist; - nearestNode = tmp; + nearestVertex = tmp; } - tmp = nr[i]; + tmp = vtx[i]; } } } } - return nearestNode; + return nearestVertex; } -Vertex* insertRoadSegment(Segment *seg, int lag) { - //int segLength = distBetween(seg->u, seg->v); - //float coef = ((float)segLength-lag)/(float)segLength; - //Vertex *nearestV = NULL; - //Vertex tmpEnd; +Vertex* insertSegment(Segment *seg, int lag) { + int segLength = distBetween(seg->u, seg->v); + float coef = ((float)segLength-lag)/(float)segLength; + Vertex *nearestVertex = NULL; + Vertex tmpEnd, *va, *vb; + int intersec = 0; // Booléen si intersection = 1 sinon = 0; + + va = seg->u; + vb = seg->v; + seg = seg; lag = lag; // ------- TODO à compléter et à vérifier. /*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(rpb->rn->v,rne->v,seg->u,seg->v); @@ -255,22 +265,18 @@ Vertex* insertRoadSegment(Segment *seg, int lag) { seg = segs[s++]; }*/ // ------- - /*if(intersec == 0) { - 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",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); + if(intersec == 0) { + tmpEnd.x = va->x + coef*(vb->x - va->x); + tmpEnd.y = va->y + coef*(vb->y - va->y); - //fprintf(stderr,"--11\n"); + nearestVertex = grid_getNearestVertex(&tmpEnd); - if(nearestNode != NULL && distBetween(nearestNode->v,rne->v) < lag) - rne = nearestNode; + if(nearestVertex != NULL && distBetween(nearestVertex,vb) < lag) + vb = nearestVertex; } - grid_insertRoadNode(rne);*/ - //rstep = addRoadNode(road,rpb,rne); + grid_insertVertex(va); + grid_insertVertex(vb); return NULL; } @@ -279,48 +285,49 @@ int distBetween(Vertex *v, Vertex *u) { return sqrt((v->x-u->x)*(v->x-u->x)+(v->y-u->y)*(v->y-u->y)); } -roadNodeY** grid_getNearNodes(Vertex *v) { - return nodesGrid[toX(v)][toY(v)]; +Vertex** grid_getNearVertices(Vertex *v) { + return vGrid[toX(v)][toY(v)]; } -roadNodeY** grid_getNearNodes2(int x, int y) { - return nodesGrid[x][y]; +Vertex** grid_getNearVertices2(int x, int y) { + return vGrid[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) { - roadNodeY **nr, *tmpnr; + Vertex **vtx, *tmpVtx; Segment** segs = (Segment**) malloc(sizeof(Segment)*9*maxNodesInGrid); int i, j, s, k, l; - + l=0; + l=l; s = 0; - + for(i=x-1;i= 0 && x < nbXSubDivision && y >= 0 && y < nbYSubDivision) { - nr = grid_getNearNodes2(i,j); + vtx = grid_getNearVertices2(i,j); k = 0; - tmpnr = nr[0]; - + tmpVtx = vtx[0]; + /* // TODO Tester si le segment existe déjà dans la liste pour ne pas l'insérer en double. - while(tmpnr != NULL) { - for(l=0;lnbIntersec;l++) { - if(tmpnr->intersec[l]->next != NULL) { - segs[s]->u = tmpnr->v; - segs[s]->v = tmpnr->intersec[l]->next->v; + while(tmpVtx != NULL) { + for(l=0;lnbIntersec;l++) { + if(tmpVtx->intersec[l]->next != NULL) { + segs[s]->u = tmpVtx->v; + segs[s]->v = tmpVtx->intersec[l]->next->v; } s++; - if(tmpnr->intersec[l]->previous != NULL) { - segs[s]->u = tmpnr->v; - segs[s]->v = tmpnr->intersec[l]->previous->v; + if(tmpvtx->intersec[l]->previous != NULL) { + segs[s]->u = tmpVtx->v; + segs[s]->v = tmpVtx->intersec[l]->previous->v; } } - tmpnr = nr[k++]; - } + tmpVtx = vtx[k++]; + }*/ } } } @@ -382,7 +389,7 @@ void f(FSegment s, FSegmentArray* a) { /* ***************************** */ // Nouvelle version : -#define vertices_array_size 1024 +#define vertices_array_size 40 #define segments_array_size 1024 typedef struct Map { Vertex vertices[vertices_array_size]; @@ -424,22 +431,28 @@ Segment* segment_to(Map* m, Vertex* u, int x, int y) { return s; } -void fv(Map* m, Vertex* from) { - v=v; - m=m; +void fv(Map* m, Vertex *from) { // Tracer une ou des routes, en utilisant segment_to. - - // Vertex existing = (v->s->u == from ? v->s->v : v->s->u); - + if(from->s == NULL) + return; + + Vertex *existing = from->s->u == from ? from->s->v : from->s->u; + //fprintf(stderr,"bonjour\n"); // Segment dans la continuation - // Vertex new1 = vertex_add(from, vertex_substract(from, existing)); // from + (from - existing) - // segment_to(m, from, new1.x, new2.y); + //Vertex new1 = vertex_add(from, vertex_substract(from, existing)); // from + (from - existing) + Vertex new1 = { .x = from->x + (from->x - existing->x), + .y = from->y + (from->y - existing->y), + .s = NULL }; + + segment_to(m, from, new1.x, new1.y); // Segment perpendiculaire - // polar = ctp(from, existing) - // polar.angle += 90; - // Vertex new2 = ptc(polar); - // segment_to(m, from, new2.x, new2.y); + polarCoord *polar = ctp(from, existing); + polar->angle += 90; + cartesianCoord *c = ptc(from,polar->angle,polar->length); + Vertex new2 = { .x = c->x, .y = c->y}; + + segment_to(m, from, new2.x, new2.y); } void segment_display(Segment* s) { @@ -450,11 +463,16 @@ void segment_display(Segment* s) { void forceFields() { Map m; m.vertices[0] = (Vertex){ .x = 400, .y = 300, .s = NULL}; - m.vertices_firstUnseen = 0; - m.vertices_firstFree = 1; - m.segments_firstFree = 0; + m.vertices[1] = (Vertex){ .x = 410, .y = 310, .s = NULL}; + m.vertices_firstUnseen = 1; + m.vertices_firstFree = 2; + + m.segments[0] = (Segment){ .u = &(m.vertices[0]), .v = &(m.vertices[1]), .nextU = NULL, .nextV = NULL}; + m.vertices[0].s = &(m.segments[0]); + m.vertices[1].s = &(m.segments[0]); + m.segments_firstFree = 1; - grid_initNodesGrid(800, 600, 40); + grid_initvGrid(800, 600, 40); // TODO : insérer vertices[0] dans la grille. int i; @@ -463,7 +481,7 @@ void forceFields() { break; fv(&m, &(m.vertices[m.vertices_firstUnseen++])); } - + grid_drawGrid(); for (i = 0; i < m.segments_firstFree; i++) { segment_display(&(m.segments[i])); diff --git a/roads.h b/roads.h index bb15d9c..e32ce83 100644 --- a/roads.h +++ b/roads.h @@ -70,12 +70,14 @@ int quarterHeight; int toX(Vertex*); int toY(Vertex*); void grid_initNodesGrid(int w, int h, int maxSegmentSize); -short grid_insertRoadNode(roadNodeY *rn); +short grid_insertVertex(Vertex *rn); int distBetween(Vertex *v, Vertex *u); -roadNodeY** grid_getNearNodes(Vertex *v); -roadNodeY** grid_getNearNodes2(int x, int y); -roadNodeY* grid_getNearestRoadNode(Vertex *v); +Vertex** grid_getNearVertices(Vertex *v); +Vertex** grid_getNearVertices2(int x, int y); +Vertex* grid_getNearestVertex(Vertex *v); void grid_drawGrid(); + cartesianCoord* ptc(Vertex *origin, short angle, short length); polarCoord* ctp(Vertex *origin, Vertex *end); + Segment** grid_getNearSegments(int x, int y);