///detectar si dos segmentos se cruzan.
/// Dados dos segmentos PQ UW podemos detectar si se cruzan. El proceso que uso
/// es: para cada recta formada por dos puntos, detecto la interseccion de las rectas
/// Si intersectan, checkeo que el punto de interseccion pertencece a los segmentos especificados
bool detectarCruce(stPosicion P, stPosicion Q, stPosicion U, stPosicion W){
float m1, m2;
float k1, k2;
float Xc, Yc;
//////////////////////////////////////////////////////////////////////////
// para PQ, buscar la pendiente
// evitar divisiones por cero
if ((Q.x - P.x) != 0){
// como la ecuacion de la recta es y = mx*k, necesito los valores de m y k
m1 = (Q.y - P.y )/(Q.x - P.x);
k1 = P.y - m1*P.x;
}else{
m1 = FLT_MAX;
if (P.x > 0)
k1 = -FLT_MAX;
else
k1 = FLT_MAX;
}
//////////////////////////////////////////////////////////////////////////
// para UW, buscar la pendiente
// evitar divisiones por cero
if ((W.x - U.x) != 0){
// como la ecuacion de la recta es y = mx*k, necesito los valores de m y k
m2 = (W.y - U.y)/(W.x - U.x);
k2 = U.y - m2*U.x;
}else{
m2 = FLT_MAX;
if (U.x > 0)
k2 = -FLT_MAX;
else
k2 = FLT_MAX;
}
// si m1 y m2 son iguales (si las pendientes son iguales), entonces las
// rectas son paralelas. Como el bounding box es algo mas grande que el objeto,
// para evitar calculos, no considero el hecho de calcular si dos rectas paralelas
// son o no la misma
if (m1 == m2){
return false;
}
// Con las variables previamente aisladas (por eficiencia), hallo el punto de cruce
// de las rectas que contienen el segmento
Xc = (k2 - k1)/(m1 - m2);
Yc = (k2*m1 - k1*m2)/(m1 - m2);
/*
cout << "Punto 1: "<<P.x <<","<<P.y<<endl;
cout << "Punto 2: "<<Q.x <<","<<Q.y<<endl;
cout << "Punto 3: "<<U.x <<","<<U.y<<endl;
cout << "Punto 4: "<<W.x <<","<<W.y<<endl;
cout << "el punto de cruce es "<<Xc<<","<<Yc<<endl;
*/
// comprobar si los puntos de cruce estan dentro de los segmentos
if (!(_valorEntre(P.x,Q.x,Xc))){
return false;
}
if (!(_valorEntre(P.y,Q.y,Yc))){
return false;
}
if (!(_valorEntre(U.x,W.x,Xc))){
return false;
}
if (!(_valorEntre(U.y,W.y,Yc))){
return false;
}
//int a = 3;
//printf("assas");
//cout << "Detectado clipping" << endl;
return true;
}