www

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

commit c7d4cf0ab09f145e9fa6295f48112d5c06115529
parent aa65f105f7b38a0acf7e9ac3a6a9ac8f2122b159
Author: Yoann <yoann.b87@voila.fr>
Date:   Fri, 28 Oct 2011 20:01:14 +0200

Implementation de la fonciton de détection d'intersections.
Prochaine étape intégration dans le reste du code.

Diffstat:
Mroads.c | 110++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------
1 file changed, 67 insertions(+), 43 deletions(-)

diff --git a/roads.c b/roads.c @@ -133,6 +133,9 @@ void grid_initvGrid(int width, int height, int segmentSize) { * @return Vertex* : Coordonnées du point d'intersection si il existe, sinon NULL. */ Vertex* intersectionBetween(Segment *sega, Segment *segb) { + if(sega == NULL || segb == NULL) + return NULL; + sega = sega; segb = segb; Vertex *inter = (Vertex*) malloc(sizeof(Vertex)); @@ -160,7 +163,7 @@ Vertex* intersectionBetween(Segment *sega, Segment *segb) { else return NULL; - return NULL; //return inter; + return inter; } @@ -297,11 +300,18 @@ Vertex** grid_getNearVertices2(int x, int y) { */ Segment** grid_getNearSegments(int x, int y) { Vertex **vtx, *tmpVtx; - Segment** segs = (Segment**) malloc(sizeof(Segment)*9*maxNodesInGrid); - int i, j, s, k, l; - l=0; - l=l; +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); for(i=x-1;i<x+2;i++) { for(j=y-1;j<y+2;j++) { @@ -309,26 +319,25 @@ Segment** grid_getNearSegments(int x, int y) { vtx = grid_getNearVertices2(i,j); k = 0; tmpVtx = vtx[0]; - /* + 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) { - for(l=0;l<tmpVtx->nbIntersec;l++) { - if(tmpVtx->intersec[l]->next != NULL) { - segs[s]->u = tmpVtx->v; - segs[s]->v = tmpVtx->intersec[l]->next->v; - } - s++; - if(tmpvtx->intersec[l]->previous != NULL) { - segs[s]->u = tmpVtx->v; - segs[s]->v = tmpVtx->intersec[l]->previous->v; - } + for(tmpSegs = tmpVtx->s; tmpSegs != NULL; tmpSegs = tmpSegs->nextU) { + segs[segCount++] = tmpSegs; + } + + for(tmpSegs = tmpVtx->s; tmpSegs != NULL; tmpSegs = tmpSegs->nextV) { + fprintf(stderr,"- Bonjour %d\n",segCount); + segs[segCount++] = tmpSegs; } + tmpVtx = vtx[k++]; - }*/ + } } } } + fprintf(stderr,"Casse toi\n"); return segs; } @@ -387,7 +396,7 @@ void f(FSegment s, FSegmentArray* a) { /* ***************************** */ // Nouvelle version : -#define vertices_array_size 1024 +#define vertices_array_size 800 #define segments_array_size 1024 typedef struct Map { Vertex vertices[vertices_array_size]; @@ -399,33 +408,53 @@ typedef struct Map { // vertices. } Map; -Vertex* vertex_init(Map* m, int x, int y) { + +Segment* segment_to(Map* m, Vertex* u, int x, int y) { if(m->vertices_firstFree >= vertices_array_size) return NULL; - + Vertex* v; Vertex tmp = { .x = x, .y = y}; Vertex *nearest = grid_getNearestVertex(&tmp); - if(nearest != NULL && distBetween(&tmp,nearest) < 4) + if(nearest != NULL && distBetween(&tmp,nearest) < 5) { v = nearest; - else + v->x = x; + v->y = y; + v->s = NULL; + } + else { v = &(m->vertices[m->vertices_firstFree++]); - - // TODO : insérer v dans la grille de m. - m=m; - - v->x = x; - v->y = y; - v->s = NULL; - grid_insertVertex(v); - return v; -} + v->x = x; + v->y = y; + v->s = NULL; + grid_insertVertex(v); + } -Segment* segment_init(Map* m, Vertex* u, Vertex* v) { if(v == NULL || m->segments_firstFree >= segments_array_size) return NULL; - + + // Code pour le calcul d'intersections. + /*Segment **nearSegments = grid_getNearSegments(u->x,u->y); + + int distance = 1000; + Segment *ns = nearSegments[0]; + Segment tmpSeg = { .u = u, .v = v}; + Segment *segmentCut = 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); + if(intersection != NULL && distBetween(u,intersection) < distance) { + distance = distBetween(u, intersection); + segmentCut = ns; + } + } + + free(nearSegments); + */ + Segment* s = &(m->segments[m->segments_firstFree++]); s->u = u; s->v = v; @@ -433,12 +462,7 @@ Segment* segment_init(Map* m, Vertex* u, Vertex* v) { s->nextV = v->s; u->s = s;*/ v->s = s; - return s; -} -Segment* segment_to(Map* m, Vertex* u, int x, int y) { - Vertex* v = vertex_init(m, x, y); - Segment* s = segment_init(m, u, v); return s; } @@ -459,11 +483,11 @@ void fv(Map* m, Vertex *from) { 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); } @@ -476,7 +500,7 @@ void segment_display(Segment* s) { void forceFields() { Map m; m.vertices[0] = (Vertex){ .x = 400, .y = 300, .s = NULL}; - m.vertices[1] = (Vertex){ .x = 400, .y = 310, .s = NULL}; + m.vertices[1] = (Vertex){ .x = 401, .y = 309, .s = NULL}; m.vertices_firstUnseen = 1; m.vertices_firstFree = 2; @@ -516,7 +540,7 @@ int main() { { .x=10, .y=590 }, }; int n = 5; - + svg_start(800,600); //carreY(); forceFields();