//--------------------------------------------------------------------------- bool Circulo::Corte(Pelota* pelota, GLdouble &tIn, PV* &normal) { PV * pc = new PV(*centro->operator -(*pelota->getCentro())); PV *pc_borrar = new PV(centro->getX() - pelota->getCentro()->getX(), centro->getY() - pelota->getCentro()->getY()); PV *s = pelota->getDireccion(); PV *sT = new PV(- s->getY(), s->getX()); GLdouble a = pc->dot(s) / s->dot(s); GLdouble b = pc->dot(sT) / s->dot(s); GLdouble d0 = fabs(b) * sT->modulo(); delete pc; delete sT; if (d0 < (pelota->getRadio() + radio)) { GLdouble d2 = sqrt(pow(pelota->getRadio() + radio, 2) - pow(d0, 2)); GLdouble d1 = fabs(a) * s->modulo() - d2; tIn = d1 / s->modulo(); PV *puntoContacto = new PV(pelota->getCentro()->getX() + tIn * pelota->getDireccion()->getX(),pelota->getCentro()->getY() + tIn * pelota->getDireccion()->getY()); PV * unaNormalTemp = *puntoContacto-*centro; GLdouble mod = unaNormalTemp->modulo(); if (unaNormal != NULL) delete unaNormal; unaNormal = new PV(unaNormalTemp->getX() / mod, unaNormalTemp->getY() / mod); normal = unaNormal; delete puntoContacto; return (a > 0) && (s->modulo() > d1); } else return false; }
bool Rectangulo::Corte(Pelota* pelota, GLdouble &tIn, PV* &normal) { GLfloat epsilon = 0.000001f; tIn = 0; GLdouble tOut = 1; GLdouble tHit; GLdouble num, den; PV * n; int i = -1; bool enc = false; while (i < nVertices - 1 && !enc) { i++; n = normales[i]; PV ptang = pelota->getPuntoTangente(n); PV * tmpVector = *vertices[i] - pelota->getPuntoTangente(n); num = tmpVector->dot(n); den = n->dot(pelota->getDireccion()); if (fabs(den) > epsilon) { // hay tHit tHit = num / den; if (den > 0) { if (tHit < tOut) tOut = tHit; } else { if (tHit >= tIn) { tIn = tHit; normal = n; } } enc = tIn > tOut; // si se han cruzado, no hay intersección } else { // paralelismo if (num <= 0) enc = true; } } return !enc && !((tIn == 0) && (tIn <= tOut) && (tOut < epsilon)); }