Exemplo n.º 1
0
bool SquareCollisions::LineCollision(glm::vec2 & A1, glm::vec2 & A2,
	glm::vec2 & B1, glm::vec2 & B2,
	double* out)
{
	glm::vec2 a(A2 - A1);
	glm::vec2 b(B2 - B1);

	double f = PerpDot(a, b);
	if (!f)      // lines are parallel
		return false;

	glm::vec2 c(B2 - A2);
	double aa = PerpDot(a, c);
	double bb = PerpDot(b, c);

	if (f < 0)
	{
		if (aa > 0)     return false;
		if (bb > 0)     return false;
		if (aa < f)     return false;
		if (bb < f)     return false;
	}
	else
	{
		if (aa < 0)     return false;
		if (bb < 0)     return false;
		if (aa > f)     return false;
		if (bb > f)     return false;
	}

	if (out)
		*out = 1.0 - (aa / f);
	return true;
}
Exemplo n.º 2
0
/*
    Returns true if vector a collides with vector b
*/
bool LineCollision(double alx, double aly, double aux, double auy, double blx, double bly, double bux, double buy) {
    if (alx < aux){
        double ax = alx;
        alx = aux;
        aux = ax;    
    }
    if (aly < auy){
        double ay = aly;
        aly = auy;
        auy = ay;    
    }
  double f = PerpDot(aux - alx, auy - aly, bux - blx, buy - bly);
  if (f == 0.0) {
    return false;
  }
  double r = PerpDot(aux - alx, auy - aly, bux - aux, buy - auy);
  double s = PerpDot(bux - blx, buy - bly, bux - aux, buy - auy);
  if ((f > 0.0 && r > 0.0 && s > 0.0 && f > r && f > s) ||
      (f < 0.0 && r < 0.0 && s < 0.0 && f < r && f < s)) {
    return true;
  }
  return false;
}