class street { float w=80; // street width pt B=new pt(700,100), F=new pt(600,700); // front and back end-points boolean pickedB=false, pickedF=false, picked=false; street (float bx, float by, float fx, float fy, float pw) {B.x=bx; B.y=by; F.x=fx; F.y=fy; w=pw;}; void paint() { fill(200,200,100); noStroke(); vec N=B.vecTo(F).left(); N.unit(); N.mul(w); beginShape(); B.movedBy(N).vert(); F.movedBy(N).vert(); N.back(); F.movedBy(N).vert(); B.movedBy(N).vert(); endShape(); }; void paintLine() { B.showLineTo(F); }; boolean selected() { pickedF = F.vecTo(mouse()).norm()<30; pickedB = B.vecTo(mouse()).norm()<30; picked=pickedF||pickedB; return(picked); } void track() {pt M=mouse(); if(pickedF) {F.setTo(M);} if(pickedB) {B.setTo(M);} } void paintDots() {if (!pickedB) {fill(yellow); B.show(20);}; if (!pickedF) {fill(yellow); F.show(20); }; }; void snap() { if (pickedB) {if(abs(B.x-F.x)<5) {B.x=F.x;}; if(abs(B.y-F.y)<5) {B.y=F.y;}; }; if (pickedF) {if(abs(F.x-B.x)<5) {F.x=B.x;}; if(abs(F.y-B.y)<5) {F.y=B.y;}; }; } String toString() { String list = str(B.x) + " " + str(B.y) + " " + str(F.x) + " " + str(F.y) + " " + str(w); return list; } }