Ajout de la fonciton de récupération des segments potentiellement
sécant avant le segment constitué du point d'entrée de la fonction.
This commit is contained in:
parent
49ae3608f5
commit
0ed41f9287
103
roads.c
103
roads.c
|
@ -120,7 +120,6 @@ void grid_initNodesGrid(int width, int height, int segmentSize) {
|
|||
*/
|
||||
Vertex* intersectionBetween(Vertex *va, Vertex *vb, Vertex *ua, Vertex *ub) {
|
||||
Vertex *inter = (Vertex*) malloc(sizeof(Vertex));
|
||||
//int ix, iy; // Coordonnées du point d'intersection.
|
||||
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;
|
||||
|
||||
|
@ -131,37 +130,13 @@ Vertex* intersectionBetween(Vertex *va, Vertex *vb, Vertex *ua, Vertex *ub) {
|
|||
|
||||
m = (float)(-(-Ix*va->y+Ix*ua->y+Iy*va->x-Iy*ua->x))/(float)(Ix*Jy-Iy*Jx);
|
||||
k = (float)(-(va->x*Jy-ua->x*Jy-Jx*va->y+Jx*ua->y))/(float)(Ix*Jy-Iy*Jx);
|
||||
fprintf(stderr,"k , m : %f %f\n",k,m);
|
||||
|
||||
if(m < 1 && m > 0 && k < 1 && k > 0) {
|
||||
inter->x = va->x + k * Ix;
|
||||
inter->y = va->y + k * Iy;
|
||||
}
|
||||
else
|
||||
return NULL;
|
||||
|
||||
/* Une solution, mais ne fonctionne peut-être pas dans toutes les conditions (si B<A).
|
||||
if(va->x == vb->x) {
|
||||
if(va->y == vb->y)
|
||||
return NULL;
|
||||
else {
|
||||
ix = va->x;
|
||||
iy = ((ua->y-ub->y)/(ua->x-ub->x))*(va->x-ua->x) + ua->y;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if(ua->x == ub->x) {
|
||||
ix = ua->x;
|
||||
iy = ((va->y-vb->y)/(va->x-vb->x))*(ua->x-va->x) + va->y;
|
||||
}
|
||||
else {
|
||||
double pCD = (ua->y-ub->y)/(ua->x-ub->x);
|
||||
double pAB = (va->y-vb->y)/(va->x-vb->x);
|
||||
double oCD = ua->y-pCD*ya->x;
|
||||
double oAB = va->y-pAB*va->x;
|
||||
ix = (oAB-oCD)/(pCD-pAB);
|
||||
iy = pCD*ix+oCD;
|
||||
}
|
||||
}*/
|
||||
|
||||
return inter;
|
||||
}
|
||||
|
@ -272,17 +247,37 @@ roadNodeY* insertRoadSegment(roadPointY *road, roadNodeY *rnb, roadNodeY *rne, i
|
|||
float coef = ((float)segLength-lag)/(float)segLength;
|
||||
roadNodeY *nearestNode = NULL;
|
||||
Vertex tmpEnd;
|
||||
tmpEnd.x = rnb->v->x+coef*(rne->v->x - rnb->v->x);
|
||||
tmpEnd.y = rnb->v->y+coef*(rne->v->y - rnb->v->y);
|
||||
fprintf(stderr,"segLength : %d\n",segLength);
|
||||
fprintf(stderr," ostart : %d %d\t oend : %d %d\n",rnb->v->x,rnb->v->y,rne->v->x,rne->v->y);
|
||||
fprintf(stderr," end : %d %d\n",tmpEnd.x,tmpEnd.y);
|
||||
nearestNode = grid_getNearestRoadNode(&tmpEnd);
|
||||
|
||||
fprintf(stderr,"--11\n");
|
||||
// ------- TODO à compléter et à vérifier.
|
||||
Segment **segs = grid_getNearSegments(rnb->v->x,rnb->v->y);
|
||||
Segment *seg = segs[0];
|
||||
int s = 0;
|
||||
int intersec = 0; // Booléen si intersection = 1 sinon = 0;
|
||||
|
||||
if(nearestNode != NULL && distBetween(nearestNode->v,rne->v) < lag)
|
||||
rne = nearestNode;
|
||||
while(seg != NULL) {
|
||||
Vertex *intersection = intersectionBetween(rnb->v,rne->v,seg->u,seg->v);
|
||||
|
||||
if(intersection != NULL) {
|
||||
// Créer un nœd, l'insérer au segment qui à causé l'intersection.
|
||||
// Ce nœd deviens le point d'arriver du segment à placer : rne;
|
||||
intersec = 1;
|
||||
}
|
||||
seg = segs[s++];
|
||||
}
|
||||
// -------
|
||||
if(intersec == 0) {
|
||||
tmpEnd.x = rnb->v->x+coef*(rne->v->x - rnb->v->x);
|
||||
tmpEnd.y = rnb->v->y+coef*(rne->v->y - rnb->v->y);
|
||||
fprintf(stderr,"segLength : %d\n",segLength);
|
||||
fprintf(stderr," ostart : %d %d\t oend : %d %d\n",rnb->v->x,rnb->v->y,rne->v->x,rne->v->y);
|
||||
fprintf(stderr," end : %d %d\n",tmpEnd.x,tmpEnd.y);
|
||||
nearestNode = grid_getNearestRoadNode(&tmpEnd);
|
||||
|
||||
fprintf(stderr,"--11\n");
|
||||
|
||||
if(nearestNode != NULL && distBetween(nearestNode->v,rne->v) < lag)
|
||||
rne = nearestNode;
|
||||
}
|
||||
|
||||
grid_insertRoadNode(rnb);
|
||||
grid_insertRoadNode(rne);
|
||||
|
@ -302,6 +297,44 @@ roadNodeY** grid_getNearNodes2(int x, int y) {
|
|||
return nodesGrid[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;
|
||||
Segment** segs = (Segment**) malloc(sizeof(Segment)*9*maxNodesInGrid);
|
||||
int i, j, s, k, l;
|
||||
|
||||
s = 0;
|
||||
|
||||
for(i=x-1;i<x+2;i++) {
|
||||
for(j=y-1;j<y+2;j++) {
|
||||
if(x >= 0 && x < nbXSubDivision && y >= 0 && y < nbYSubDivision) {
|
||||
nr = grid_getNearNodes2(i,j);
|
||||
k = 0;
|
||||
tmpnr = nr[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;l<tmpnr->nbIntersec;l++) {
|
||||
if(tmpnr->intersec[l]->next != NULL) {
|
||||
segs[s]->u = tmpnr->v;
|
||||
segs[s]->v = tmpnr->intersec[l]->next->v;
|
||||
}
|
||||
s++;
|
||||
if(tmpnr->intersec[l]->previous != NULL) {
|
||||
segs[s]->u = tmpnr->v;
|
||||
segs[s]->v = tmpnr->intersec[l]->previous->v;
|
||||
}
|
||||
}
|
||||
tmpnr = nr[k++];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return segs;
|
||||
}
|
||||
|
||||
void carreY() {
|
||||
grid_initNodesGrid(800,600,10);
|
||||
roadPointY *roada = (roadPointY*) malloc(sizeof(roadPointY));
|
||||
|
|
10
roads.h
10
roads.h
|
@ -7,6 +7,11 @@ typedef struct Vertex {
|
|||
int y;
|
||||
} Vertex;
|
||||
|
||||
typedef struct Segment {
|
||||
Vertex *u;
|
||||
Vertex *v;
|
||||
} Segment;
|
||||
|
||||
typedef Vertex Polygon;
|
||||
|
||||
/* Cette structure définie un nœd de route. Le nœd contient la liste de toute les intersections.
|
||||
|
@ -14,14 +19,14 @@ typedef Vertex Polygon;
|
|||
typedef struct roadNodeY {
|
||||
Vertex *v;
|
||||
short nbIntersec;
|
||||
struct intersectionY *intersec;
|
||||
struct intersectionY **intersec;
|
||||
} roadNodeY;
|
||||
|
||||
/* Définition d'une intersection. Permet de savoir quelle route est concernée par cette intersection.
|
||||
* Elle permet également de changer la navigation por parcourir une nouvelle route.
|
||||
* */
|
||||
typedef struct intersectionY {
|
||||
roadNodeY roadId; // Premier nœd de la route qui lui sert d'identifiant.
|
||||
roadNodeY *roadId; // Premier nœd de la route qui lui sert d'identifiant.
|
||||
roadNodeY *next; // Nœd de la route juste après l'intersection.
|
||||
roadNodeY *previous; // Nœd de la route juste avant l'intersection.
|
||||
int zIndex; // Index sur l'axe z de la route.
|
||||
|
@ -64,3 +69,4 @@ roadNodeY* grid_getNearestRoadNode(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);
|
||||
|
|
Loading…
Reference in New Issue
Block a user