我目前正致力于数据可视化,该数据可视化从电影中获取信息,实时播放并同时创建。 为此,我想要两个单独的草图窗口。一个窗口应该显示实时播放的电影,另一个窗口显示正在进行的可视化。
我似乎无法弄清楚如何轻松添加另一个草图窗口,并尝试了一些不再适用于Processing 3的示例。 (例如,sojamos库Control p5)
然后我偶然发现了这个例子: https://gist.github.com/atduskgreg/666e46c8408e2a33b09a
尽管我可以让它一次显示两个草图窗口,但我显然无法使用另一个窗口中的数据。
还有其他办法吗?
谢谢!
答案 0 :(得分:3)
没有什么能阻止你在PWindow
类(创建第二个窗口)中声明一个函数,该函数接受你可以在里面使用的参数并从另一个草图中调用它。
因此,您可以将表单中的数据作为函数参数传递给第二个窗口。
这个小例子通过一个函数(这里称为mousePressed
)将相对evokedFromPrimary
位置从第一个窗口传递到第二个窗口,并将其存储在ArrayList
中,在第二个窗口中绘制它们窗口:
PWindow win;
public void settings() {
size(320, 240);
}
void setup() {
win = new PWindow();
}
void draw() {
background(255, 0, 0);
text("Click in this window to draw at a relative position in the other window", 10, 10, this.width - 20, 100);
}
void mousePressed() {
println("mousePressed in primary window");
float relPosX = map(mouseX, 0, this.width, 0, 100);
float relPosY = map(mouseY, 0, this.height, 0, 100);
win.evokedFromPrimary(relPosX, relPosY);
}
class PWindow extends PApplet {
ArrayList<PVector> vectors = new ArrayList<PVector>();
PWindow() {
super();
PApplet.runSketch(new String[] {this.getClass().getSimpleName()}, this);
}
void evokedFromPrimary(float relPosX, float relPosY) {
println("evoked from primary");
float xPos = map(relPosX, 0, 100, 0, this.width);
float yPos = map(relPosY, 0, 100, 0, this.height);
vectors.add(new PVector(xPos, yPos));
}
void settings() {
size(500, 200);
}
void setup() {
background(150);
}
void draw() {
background(150);
//store the vector size before using to avoid ConcurrentModificationException
int listLength = vectors.size();
for(int i = 0; i < listLength; i++) {
PVector v = vectors.get(i);
ellipse(v.x, v.y, random(50), random(50));
}
}
void mousePressed() {
println("mousePressed in secondary window");
}
}
此处的Pwindow代码位于相同的.pda文件中。