「プリミティブ」の意味がわかりません。描画関数 (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