0

我正在使用处理,我很好奇如何访问原语的属性。该参考提供了构造这些原语的参数,但没有关于属性的信息。例如(我正在尝试做一些比这更复杂的事情,但这会为简单起见),如果我创建一条长度不断变化的线,有没有办法打印该线的长度:

int lineLength = 0;

void draw(){
 line(random(0,50),random(0,50),lineLength,lineLength);
 lineLength++;
 printLn(line.length);
}
4

1 回答 1

1

我不确定您所说的“原始”是什么意思。如果您的意思是绘图函数(例如point(),line(),triangle(),rect(),ellipse(),beginShape(),endShape(),vertex()等),那么这些只是处理使用传递的参数/参数在屏幕上渲染形状一次的函数。调用函数后,参数会丢失,除非它们存储在某个地方的变量中。

例如,一条线由两个点定义,因此您可以随意存储/修改它们,并在需要时简单地渲染:

PVector p1,p2;

void setup(){
  p1 = new PVector(random(100),random(100));
  p2 = new PVector(random(100),random(100));
}
void draw(){
  line(p1.x,p1.y,p2.x,p2.y);
  println("length: " + p1.dist(p2));
}

仅仅因为在 Processing 中没有定义 Line 类并不意味着你不能拿出你自己的版本来做你需要它做的事情:

Line l = new Line(random(100),random(100),random(100),random(100));

void draw(){
  background(127);
  l.draw();
  text("length: " + l.length(),1,10);
  text("mouse dist:\n" + (int)l.distanceToPoint(new PVector(mouseX,mouseY)),1,20);
}

class Line{
  PVector p1,p2;
  Line(float x1,float y1,float x2,float y2){
    p1 = new PVector(x1,y1);
    p2 = new PVector(x2,y2);
  }
  void draw(){
    line(p1.x,p1.y,p2.x,p2.y);
  }
  float length(){
    return p1.dist(p2);
  }
  //other awesome line stuff here
  //'kindly borrowed' from: http://paulbourke.net/geometry/pointline/
  float distanceToPoint(PVector p){
    float dx = p2.x - p1.x;
    float dy = p2.y - p1.y;
    float u = ((p.x - p1.x) * dx + (p.y - p1.y) * dy) / (dx * dx + dy * dy);//traversal(% 0.0 to 1.0) along line
    PVector closest;
    if(u < 0)      closest = p1;
    else if(u > 1) closest = p2;
    else           closest = new PVector(p1.x + u * dx, p1.y + u * dy);
    return closest.dist(p);   
  }
}

当然,您也可以使用提供此类功能的库,例如toxiclibs

高温高压

于 2013-02-12T11:23:06.537 回答