我在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的属性。
答案 0 :(得分:1)
这正是处理功能的工作方式。
处理是双缓冲的,这意味着它将所有内容都绘制到屏幕外的缓冲区中,然后再将该缓冲区复制到屏幕上。通常这是一件好事,因为它可使动画更流畅。但是就像您已经发现的那样,它可以防止显示“中间”帧。
要解决您的问题,我可以想到两种方法:
选项1:与其使用for
循环进行迭代,不如将每个对draw()
函数的调用作为算法中的一个“步骤”。这样一来,您可以每帧显示一个步骤。
选项二:不用绘制到屏幕上,而是将算法的每个步骤绘制到其自己的缓冲区,您可以使用createGraphics()
函数来创建该缓冲区。可以将帧保存到光盘中,也可以保存在自己的数据结构中。然后,算法完成后,您将拥有一组可以显示的框架。
您采用哪种方法确实取决于您以及您的最终目标是什么。祝你好运。