Как раскрасить сравниваемые прямоугольники? - PullRequest
2 голосов
/ 05 октября 2019

Я новичок в среде обработки, пытался создать визуализатор для пузырьковой сортировки. У меня есть несколько вопросов по этому поводу -

  • Правильно ли отображаются и отображаются прямоугольники?
  • Как мне покрасить разные прямоугольники, которые сравниваются в настоящее время?
  • Это можно сделать в Java с помощью Swing или любых собственных библиотек (т.е. без обработки)? Если да, пожалуйста, предоставьте некоторые ресурсы.
int totalNum = 10;
int[] values = new int[totalNum];
int i = 1;
int noOfComp = 0;

void draw() {

  float rectPos = 0;
  frameRate(10);
  background(255);
  for (int i = 0; i< totalNum; i++) {
    //text(values[i], rectPos , values[i]);
    stroke(220);
    fill(50);
    rect(rectPos, height - values[i], width / totalNum, values[i]);
    rectPos += width / totalNum;
  }
  textSize(20);
  text("No. Of Comparisons: ", 15, 40);
  text(noOfComp, 80, 60);
  bubbleSort();
}

void bubbleSort() {
  if (i < totalNum) {
    if (values[i] < values[i-1] && noOfComp++ > 0) {
      fill(255,5,5);
      swap(i, i-1);
      delay(100);
    }
    i++;
  } else {
    i = 1;
  }
}

void swap(int a, int b) {
  int temp = values[a];
  values[a] = values[b];
  values[b] = temp;
}

void setup() {
  size(700, 700);
  for (int i = 0; i< totalNum; i++) {
    values[i] = round(random(0, height));
  }
}

1 Ответ

2 голосов
/ 05 октября 2019

Правильно ли отображаются и рисуются прямоугольники?

Это основано на мнении. Но это работает, так что да, это так. Код хорошо структурирован и соответствует основным правилам.


Как мне покрасить прямоугольники, которые сравниваются в настоящее время?

Йов нужно установитьиндивидуальный цвет на fill() до рисования прямоугольников. Цвет состоит из красного, зеленого и синего канала. Каналы смешиваются до окончательного цвета. Если все 3 канала имеют одинаковую шкалу, то цвет будет серым. (0, 0, 0) - черный, а (255, 255, 255) - белый.

Например, раскрасьте прямоугольники, которые сравниваются, в красный, а все остальные в серый. Сравниваемые прямоугольники имеют индексы i и i-1.
Поскольку управляющие переменные цикла for также называются i, это необходимо изменить (например, j):

for (int j = 0; j < totalNum; j++) {
    // [...]
}

Сравните индекс i с управляющей переменной j. Если j==i-1 или j==i, задайте красный цвет заливки (fill(255, 0, 0)), в противном случае серый цвет (fill(127)):

for (int j = 0; j < totalNum; j++) {
    stroke(220);
    if (j==i-1 || j==i) {
        fill(255, 0, 0);
    } else {
        fill(127);
    }
    rect(rectPos, height - values[j], width / totalNum, values[j]);
    rectPos += width / totalNum;
}


Если вы просто хотите покрасить «поменяемые» прямоугольники, вы должны определить, когда noOfComp изменился. Укажите предыдущий счет подкачки в переменной prevNoOfComp перед вызовом bubbleSort. Просто используйте другой цвет, если количество свопов изменилось (if (noOfComp != prevNoOfComp && (j==i-1 || j==i))):

int noOfComp = 0;
int prevNoOfComp = 0;

void draw() {

    float rectPos = 0;
    frameRate(10);
    background(255);
    for (int j = 0; j < totalNum; j++) {
        stroke(220);
        if (noOfComp != prevNoOfComp && (j==i-1 || j==i)) {
            fill(255, 0, 0);
        } else {
            fill(127);
        }
        rect(rectPos, height - values[j], width / totalNum, values[j]);
        rectPos += width / totalNum;
    }
    textSize(12);
    text("No. Of Comparisons: ", 15, 40);
    text(noOfComp, 80, 60);

    prevNoOfComp = noOfComp;
    bubbleSort();
}


[.. .] может быть сделано в java с использованием Swing или любых собственных библиотек

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

...