Ajout de la fonction de calcul d'intersection entre deux segments (non
vérifiée).
This commit is contained in:
parent
1a1222b915
commit
d115d482e6
60
roads.c
60
roads.c
|
@ -92,7 +92,7 @@ void grid_initNodesGrid(int width, int height, int segmentSize) {
|
||||||
|
|
||||||
nodesGrid = (roadNodeY****) malloc(sizeof(roadNodeY***)*xSize);
|
nodesGrid = (roadNodeY****) malloc(sizeof(roadNodeY***)*xSize);
|
||||||
int i,j,k;
|
int i,j,k;
|
||||||
|
|
||||||
maxSegmentSize = segmentSize;
|
maxSegmentSize = segmentSize;
|
||||||
nbXSubDivision = xSize;
|
nbXSubDivision = xSize;
|
||||||
nbYSubDivision = ySize;
|
nbYSubDivision = ySize;
|
||||||
|
@ -109,6 +109,63 @@ void grid_initNodesGrid(int width, int height, int segmentSize) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Détermine si il existe une intersection entre deux segments de droite. Dans le cas
|
||||||
|
* ou une intersection existe les coordonnées du point d'intersection sont retournées.
|
||||||
|
* Dans le cas contraire la fonction retourne NULL.
|
||||||
|
* @param Vertex *va : Point de départ du premier segment.
|
||||||
|
* @param Vertex *vb : Point d'arrivé du premier segment.
|
||||||
|
* @param Vertex *ua : Point de départ du second segment.
|
||||||
|
* @param Vertex *vb : Point d'arrivé du second segment.
|
||||||
|
* @return Vertex* : Coordonnées du point d'intersection si il existe, sinon NULL.
|
||||||
|
*/
|
||||||
|
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.
|
||||||
|
int 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;
|
||||||
|
|
||||||
|
Ix = vb->x - va->x;
|
||||||
|
Iy = vb->y - va->y;
|
||||||
|
Jx = ub->x - ua->x;
|
||||||
|
Jy = ub->y - ua->y;
|
||||||
|
|
||||||
|
m = -(-Ix*va->y+Ix*ua->y+Iy*va->x-Iy*ua->x)/(Ix*Jy-Iy*Jx);
|
||||||
|
k = -(va->x*Jy-ua->x*Jy-Jx*va->y+Jx*ua->y)/(Ix*Jy-Iy*Jx);
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
void grid_drawGrid() {
|
void grid_drawGrid() {
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
|
@ -313,6 +370,7 @@ int main() {
|
||||||
int n = 5;
|
int n = 5;
|
||||||
svg_start(800,600);
|
svg_start(800,600);
|
||||||
carreY();
|
carreY();
|
||||||
|
|
||||||
//int i;
|
//int i;
|
||||||
//for (i = 0; i < n; i++) {
|
//for (i = 0; i < n; i++) {
|
||||||
// svg_line(&(points[i]), &(points[(i+1)%n]));
|
// svg_line(&(points[i]), &(points[(i+1)%n]));
|
||||||
|
|
Loading…
Reference in New Issue
Block a user