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