Wednesday, May 31, 2017

Find a point some partial length along a poly-line

len3v sum's up total length if a poly-line
v2t returns a point
 some partial length along the poly-line.
Far_Along is a 0-1 multiplier to regularize the expression with other code
Usage:



My_poly_line=make_points(6);
LengthOfIt=(len3v(My_poly_line));
Far_Along=rnd(1);
My_Point_Exactly=v2t(My_poly_line,LengthOfIt*Far_Along);
echo( str(round(Far_Along*100),"% "),My_Point_Exactly);
polyline(My_poly_line);
translate(My_Point_Exactly)color("gold")sphere(3);
translate(My_poly_line[0])color("red")sphere(2);
translate(My_poly_line[len(My_poly_line)-1])color("blue")sphere(2);

module line(p1, p2 ,width=0.1) { hull() {        
translate(p1) sphere(width);
translate(p2) sphere(width);    }}

module polyline(p) {for(i=[0:max(0,len(p)-2)])line(p[i],p[i+1]);}

function un(v)=v/max(1e-15,norm(v));
function len3v(v,acc=0,p=0)=p+1>len(v)-1?
        acc: len3v(v,acc+norm(v[p]-v[p+1]),p+1)  ;
function v2t(v,stop,p=0)=p+1>len(v)-1|| norm(v[p]-v[p+1])>stop?  
 v[p]+un(v[p+1]-v[p])*stop:v2t(v,stop-norm(v[p]-v[p+1]),p+1);
function make_points(j=10,l1=[-30,-30,-30],l2=[30,30,30])= 
     ([for(i=[1:j])[
rnd(l1.x,l2.x)/10+i*10,//linear spagetti
rnd(l1.y,l2.y),
rnd(l1.z,l2.z)]]);
function rnd(a = 1, b = 0, s = []) = 
  s == [] ? 
   (rands(min(a, b), max(   a, b), 1)[0]) 
  : 
   (rands(min(a, b), max(a, b), 1, s)[0])
  ; 

module line(p1, p2 ,width=0.1) { hull() {        
translate(p1) sphere(width);
translate(p2) sphere(width);    }}

module polyline(p) {for(i=[0:max(0,len(p)-2)])line(p[i],p[i+1]);}


 

No comments:

Post a Comment