Processing 当画出新的线条时,如何删除旧的线条?

Processing 当画出新的线条时,如何删除旧的线条?,processing,Processing,我在网络开发方面有经验,但对处理方面还不熟悉。 我想出了一个简单的草图,画了一些线,制作出了漂亮的螺旋形图像: float x1=随机(宽度); 浮动y1=随机(高度); 浮动x2=随机(宽度); 浮动y2=随机(高度); 浮动速度x1=随机(5,20); 浮动速度1=随机(5,20); 浮动速度x2=随机(5,20); 浮动速度2=随机(5,20); 无效设置(){ 尺寸(640360); 背景(255); 冲程重量(0.5); 帧率(15); } 作废提款(){ 对于(int i=0;i宽度

我在网络开发方面有经验,但对处理方面还不熟悉。 我想出了一个简单的草图,画了一些线,制作出了漂亮的螺旋形图像:

float x1=随机(宽度);
浮动y1=随机(高度);
浮动x2=随机(宽度);
浮动y2=随机(高度);
浮动速度x1=随机(5,20);
浮动速度1=随机(5,20);
浮动速度x2=随机(5,20);
浮动速度2=随机(5,20);
无效设置(){
尺寸(640360);
背景(255);
冲程重量(0.5);
帧率(15);
}
作废提款(){
对于(int i=0;i<1;i++){
如果((x1>宽度)| |(x1<0)){
speedx1=speedx1*-1;
}
如果((y1>高度)| |(y1<0)){
速度1=速度1*-1;
}
如果((x2>宽度)| |(x2<0)){
speedx2=speedx2*-1;
}
如果((y2>高度)| |(y2<0)){
speedy2=speedy2*-1;
}
x1+=x1;
y1+=速度y1;
x2+=speedx2;
y2+=速度y2;
线(x1,y1,x2,y2);
if(frameCount%500==0)saveFrame(“spirograph-#######.png”);
}
}
这很好,但过了一段时间,图像中的线条变得杂乱无章,因为它们不会消失。所以我想保留一些行(也许15行)并删除旧的

当然,我可以将旧元素的坐标写入一个数组,在黑线上画出第一个元素的白线,然后删除数组的第一个元素,并在最后创建一个新的数组元素。但这会在较新的线条上画出白色像素,这是不可取的

有办法解决这个问题吗? 是否可以创建稍后将被清除的对象


谢谢

我建议创建一个类
CLine
,它可以保存直线的坐标并绘制直线:

公共类CLine{
公共CLine(){}
公共浮点数x1=0,y1=0,x2=0,y2=0;
公共无效集合(浮动x1、浮动y1、浮动x2、浮动y2){
_x1=x1;y1=y1;x2=x2;y2=y2;
}
公众抽签(){
如果(x1!=x2 | | y1!=y2)
线(x1,y1,x2,y2);
}
};
创建一个
CLine
对象数组,并在
setup
函数中对其进行初始化:

CLine[]行;
int电流=0;
无效设置(){
int no_of=15;
线条=新的斜坡[数量];
对于(int i=0;i
在每个
draw
中创建一条新线,并将坐标存储到
CLine
对象的数组中。使用控制变量
next\u line\u index
,保存要存储下一行的数组元素的索引。如果计数器到达数组的末尾,则必须将其设置为0。
现在,您可以在每个帧中清除屏幕,并可以将存储在阵列中的所有线条绘制到一个干净的视图中:

float x1=随机(宽度);
浮动y1=随机(高度);
浮动x2=随机(宽度);
浮动y2=随机(高度);
浮动速度x1=随机(5,20);
浮动速度1=随机(5,20);
浮动速度x2=随机(5,20);
浮动速度2=随机(5,20);
int next_line_index=0;
作废提款(){
如果((x1>宽度)| |(x1<0)){
speedx1=speedx1*-1;
}
如果((y1>高度)| |(y1<0)){
速度1=速度1*-1;
}
如果((x2>宽度)| |(x2<0)){
speedx2=speedx2*-1;
}
如果((y2>高度)| |(y2<0)){
speedy2=speedy2*-1;
}
x1+=x1;
y1+=速度y1;
x2+=speedx2;
y2+=速度y2;
行[next_line_index++].set(x1,y1,x2,y2);
如果(next_line_index==lines.length)next_line_index=0;
背景(255);
对于(int j=0;j
预览:

当然,我可以将旧元素的坐标写入一个数组,在黑线上画出第一个元素的白线,然后删除数组的第一个元素,并在最后创建一个新的数组元素。但这会在较新的线条上画出白色像素,这是不可取的

你在正确的轨道上。您希望将线的坐标存储在数组中(或者更好地,存储在
Line
实例的数组列表中)。但你不想一次“擦除”一行

相反,你可能想把一切都清理干净!您可以通过调用
background()
函数来实现这一点。然后重新画出你想要的线条

下面是一个非常基本的示例:

void draw(){
  background(255);

  for(Line line : lines){
    line.draw();
  }
}

void mousePressed(){
  lines.add(new Line(0, 0, mouseX, mouseY));
  if(lines.size() >= 10){
    lines.remove(0);
  }
}

这段代码假设您已经创建了一个
类,但更重要的是,请注意每次调用
draw()
时,如何清除前面的帧。这是一种非常标准的方法,可能是您希望对大多数处理草图执行的操作。

我得到一个错误:变量x1不存在于此行中:if((x1>宽度)|(x1<0)){我遗漏了什么吗?@MisterWoyng当然你必须保留你问题中
x1
y1
x2
y2
speedx1
speedy1
speedx2
speedy2
的变量声明。我把它们添加到了答案中。哇……现在很有效,看起来很棒。谢谢你.:-)我似乎很难创建一个Line类。你会怎么做?@MisterWoyng Rabbid76的答案已经涵盖了这一点,但你可能还想查看一下如何在Processing中创建类。