将 beginRecord() 和 endRecord() 添加到 setup() 会破坏我的草图

问题描述 投票:0回答:1

我对这个处理草图的目标是能够导出为 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;
  }
}``` 
svg export processing
1个回答
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.");
  }
}

© www.soinside.com 2019 - 2024. All rights reserved.