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()など) を意味する場合、これらは単に、渡された引数/パラメーターを使用して画面上に形状を一度レンダリングすることを処理する関数です。関数を呼び出した後、変数に格納されていない限り、パラメーターは失われます。

たとえば、線は 2 つの点で定義されるため、それらを自由に保存/変更し、必要に応じて単純にレンダリングできます。

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 ) を使用することもできます。

HTH

于 2013-02-12T11:23:06.537 に答える