commit d115d482e6b3d4e34cead8e324c8ae48d4a08dba
parent 1a1222b91591f9e9bb6d7126389760008941a612
Author: Yoann <yoann.b87@voila.fr>
Date: Sat, 22 Oct 2011 14:50:41 +0200
Ajout de la fonction de calcul d'intersection entre deux segments (non
vérifiée).
Diffstat:
| M | roads.c | | | 60 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- |
1 file changed, 59 insertions(+), 1 deletion(-)
diff --git a/roads.c b/roads.c
@@ -92,7 +92,7 @@ void grid_initNodesGrid(int width, int height, int segmentSize) {
nodesGrid = (roadNodeY****) malloc(sizeof(roadNodeY***)*xSize);
int i,j,k;
-
+
maxSegmentSize = segmentSize;
nbXSubDivision = xSize;
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() {
int i, j;
@@ -313,6 +370,7 @@ int main() {
int n = 5;
svg_start(800,600);
carreY();
+
//int i;
//for (i = 0; i < n; i++) {
// svg_line(&(points[i]), &(points[(i+1)%n]));