我在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行)并删除旧的行。
我当然可以将旧坐标的坐标写入数组,并在黑线上方绘制第一个元素的白线,然后删除该数组的第一个元素,最后创建一个新的数组元素。但这会在较新的线条上绘制白色像素,这是不可取的。
有没有办法解决这个问题? 也许创建以后要清除的对象?
谢谢!
答案 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()
时如何清除以前的帧。这是一种非常标准的方法,可能是大多数处理草图所要执行的操作。