Esempio n. 1
0
//---------------------------------------------------------------------------
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;
}
Esempio n. 2
0
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));
}