首页 > 解决方案 > 如何为正在比较的矩形着色?

问题描述

我是处理环境的新手,正在尝试为冒泡排序构建可视化工具。我对此有一些疑问-

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

标签: javasortingprocessing

解决方案


矩形的可视化和绘制是否正确?

那是基于意见的。但它有效,所以是的。该代码结构良好,并遵循基本准则。


如何为当前正在比较的矩形着色?

fill()你必须在绘制矩形之前设置一个单独的颜色。颜色由红色、绿色和蓝色通道组成。通道混合成最终颜色。如果所有 3 个通道具有相同的比例,则颜色为灰度颜色。(0, 0, 0) 是黑色, (255, 255, 255) 是白色。

例如,将比较的矩形涂成红色,将所有其他矩形涂成灰色。比较的矩形具有索引ii-1
由于for循环的控制变量也命名为i,因此必须更改(例如j):

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

将索引i与控制变量进行比较j。如果 j==i-1j==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();
}


[...] 可以使用 Swing 或任何本机库在 java 中完成

要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack Overflow 来说是无关紧要的,因为它们往往会吸引固执己见的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决该问题所做的工作。


推荐阅读