Algo de génération de routes pas fini avec utilisation des vertex.

This commit is contained in:
Georges Dupéron 2011-10-25 19:53:46 +02:00
parent 4705479f02
commit ffdf57aafa
3 changed files with 73 additions and 18 deletions

86
roads.c
View File

@ -162,8 +162,8 @@ void grid_drawGrid() {
for(i=0;i<nbXSubDivision-1;i++) for(i=0;i<nbXSubDivision-1;i++)
for(j=0;j<nbYSubDivision-1;j++) { for(j=0;j<nbYSubDivision-1;j++) {
Vertex v = {i*maxSegmentSize,j*maxSegmentSize}; Vertex v = { .x = i*maxSegmentSize, .y = j*maxSegmentSize };
Vertex u = {(i+1)*maxSegmentSize,j*maxSegmentSize}; Vertex u = { .x = (i+1)*maxSegmentSize, .y = j*maxSegmentSize };
svg_line(&v,&u,0); svg_line(&v,&u,0);
u.x = i*maxSegmentSize; u.x = i*maxSegmentSize;
u.y = (j+1)*maxSegmentSize; u.y = (j+1)*maxSegmentSize;
@ -379,33 +379,85 @@ void f(FSegment s, FSegmentArray* a) {
fSegmentArray_push(a, newS2); fSegmentArray_push(a, newS2);
} }
/* ***************************** */
// Nouvelle version :
#define vertices_array_size 1024
#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;
void fv(Map* m, Vertex* v) {
// TODO : tracer une ou des routes, en utilisant segment_to
v=v;
m=m;
}
Vertex* vertex_init(Map* m, int x, int y) {
// TODO : s'il y a déjà un point dans la case de la grille pour
// `(x,y)`, le renvoyer sans rien modifier.
Vertex* 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;
return v;
}
Segment* segment_init(Map* m, Vertex* u, Vertex* v) {
Segment* s = &(m->segments[m->segments_firstFree++]);
s->u = u;
s->v = v;
s->nextU = u->s;
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;
}
void segment_display(Segment* s) {
printf("<line x1=\"%d\" y1=\"%d\" x2=\"%d\" y2=\"%d\" stroke=\"black\" />",
s->u->x, s->u->y, s->v->x, s->v->y);
}
void forceFields() { void forceFields() {
/* Initialiser `fifo` à vide. */ Map m;
/* Choisir un point de départ aléatoire, une direction aléatoire, m.vertices[0] = (Vertex){ .x = 400, .y = 300, .s = NULL};
* et insérer `(x,y,vecteur)` dans `fifo`. */ m.vertices_firstUnseen = 0;
FSegmentArray a; m.vertices_firstFree = 1;
a.seg[0] = (FSegment){ m.segments_firstFree = 0;
.from = { .x = 400, .y = 300 },
.to = { .x = 360, .y = 300 }
};
a.firstUnseen = 0;
a.firstFree = 1;
grid_initNodesGrid(800, 600, 40); grid_initNodesGrid(800, 600, 40);
// TODO : insérer vertices[0] dans la grille.
int i; int i;
for (i = 0; i < FSegmentArray_SIZE; i++) { for (i = 0; i < vertices_array_size; i++) {
f(fSegmentArray_pop(&a), &a); if (m.vertices_firstUnseen >= m.vertices_firstFree)
break;
fv(&m, &(m.vertices[m.vertices_firstUnseen++]));
} }
grid_drawGrid(); grid_drawGrid();
for (i = 0; i < FSegmentArray_SIZE; i++) { for (i = 0; i < m.segments_firstFree; i++) {
fsegment_display(a.seg[i]); segment_display(&(m.segments[i]));
} }
} }
int main() { int main() {
Vertex points[] = { Vertex points[] = {
{ .x=10, .y=10 }, { .x=10, .y=10 },

View File

@ -5,11 +5,14 @@
typedef struct Vertex { typedef struct Vertex {
int x; int x;
int y; int y;
struct Segment* s;
} Vertex; } Vertex;
typedef struct Segment { typedef struct Segment {
Vertex *u; Vertex *u;
Vertex *v; Vertex *v;
struct Segment* nextU;
struct Segment* nextV;
} Segment; } Segment;
typedef Vertex Polygon; typedef Vertex Polygon;

View File

@ -164,7 +164,7 @@ Variables :
* `segments` est le tableau des segments de route. * `segments` est le tableau des segments de route.
Algo : Algo :
* Choisir des champs de force. `f(vertex)` ajoutes aux tableaux les * Choisir des champs de force. `f(vertex)` ajoute aux tableaux les
segments de route qu'on peut faire partir du point `(x,y)`. segments de route qu'on peut faire partir du point `(x,y)`.
* Initialiser le tableau de stockage des vertices `vertices` à vide. * Initialiser le tableau de stockage des vertices `vertices` à vide.
* Initialiser le tableau de stockage des segments `segments` à vide. * Initialiser le tableau de stockage des segments `segments` à vide.