处理功能未按预期工作

Processing function not working as intended

我在 Processing 3.0 中实现了选择排序算法,我想在排序时显示条形。代码如下:

ArrayList<Bar> sort() {
int smallest;

for (int i = 0; i < sortedBars.size(); i++) {
  smallest = indexOfMinimum(i);
  swap(sortedBars, smallest, i);

  background(0);

  for (int i2 = 0; i2 < sortedBars.size(); i2++) {
    sortedBars.get(i2).display(i2, 255);
  }
}

return sortedBars;}

然而,此代码仅显示初始状态和最终状态的一些柱,跳过中间的所有内容。

另一方面,如果我使用类似的函数,但它只运行一次

ArrayList<Bar> sort(int i) {
  int smallest = indexOfMinimum(i);
  swap(sortedBars, smallest, i);

  return sortedBars;}

然后在draw()函数中多次调用,效果很好。 我做错了什么吗?

编辑:忘记说了,这是显示功能:

void display(int position, color col) {
stroke(col);
line(position, height, position, height - barSize);}

此外,Bar class 有一个名为 barSie 的属性。

这正是 Processing 的工作方式。

处理是双缓冲的,这意味着它将所有内容绘制到屏幕外缓冲区,然后再将该缓冲区复制到屏幕。通常这是一件好事,因为它使动画更流畅。但是就像您发现的那样,它会阻止显示 "in-between" 帧。

为了解决你的问题,我想到了两种方法:

选项一:不使用 for 循环进行迭代,而是将对 draw() 函数的每次调用作为算法中的一次 "step"。这样一来,您就可以每帧​​显示一个步骤。

选项二:不绘制到屏幕,而是将算法的每个步骤绘制到其自己的缓冲区,您可以使用 createGraphics() 函数创建缓冲区。要么将帧保存到光盘,要么保存在它们自己的数据结构中。然后当算法完成时,您将拥有一组可以显示的帧。

具体采用哪种方法取决于您自己以及您的最终目标。祝你好运。