Проблемы со сравнениями, чтобы сделать точку изменить цвет при нажатии - PullRequest
1 голос
/ 08 марта 2019

У меня проблемы с проведением сравнений.Предполагается, что проект нарисует квадрат из пользовательского ввода, а затем, где бы пользователь ни щелкнул, там будет нарисована точка разных цветов.Например, если они щелкают внутри квадрата, он должен сделать красный круг, если он находится на краю квадрата, он делает зеленый круг, а если снаружи он делает синий круг.На данный момент моя программа рисует красные и синие круги, но без зелени.На самом деле, он также рисует красные круги, когда он находится выше определенной точки.

public class Square extends GraphicsProgram {
    // Instance variables
    private int side; // the length of a side
    private int anchorX; // the X value at the upper left corner
    private int anchorY; // the Y value at the upper left corner

    public Square(int x, int y, int side) {
        anchorX = x;
        anchorY = y;
        this.side = side;
    }

    // mouseClicked method
    public void mouseClicked(MouseEvent e) {
        // Find the location where the mouse was clicked
        int x = e.getX();
        int y = e.getY();

        // boolean variables to indicate location
        boolean isInside = false;
        boolean isOutside = false;
        boolean isOnEdge = false;

        if (x > anchorX + 1 && anchorY + 1 < y && anchorY + side + 1 > y) {
            isInside = true;
        }

        if (x > anchorX + side + 1 && anchorY + side + 1 < y && x > anchorX + side - 1 & y > anchorY + side - 1) {
            isOutside = true;
        }

        /*** NOTE: There a hard, and an easy way to do this! ***/

        if (anchorX - 1 <= x && x <= anchorX - 3 && anchorY - 1 <= y && anchorY + side - 3 >= y) {
            isOnEdge = true;
        }

        if (isOnEdge == true) {
            System.out.println("(" + x + ", " + y + ") is on the square");
            GOval circle = new GOval(x - 2, y - 2, 4, 4);
            circle.setFillColor(Color.GREEN);
            circle.setFilled(true);
            add(circle);
        }

        else if (isInside == true) {
            System.out.println("(" + x + ", " + y + ") is inside the square");
            GOval circle = new GOval(x - 2, y - 2, 4, 4);
            circle.setFillColor(Color.RED);
            circle.setFilled(true);
            add(circle);
        }

        else if (isOutside == true) {
            System.out.println("(" + x + ", " + y + ") is outside the square");
            GOval circle = new GOval(x - 2, y - 2, 4, 4);
            circle.setFillColor(Color.BLUE);
            circle.setFilled(true);
            add(circle);
        }
    }
}

Нам дали подсказку о том, как (x, y) расположить квадрат как

«Например, левый край квадрата имеет:

x значений в диапазоне: anchorX-1 ≤ x ≤ anchorX + 1 и значения y в диапазоне: anchorY-1 ≤ y ≤ anchorY + side+1.

Что означало бы, что если бы у нас был квадрат с якорем X 50, якорем 100 и стороной 60, координаты, подобные (49-51, 99-161), были бы рассмотрены на краю левой стороны.

1 Ответ

0 голосов
/ 08 марта 2019

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

находится внутри:

if (x > anchorX+1 && anchorY+1 < y && anchorY+side+1 > y) {
    isInside = true;
}

Прямо сейчас это:

  • Уверен, что он справа от левой стороны x > anchorX+1
  • Уверен, что он внизу сверху anchorY+1 < y
  • Уверен, что он выше низаanchorY+side+1 > y

Проблемы с этим:

  1. anchorY+side+1 > y будет включать в себя край - +1 будет переходить
  2. Нет ничегоубедившись, что это слева от правой стороны

Рабочее решение будет:

if (x > anchorX+1 && y > anchorY+1 && x < anchorX+side-1 && y < anchorY+side-1) {
    isInside = true;
}

Снаружи:

if (x > anchorX+side+1 && anchorY+side+1 < y && x > anchorX+side-1 & y > anchorY+side-1) {
    isOutside = true;
}

Прямо сейчас это:

  • Уверен, что он справа от правой стороны x > anchorX+side+1
  • Уверен, что он ниже дна anchorY+side+1 < y
  • Уверен, что он справа отправая сторона x > anchorX+side-1
  • Убедитесь, что она находится над дном y > anchorY+side-1

Проблемы с этим:

  1. x > anchorX+side-1 and y > anchorY+side-1 будет включать в себя край в рассматриваемой области.
  2. Ничто не может быть уверенным, что он находится слева от левой стороны или над верхней стороной.
  3. x > anchorX+side+1 и x > anchorX+side-1 делаю практически то же самое.
  4. Вы использовали символ &, я не уверен, что он был намеренным или нет.Разница в том, что && выполняется только в том случае, если все предыдущие значения верны, а & всегда выполняется.&&, следовательно, быстрее и обычно предпочтительнее.
  5. Проверяя, что все верно, он запускается только тогда, когда справа и ниже от квадрата.

Рабочее решение будет:

if (x < anchorX-1 || y < anchorY-1 || x > anchorX+side+1 || y > anchorY+side+1) {
    isOutside = true;
}

На грани:

Это более хитрый

if (anchorX-1 <= x && x <= anchorX-3 && anchorY-1 <= y && anchorY+side-3 >= y) {
    isOnEdge = true;
} 

Прямо сейчас это:

  • Уверенэто справа от левой части края anchorX-1 <= x
  • Убедитесь, что это слева от точки слева от левого края x <= anchorX-3
  • Убедитесь, что это нижеверхняя часть нижней части anchorY-1 <= y
  • Убедитесь, что она находится выше точки над нижней частью anchorY+side-3 >= y

Проблемы с этим:

  1. anchorX-1 <= x и x <= anchorX-3 являются условными, поэтому нет такого x, чтобы оба были истинными, поэтому все это должно быть ложным.
  2. Вы часто использовали -3, когда, вероятно, хотели использовать +1, чтобы получить другую сторону края.
  3. Вы проверяете только левый и нижний края - два других игнорируются.
  4. При использовании&& вместо || (ИЛИ), вы будете правдой только тогда, когда все верно - это должно быть в обоих краях одновременно - то есть будет учитываться только угол.

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

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


Если вы изо всех сил пытаетесь понять все это, я предлагаю нарисовать это вручную и записать на него все значения - это гораздо проще, чем пытаться сделать это в своемголова.Чем легче ты это сделаешь, тем легче.

...