绘制新行时如何删除旧行?

时间:2018-09-26 13:32:02

标签: processing

我在Web开发方面经验丰富,但对处理技术还是陌生的。 我想出了一个简单的草图,可以画出一些线,从而制作出类似呼吸描记器的漂亮图像:

WITH cte AS (
    SELECT hm.HouseholdID
    FROM HouseholdMember hm
    INNER JOIN Person p ON hm.PersonID = p.PersonID
    GROUP BY hm.HouseholdID
    HAVING COUNT(DISTINCT p.HairColor) > 1
)

SELECT *
FROM Household
WHERE HouseholdID IN (SELECT HouseholdID FROM cte);

这很好,但是过一会儿,图像变得很杂乱,因为它们不会消失。所以我想保留一些行(也许15行)并删除旧的行。

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

有没有办法解决这个问题? 也许创建以后要清除的对象?

谢谢!

2 个答案:

答案 0 :(得分:1)

我建议创建一个类CLine,该类可以保留一条线的坐标并绘制一条线:

public class CLine {

    public CLine() {}
    public float _x1 = 0, _y1 = 0, _x2 = 0, _y2 = 0;

    public void set( float x1, float y1, float x2, float y2 ) {
        _x1 = x1; _y1 = y1; _x2 = x2; _y2 = y2;
    }

    public void draw() {
        if ( _x1 != _x2 || _y1 != _y2 )
            line(_x1, _y1, _x2 , _y2);
    }
};

创建一个CLine对象的数组,并在setup函数中对其进行初始化:

CLine [] lines;
int current = 0;

void setup() {
    int no_of = 15;
    lines = new CLine[no_of];
    for (int i = 0; i < no_of; ++ i )
        lines[i] = new CLine();

    size(640, 360);
    background(255);
    strokeWeight(0.5);
    frameRate(15);
 }

在每个draw中创建一行,并将坐标存储到CLine对象的数组中。使用控制变量next_line_index来保存要存储下一行的数组元素的索引。如果计数器到达数组的末尾,则必须将bes et设置为0。
现在,您可以清除每一帧中的屏幕,并且可以将存储在数组中的所有线条绘制到干净的视图:

float x1 = random(width);
float y1 = random(height);
float x2 = random(width);
float y2 = random(height);
float speedx1 = random(5,20);
float speedy1 = random(5,20);
float speedx2 = random(5,20);
float speedy2 = random(5,20);
int next_line_index = 0;
void draw() {

    if ((x1 > width) || (x1 < 0)) {
        speedx1 = speedx1 * -1;
    }
    if ((y1 > height) || (y1 < 0)) {
        speedy1 = speedy1 * -1;
    }
    if ((x2 > width) || (x2 < 0)) {
        speedx2 = speedx2 * -1;
    }
    if ((y2 > height) || (y2 < 0)) {
        speedy2 = speedy2 * -1;
    }

    x1 += speedx1; 
    y1 += speedy1; 
    x2 += speedx2; 
    y2 += speedy2;

    lines[next_line_index++].set(x1, y1, x2, y2 );
    if (next_line_index == lines.length) next_line_index = 0;

    background(255);
    for (int j = 0; j < lines.length; ++ j )
        lines[j].draw();

    if (frameCount%500 == 0) saveFrame("spirograph-#####.png");
}

预览:

答案 1 :(得分:0)

  

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

您在正确的轨道上。您希望将行的坐标存储在一个数组中(或者更好的是,存储在Line实例的ArrayList中)。但是您不想一次“擦除”这些行。

相反,您可能想清除所有内容!您可以通过调用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);
  }
}

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