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

Я делаю лабораторию для курса информатики, который я прохожу в университете. Проблема гласит: «Пусть каждый из них возвращает представление int для цвета. Также каждый из них принимает четыре параметра int: индекс столбца, индекс строки, ширину изображения и высоту изображения. В конечном итоге вы будете использовать эти параметры для арбитража между цветами. . "

Специально для метода, который я не могу понять, возникает вопрос:" В методе boxColor напишите условный оператор, который выбирает между тремя цветами для создания этого изображения ".

Этоimage: Image


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

Вопрос гласит: «В методе stripesColor напишите условное утверждение, которое выбирает между тремя цветами для создания этого изображения: "

Изображение: Изображение

А вот код, который я написал для завершенияЗадача:

  public static int stripesColor(int column, int row, int imWidth, int imHeight) {
      if (column < (imHeight / 3)) {
         return Color.red.getRGB();
      } else if ((column < 2 * (imHeight / 3))) {
         return Color.pink.getRGB();
      } else {
         return Color.orange.getRGB();
    }
  }

Я должен также упомянуть, чтобы было ясно, профессор предоставил нам класс, который будет использовать методПоскольку мы пишем для получения изображений, мы несем ответственность только за вычисления, чтобы получить изображения, которые он предоставляет.

Я попытался найти диагональ всего квадрата (512px x 512px) и сделатьменьший квадрат на внутренней части 1/5 от общего размера, но я не уверен, что то, что я делаю, просто неправильно или есть другой способ сделать это.

Любая помощь приветствуется, спасибо.

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Это не столько проблема кодирования, сколько проблема структурирования комбинационной логики.

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

Хорошо. Давайте посмотрим на первую часть - как мы определяем верхнюю левую половину изображения? Если мы будем рассматривать квадратные пиксели изображения как график, то центральная линия, разделяющая желтый и голубой, - это линия, проходящая от начала координат (0,0) до верхнего левого угла (imWidth, imHeight). Эта линия имеет наклон в единицу и имеет вид y = x. Таким образом, пиксель в верхнем левом углу находится в любом месте, где столбец <= строка. </p>

Поэтому мы устанавливаем возвращаемое значение в желтое целое число, когда столбец <= строка. </p>

Для нижнего-лева конус мы выбрали противоположное сравнение, поэтому мы устанавливаем возвращаемое значение равным голубому целочисленному значению когда column> row.

Теперь, чтобы обработать оверлей, мы хотим найти случаи, когда пиксель находится в пределах этого центральногоплощадь. Допустим, мы хотим, чтобы изображение занимало 80% от середины, тогда нам нужно установить область буфера на 10% от общего размера. Так что мы проверяем, является ли (imWidth * (0,1) <строка) && (строка <imWidth * (1-0.1)) && (imHeight * (0,1) <столбец) && (column <imHeight * (1-0.1))) </p>

public static int boxColor(int column, int row, int imWidth, int imHeight) {
    final int UPPER_LEFT_COLOR = 0; // Set to upper-left color.
    final int LOWER_RIGHT_COLOR = 128; // Set to lower-right color.
    final int CENTER_SQUARE_COLOR = 255; // Set to center color.
    final double MARGIN_AMOUNT = 0.1; // Set to buffer percentage

    int return_color = 0; //Initialize the return value to something.
    // First set the return value based on the midline split.
    if (column <= row) {
        return_color = UPPER_LEFT_COLOR;
    } else {
        return_color = LOWER_RIGHT_COLOR;
    }
    // Test for the overlay and reset the return value.
    if ((imWidth * (MARGIN_AMOUNT) < row ) && (row < imWidth * (1-MARGIN_AMOUNT)) && (imHeight * (MARGIN_AMOUNT) < column) && (column < imHeight * (1-MARGIN_AMOUNT))) {
        return_color = CENTER_SQUARE_COLOR;
    }
    // Return the finally determined value.
    return return_color;
}
0 голосов
/ 24 октября 2019

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

Только в макушке моей головы, не прикасайся слишком сильно к математике ...

public static int stripesColor(int column, int row, int imWidth, int imHeight) {
    // Just worry about the square in the center for now.

    // If pixel is not in left/bottom or top/right quarters:
    if (imWidth / 4 < column < (imWidth * 3)/4) && 
    (imHeight / 4 < row < (imHeight * 3)/4) {

        return Color.hotpink.getRGB();

    } else if {
        // We know that any pixel in the center square is already taken care of, 
        // so the logic for the rest can completely ignore that.
        // It can be written as though the square isn't in the image at all.
    } else {
        // Last remaining color
    }
}

Я также не знаю, тусклые ли внутренние квадраты1/2 или 3/5 от общего размера;Я предположил 1/2 здесь, но это не должно иметь значения, в конечном счете. Надеемся, что это поможет вам открепиться.

Если математика внутри условия if выглядит грубо, вы всегда можете инициализировать отдельные переменные для этих значений, и тогда условие будет намного чище (и, по сути,документирование).

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