处理功能无法正常工作

时间:2018-07-08 15:28:13

标签: processing selection-sort

我在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类具有名为barSie的属性。

1 个答案:

答案 0 :(得分:1)

这正是处理功能的工作方式。

处理是双缓冲的,这意味着它将所有内容都绘制到屏幕外的缓冲区中,然后再将该缓冲区复制到屏幕上。通常这是一件好事,因为它可使动画更流畅。但是就像您已经发现的那样,它可以防止显示“中间”帧。

要解决您的问题,我可以想到两种方法:

选项1:与其使用for循环进行迭代,不如将每个对draw()函数的调用作为算法中的一个“步骤”。这样一来,您可以每帧显示一个步骤。

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

您采用哪种方法确实取决于您以及您的最终目标是什么。祝你好运。