Page d'accueil Description du projet
/*********************************************
 *
 * Cedric Pradalier
 * DEA 2000/2001 
 * INRIA Rhones Alpes
 * http://cedric.pradalier.free.fr/index.html
 * mail : http://cedric.pradalier.free.fr/mail.html
 *
 * *******************************************/


#include <math.h>
#include <stdlib.h>
#include "Segment.h"


/*
 * System : direction = (cos(theta),sin(theta))
 * { org.x + lambda*cos(theta) = A.x + mu*(B.x - A.x)
 * { org.y + lambda*sin(theta) = A.y + mu*(B.y - A.y)
 * */
double Segment::intersect(const Vector2 & org,double theta)
{
    /* det is never null */
    double a = cos(theta);
    double b = A.getX() - B.getX();
    double c = sin(theta) ;
    double d =  A.getY() - B.getY();
    double det = a * d - b * c;
    if (det == 0.0) det = 1e-15;
    double rhs1 = A.getX() - org.getX();
    double rhs2 = A.getY() - org.getY();
    double lambda = (d * rhs1 - b * rhs2)/det;
    double mu = (-c * rhs1 + a * rhs2)/det;

    //printf("Inter : Lambda %e | Mu %e\n",lambda,mu);
    /* The point is on the line but not on the segment */
    if ((mu < 0.0) || (mu > 1.0)) return -1.0;
    
    /* The point is not at the good side of org */
    if (lambda < 0) return -1.0;
    
    return lambda;
}

/*
 * System : direction = (cos(theta),sin(theta))
 * { org.x + lambda*dir.x = A.x + mu*(B.x - A.x)
 * { org.y + lambda*dir.y = A.y + mu*(B.y - A.y)
 * */
double Segment::intersect(const Vector2 & org,const Vector2 & dir,double * mu)
{
    /* det is never null */
    double dA = (org - A).norme();
    double dB = (org - B).norme();
    double l = (A - B).norme();
    if (fabs((dA+dB)/l - 1) < 1e-3) 
    {
        *mu = dA;
        return 0;
    }
        
    double a = dir.x;
    double b = A.getX() - B.getX();
    double c = dir.y;
    double d =  A.getY() - B.getY();
    double det = a * d - b * c;
    if (det == 0.0) {/*printf("det = 1e-20\n");*/det = 1e-20;}
    double rhs1 = A.getX() - org.getX();
    double rhs2 = A.getY() - org.getY();
    double lambda = (d * rhs1 - b * rhs2)/det;
    *mu = (-c * rhs1 + a * rhs2)/det;

    //printf("Inter : Lambda %e | Mu %e\n",lambda,mu);
    /* The point is on the line but not on the segment */
    if ((*mu < 0.0) || (*mu > 1.0)) return -1.0;
    
    /* The point is not on the good side of org */
    if (lambda < 0) return -1.0;
    
    return lambda;
}


Vector2 Segment::intersectNoCheck(const Segment & S2)
{
    /* det is never null */
    Vector2 dirS2 = (S2.B - S2.A).unitaire();
    
    double a = dirS2.getX();
    double b = A.getX() - B.getX();
    double c = dirS2.getY() ;
    double d =  A.getY() - B.getY();
    double det = a * d - b * c;
    if (det == 0.0) det = 1e-15;
    double rhs1 = A.getX() - S2.A.getX();
    double rhs2 = A.getY() - S2.A.getY();
    double lambda = (d * rhs1 - b * rhs2)/det;

    
//  printf("Intersection : %f\n",lambda);
    return S2.A + dirS2 * lambda;
}