Fin de la fonciton d'initialisation de la grille de stockage de nœds de

routes. Et adaptation des autres fonctions.
This commit is contained in:
Yoann 2011-10-19 19:30:24 +02:00
parent c963a9ed96
commit 54fecc3c75
2 changed files with 65 additions and 22 deletions

77
roads.c
View File

@ -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;
maxSegmentSize = segmentSize;
nbXSubDivision = xSize;
nbYSubDivision = ySize;
quarterWidth = width;
quarterHeight = height;
for(i=0;i<size;i++) {
nodesGrid[i] = (roadNodeY***) malloc(sizeof(roadNodeY**)*size);
for(j=0;j<size;j++) {
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];

10
roads.h
View File

@ -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();