commit 54fecc3c759b4bc1f32188b9fb60eeace8cce685
parent c963a9ed9658d0aed19f2a3307a023939111cb9b
Author: Yoann <yoann.b87@voila.fr>
Date: Wed, 19 Oct 2011 19:30:24 +0200
Fin de la fonciton d'initialisation de la grille de stockage de nœds de
routes. Et adaptation des autres fonctions.
Diffstat:
| M | roads.c | | | 79 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------- |
| M | roads.h | | | 10 | +++++++--- |
2 files changed, 66 insertions(+), 23 deletions(-)
diff --git a/roads.c b/roads.c
@@ -30,23 +30,43 @@ void roads(Polygon* quartier) {
// TODO Fusionner les deux fonctions et retourner une paire de valeurs.
// Transforme des coordonnées du plan en coordonées du tableau sur x.
int toX(Vertex *v) {
- return v->x*(maxSubDivision-1)/quarterSize;
+ fprintf(stderr,"%d\n",nbXSubDivision);
+ int x = v->x*(nbYSubDivision-1)/quarterWidth;
+ if(x >= nbXSubDivision)
+ fprintf(stderr,"depassement du tableau sur x\n");
+ return x;
}
// Transforme des coordonnées du plan en coordonées du tableau sur y.
int toY(Vertex *v) {
- return v->x*(maxSubDivision-1)/quarterSize;
+ int y = v->x*(nbYSubDivision-1)/quarterHeight;
+ if(y >= nbYSubDivision)
+ fprintf(stderr,"Depassement du tableau sur y\n");
+ return y;
}
-void grid_initNodesGrid(int size) {
- nodesGrid = (roadNodeY****) malloc(sizeof(roadNodeY***)*size);
+/* Initialise la grille de nœds.
+ * @param int width : Largeur du quartier à remplir.
+ * @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) {
+ int xSize, ySize;
+ xSize = (int)(width/segmentSize);
+ ySize = (int)(height/segmentSize);
+
+ nodesGrid = (roadNodeY****) malloc(sizeof(roadNodeY***)*xSize);
int i,j,k;
- maxSubDivision = size;
-
- for(i=0;i<size;i++) {
- nodesGrid[i] = (roadNodeY***) malloc(sizeof(roadNodeY**)*size);
- for(j=0;j<size;j++) {
+ maxSegmentSize = segmentSize;
+ nbXSubDivision = xSize;
+ nbYSubDivision = ySize;
+ quarterWidth = width;
+ quarterHeight = height;
+
+ for(i=0;i<xSize;i++) {
+ nodesGrid[i] = (roadNodeY***) malloc(sizeof(roadNodeY**)*ySize);
+ for(j=0;j<ySize;j++) {
nodesGrid[i][j] = (roadNodeY**) malloc(sizeof(roadNodeY*)*maxNodesInGrid);
for(k=0;k<maxNodesInGrid;k++)
nodesGrid[i][j][k] = NULL;
@@ -54,6 +74,20 @@ void grid_initNodesGrid(int size) {
}
}
+void grid_drawGrid() {
+ int i, j;
+
+ for(i=0;i<nbXSubDivision-1;i++)
+ for(j=0;j<nbYSubDivision-1;j++) {
+ Vertex v = {i*maxSegmentSize,j*maxSegmentSize};
+ Vertex u = {(i+1)*maxSegmentSize,j*maxSegmentSize};
+ svg_line(&v,&u);
+ u.x = i*maxSegmentSize;
+ u.y = (j+1)*maxSegmentSize;
+ svg_line(&v,&u);
+ }
+}
+
short grid_insertRoadNode(roadNodeY *rn) {
if(rn == NULL || rn->v == NULL)
return 0;
@@ -87,12 +121,12 @@ void addRoadNode(roadPointY *rp, roadNodeY *rn) {
roadNodeY* grid_getNearestRoadNode(Vertex *v) {
roadNodeY **nr = grid_getNearNodes(v);
roadNodeY *nearestNode = NULL;
+ if(nr[0] == NULL)
+ return NULL;
+
roadNodeY *tmp = nr[0];
int distance = distBetween(v,tmp->v);
- if(tmp == NULL)
- return NULL;
-
nearestNode = tmp;
int i = 0;
@@ -120,7 +154,7 @@ roadNodeY** grid_getNearNodes(Vertex *v) {
void carreY() {
int size = 500;
- grid_initNodesGrid(6);
+ grid_initNodesGrid(800,600,10);
roadPointY *roada = (roadPointY*) malloc(sizeof(roadPointY));
roadPointY *roadb = (roadPointY*) malloc(sizeof(roadPointY));
roadNodeY *rn;
@@ -128,7 +162,7 @@ void carreY() {
roadNodeY *common = NULL;
int i;
- for(i=0;i<40;i++) {
+ for(i=0;i<36;i++) {
rn = (roadNodeY*)malloc(sizeof(roadNodeY));
v = (Vertex*) malloc(sizeof(Vertex));
@@ -140,17 +174,19 @@ void carreY() {
addRoadNode(roada,rn);
}
- for(i=0;i<30;i++) {
+ for(i=0;i<20;i++) {
rn = (roadNodeY*)malloc(sizeof(roadNodeY));
v = (Vertex*) malloc(sizeof(Vertex));
v->x = (i+1)*22;
- v->y = ((i+1)%5)*(61%(i+2))+160;
+ v->y = ((i+1)%5)*(61%(i+2))+150;
rn->v = v;
- if(i%5) if(grid_getNearestRoadNode(v) != NULL)
- rn = grid_getNearestRoadNode(v);
- //rn = common;
- addRoadNode(roadb,rn);
+ if(v->x < 800 && v->y < 600) {
+ if(i%5 == 0) if(grid_getNearestRoadNode(v) != NULL)
+ rn = grid_getNearestRoadNode(v);
+ //rn = common;
+ addRoadNode(roadb,rn);
+ }
}
roadPointY *rd = roada;
@@ -185,6 +221,9 @@ int main() {
//for (i = 0; i < n; i++) {
// svg_line(&(points[i]), &(points[(i+1)%n]));
// }
+
+ grid_drawGrid();
+
n=n;
//roads(points);
points[0] = points[0];
diff --git a/roads.h b/roads.h
@@ -35,15 +35,19 @@ typedef struct roadPointY {
} roadPointY;
roadNodeY ****nodesGrid;
-short maxSubDivision;
+short nbXSubDivision;
+short nbYSubDivision;
+short maxSegmentSize;
short maxNodesInGrid = 10;
-int quarterSize = 600;
+int quarterWidth;
+int quarterHeight;
int toX(Vertex*);
int toY(Vertex*);
-void grid_initNodesGrid(int size);
+void grid_initNodesGrid(int w, int h, int maxSegmentSize);
short grid_insertRoadNode(roadNodeY *rn);
void addRoadNode(roadPointY *rp, roadNodeY *rn);
int distBetween(Vertex *v, Vertex *u);
roadNodeY** grid_getNearNodes(Vertex *v);
roadNodeY* grid_getNearestRoadNode(Vertex *v);
+void grid_drawGrid();