2

我在 mac 上使用处理 2.08。我正在尝试使用文档中给出的 createShape 函数创建 PShape。

PShape s;

void setup(){
  size(500,500);
  s = createShape();
  s.beginShape(QUADS);
  s.fill(0);
  s.vertex(100,100);
  s.vertex(100,300);
  s.vertex(300,300);
  s.vertex(300,100);
  s.endShape(); 
}

void draw(){
  shape(s);
}

但是这个程序抛出 NullPointerException。在 Processing.org 论坛上查找后,我发现一个线程说新的处理库有这个问题。

参考:https ://forum.processing.org/topic/changes-to-pshape-in​​-2-08

我该如何进行这项工作?有什么解决方法吗?谢谢

4

2 回答 2

3

从文档中:

用于存储形状的数据类型。Processing 当前可以加载和显示 SVG(可缩放矢量图形)和 OBJ 形状。在使用形状之前,必须使用 loadShape() 函数加载它。shape() 函数用于将形状绘制到显示窗口。PShape 对象包含一组方法,链接如下,可以对形状数据进行操作。OBJ 文件只能使用 P3D 渲染器打开。

您可以在此处找到参考:http: //processing.org/reference/PShape.html

简而言之,就目前而言,您必须先在别处创建形状才能使用 PShape。

您可以独立创建图像,将其保存在文件中,然后使用 PShape 加载它。它是一种 hack,但至少在他们想出更合适的解决方案之前,它可以使用 PShape。

于 2013-05-17T14:01:34.893 回答
3

除了 nickecarlo 的回答之外,您还可以使用PGraphics

PGraphics s;

void setup(){
  size(500,500);
  s = createGraphics(width,height);
  s.beginDraw();
    s.beginShape(QUADS);
    s.fill(0);
    s.vertex(100,100);
    s.vertex(100,300);
    s.vertex(300,300);
    s.vertex(300,100);
    s.endShape(); 
  s.endDraw();
}

void draw(){
  image(s,0,0);
}

或实现您自己的 Shape 类。这是一个非常粗略的例子:

Shape s = new Shape();
Shape s2 = new Shape();

void setup(){
  size(500,500);
  s.addVertex(100,100);
  s.addVertex(100,300);
  s.addVertex(300,300);
  s.addVertex(300,100);

  s2.addVertex(350,100);
  s2.addVertex(450,100);
  s2.addVertex(450,200);
  s2.addVertex(350,200);
}

void draw(){
  s.draw();
  s2.draw();
}
class Shape{
  ArrayList<PVector> vertices = new ArrayList<PVector>();
  void addVertex(float x,float y){
    vertices.add(new PVector(x,y));
  }
  void draw(){
    pushStyle();
    beginShape(QUADS);
    fill(0);
    for(PVector v : vertices) vertex(v.x,v.y);
    endShape();
    popStyle();
  }
}
于 2013-05-18T15:08:17.107 回答