вернуть true, если круг c перекрывает любой другой круг в arrayylist - PullRequest
0 голосов
/ 25 мая 2020

У меня есть задание в моем классе для начинающих по программированию, в java. Это задание (переведено мной со шведского sh на английский sh, поэтому заранее извиняюсь);

Класс CircleList отслеживает количество кругов. Реализуйте класс.

Руководство

  • Эта задача должна не только дать практику в использовании ArrayList, но и дать практику разбить проблему на несколько методов. Поэтому вы должны использовать метод overlaps внутри метода add.
  • И для того, чтобы метод overlaps было проще писать, вам следует в overlaps использовать частный метод circleOverlaps .
  • Два круга перекрываются, если расстояние между их исходными точками меньше суммы их радиусов.

Класс Circle выглядит так:

class Circle {
    private double radius;
    private double x;
    private double y;

   /** Constructs a circle with the radie radius and the 
       center in  x, y. */
    public Circle(double x, double y, double radius) {
        this.x = x;
        this.y = y;
        this.radius = radius;
    }

    /** Returns the x coordinate of the center. */
    public double getX() {
        return x;
    }

    /** Returns the y coordinate of the center. */
    public double getY() {
        return y;
    }

    /** Returns the radius. */
    public double radius() {
        return radius;
    }

     /** Returns the area. */
    public double area() {
        return Math.PI * radius * radius;
    }
}

И это то, что я придумал до сих пор (методы уже были объявлены, но не реализованы);

public class CircleList {
   private ArrayList<Circle> circles;

    /** Constructs an empty list for circles. */
    public CircleList() {
        circles = new ArrayList<Circle>();
    }

    /** Adds the circle c to the list if it not ovelaps
        with any circle in the list. Return true if 
        circle has been added. */ 
    public boolean add(Circle c) {
          circles.add(c); 
    }

    /** Returns true if the circle c ovelaps with any 
        one circle in this list. */
    public boolean overlaps(Circle c) {

    }

    private boolean circlesOverlaps(Circle c1, Circle c2) {
        double r1 = Circle.radius(c1); //radius, x- & y-value of circle 1 (c1)
        double x1 = Circle.getX(c1);
        double y1 = Circle.getY(c1);

        double r2 = Circle.radius(c2); //radius, x- & y-value för circle 2 (c2)
        double x2 = Circle.getX(c2);
        double y2 = Circle.getY(c2);
        double distance = Math.pow((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2), 0.5);

    if (r2 >= r1 && distance <= (r2 - r1)){  //c1 is inside c2

    }
    else if (r1 >= r2 && distance <= (r1 - r2) ) { //c2 is inside c1

    }
    else if (distance > (r1 + r2)){ //c2 doesn't overlap c1

    }
    else { //c2 overlaps c1

    }


    }
}

Я действительно не знаю, с чего начать. И мне действительно не у кого сейчас спросить. Я понимаю, если это даже слишком много для начала. Но все равно спасибо.

Береги себя.

1 Ответ

0 голосов
/ 25 мая 2020

В основном вам нужно перебрать все круги и проверить, не перекрывается ли данный круг с чем-то вроде

public boolean overlaps(Circle c) {
        return circles.stream()
                .anyMatch(circle -> circlesOverlaps(c, circle));
    }

, и вы должны вернуть true или false из ваших условий if в circlesOverlaps метод, в зависимости от того, рассматриваете ли вы один круг внутри другого как перекрытие или нет для вашей проблемы. вернуть логическое значение на основе вашего типа возврата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...