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; }
/* 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; }