Ejemplo n.º 1
0
bool Stage::isShipInWall(double x, double y) {
  for (int z = 0; z < numWalls_; z++) {
    Wall *wall = walls_[z];
    double left = wall->getLeft();
    double bottom = wall->getBottom();
    if (x > left && x < left + wall->getWidth() && y > bottom
        && y < bottom + wall->getHeight()) {
      return true;
    }
  }

  Circle2D *shipCircle = new Circle2D(x, y, SHIP_RADIUS);
  for (int z = 0; z < numWallLines_; z++) {
    Line2D* line = wallLines_[z];
    if (shipCircle->intersects(line)) {
      delete shipCircle;
      return true;
    }
  }
  delete shipCircle;
  return false;
}
Ejemplo n.º 2
0
bool Circle2D::intersects(Line2D *line, bool inverted, bool assignPoints,
    Point2D **p1, Point2D **p2) {
  if (h_ - line->xMax() > r_ || line->xMin() - h_ > r_ || k_ - line->yMax() > r_
      || line->yMin() - k_ > r_) {
    return false;
  }
  
  double linem = line->m();
  double lineb = line->b();

  if (linem == DBL_MAX) {
    Line2D *invLine = line->getInverse();
    Circle2D *invCircle = this->getInverse();
    return invCircle->intersects(invLine, !inverted, assignPoints, p1, p2);
  } else {
    bool intersects = false;

    if (contains(line->x1(), line->y1())) {
      if (assignPoints) {
        saveToNextPoint(p1, p2, line->x1(), line->y1(), inverted);
        intersects = true;
      } else {
        return true;
      }
    }
    if (contains(line->x2(), line->y2())) {
      if (assignPoints) {
        saveToNextPoint(p1, p2, line->x2(), line->y2(), inverted);
        intersects = true;
        if (*p2 != 0) {
          return true;
        }
      } else {
        return true;
      }
    }

    double a = square(linem) + 1;
    double b = 2 * ((lineb * linem) - (k_ * linem) - h_);
    double c = square(h_) + square(k_) + square(lineb) - (2 * lineb * k_)
        - square(r_);

    double discrim = (b * b) - (4 * a * c);
    if (discrim < 0) {
      return false;
    }
      
    double sqrtDiscrim = sqrt(discrim);
    double x1 = (-b + sqrtDiscrim) / (2 * a);
    double y1 = (linem * x1) + lineb;

    if (x1 >= line->xMin() && x1 <= line->xMax()) {
      if (assignPoints) {
        saveToNextPoint(p1, p2, x1, y1, inverted);
        intersects = true;
        if (*p2 != 0) {
          return true;
        }
      } else {
        return true;
      }
    }
      
    if (sqrtDiscrim > 0) {
      double x2 = (-b - sqrtDiscrim) / (2 * a);
      double y2 = (linem * x2) + lineb;
      if (x2 >= line->xMin() && x2 <= line->xMax()) {
        if (assignPoints) {
          saveToNextPoint(p1, p2, x2, y2, inverted);
          intersects = true;
        } else {
          return true;
        }
      }
    }
    return intersects;
  }
}