我对这个处理草图的目标是能够导出为 svg 或 pdf,这样我就可以在 inkscape 中打开文件并使用我的 Axidraw 进行打印(就像我过去使用其他草图所做的那样)。鉴于您无法在draw()中将多个帧保存到一个.svg文件中,我正在setup()中尝试它。我遇到的问题是,一旦我添加 beginRecord() 和 endRecord(),草图中就不会显示任何图形,并且生成的 svg 文件是空白且大小为零字节。
我觉得这是一个简单的错误,我只是看不到它。
// Declare 2D array
int counter = 1000;
int[] coordx = new int[counter];
int[] coordy = new int[counter];
int x;
int y;
int sz = 10;
boolean tooClose;
void setup() {
size(500, 500);
rectMode(CENTER);
//start in middle of screen
x = width/2;
y = height/2;
beginRecord(SVG, "output/filenameZ####.svg");
background(255);
noStroke();
for (int i = 0; i < counter; i++) {
runWalker();
checkOverlap(x, y, i);
coordx[i]= x;
coordy[i]= y;
println(x, coordx[i], y, coordy[i], i);
}
endRecord();
}
void draw() {
}
void checkOverlap(int xx, int yy, int jj) {
for (int k = 0; k < counter; k++) {
if (xx == coordx[k] && yy == coordy[k]) {
tooClose = true;
} else {
tooClose = false;
noStroke();
fill(0);
ellipse(x, y, sz, sz);
}
}
}
void runWalker() {
float move = int(random(0, 4));
if (move == 0) {
x += sz;
} else if ( move == 1) {
y += sz;
} else if (move == 2) {
x += -sz;
} else {
y += -sz;
}
//prevent going off left or right
if (x < 0) {
x = width;
}
if (x > width) {
x = 0;
}
//prevent going off top or bottom
if (y < 0) {
y = height;
}
if (y > height) {
y = 0;
}
}```
以下源代码使用 PVector 的 ArrayList 在每次按键时保存 SVG 图像。 如果您只使用 beginRecord() 和 endRecord(),您一次只能看到一个点。 您没有看到任何图形的原因是您尝试在 setup() 中绘制,而绘制需要在 draw() 中完成。 您应该能够使用此技术保存多个图像,如下所述:https://discourse.processing.org/t/creating-svg-only-saves-a-single-frame/14509
import processing.svg.PGraphicsSVG;
int counter = 1000;
float x;
float y;
float sz = 5;
boolean tooClose;
ArrayList<PVector> pts = new ArrayList<PVector>();
void setup() {
size(500, 500);
rectMode(CENTER);
//start in middle of screen
x = width/2;
y = height/2;
beginRecord(SVG, "img####.svg");
background(255);
noStroke();
}
void draw() {
for (int i = 0; i < counter; i++) {
runWalker();
checkOverlap(x, y, i);
}
if (frameCount > 1) {
for (int i = 1; i < pts.size(); i++ ) {
circle(pts.get(i).x, pts.get(i).y, sz ); // draw all
}
}
}
void checkOverlap(float xx, float yy, int i) {
if (xx == pts.get(i).x && yy == pts.get(i).y) {
tooClose = true;
} else {
tooClose = false;
noStroke();
fill(0);
circle(x, y, sz);
}
}
void runWalker() {
float move = int(random(0, 4));
if (move == 0) {
x += sz;
} else if ( move == 1) {
y += sz;
} else if (move == 2) {
x += -sz;
} else {
y += -sz;
}
//prevent going off left or right
if (x < 0) {
x = width;
}
if (x > width) {
x = 0;
}
//prevent going off top or bottom
if (y < 0) {
y = height;
}
if (y > height) {
y = 0;
}
pts.add(new PVector(x, y));
}
void keyPressed() {
if (key == 'r') { // press 'r' to save
endRecord();
beginRecord(SVG, "img####.svg");
println("image saved.");
}
}