Round-Anything icon indicating copy to clipboard operation
Round-Anything copied to clipboard

extrudeWithRadius rounds top and bottom differently

Open varalgit opened this issue 2 years ago • 3 comments

If you specify the same radius for top and bottom, the rendered shape is different for the top and the bottom. The top and bottom layers seem to be shifted by 1 layer. Example (see picture):

extrudeWithRadius(5,r1=2,r2=2,fn=10)
  offset(r = 5) 
    offset(delta = -5)  
      polygon([[0,0],[20,0],[20,20]]);


module extrudeWithRadius(length,r1=0,r2=0,fn=30){
  n1=sign(r1);n2=sign(r2);
  r1=abs(r1);r2=abs(r2);
 # translate([0,0,r1]){
    linear_extrude(length-r1-r2){
      children();
    }
  }
  for(i=[0:fn-1]){
    translate([0,0,i/fn*r1]){
      linear_extrude(r1/fn+0.01){
        offset(n1*sqrt(sq(r1)-sq(r1-i/fn*r1))-n1*r1){
          children();
        }
      }
    }
    translate([0,0,length-r2+i/fn*r2]){
      linear_extrude(r2/fn+0.01){
        offset(n2*sqrt(sq(r2)-sq(i/fn*r2))-n2*r2){
          children();
        }
      }
    }
  }

}

function sq(x)=x*x;

extrudeWithRadius-rounds-top-and-bottom-differently

varalgit avatar Jan 05 '23 02:01 varalgit

And it can be fixed with the change of one line:

offset(n2*sqrt(sq(r2)-sq(i/fn*r2))-n2*r2){

should be:

offset(n2*sqrt(sq(r2)-sq((i+1)/fn*r2))-n2*r2){

Example (I added coloring so you can see the layers):

extrudeWithRadius(5,r1=2,r2=2,fn=10)
  offset(r = 5) 
    offset(delta = -5)  
      polygon([[0,0],[20,0],[20,20]]);


module extrudeWithRadius(length,r1=0,r2=0,fn=30){
  n1=sign(r1);n2=sign(r2);
  r1=abs(r1);r2=abs(r2);
 # translate([0,0,r1]){
    linear_extrude(length-r1-r2){
      children();
    }
  }
  for(i=[0:fn-1]){
    color(c=[0,(i+1)/fn,0])
    translate([0,0,i/fn*r1]){
      linear_extrude(r1/fn+0.01){
        offset(n1*sqrt(sq(r1)-sq(r1-i/fn*r1))-n1*r1){
          children();
        }
      }
    }
    color(c=[0,(fn-i)/fn,0])
    translate([0,0,length-r2+i/fn*r2]){
      linear_extrude(r2/fn+0.01){
        offset(n2*sqrt(sq(r2)-sq((i+1)/fn*r2))-n2*r2){
          children();
        }
      }
    }
  }
}

function sq(x)=x*x;

extrudeWithRadius-rounds-top-and-bottom-differently (fixed)

varalgit avatar Jan 05 '23 02:01 varalgit

I closed this issue, but the code has not changed so it probably should stay open. Sorry about this.

varalgit avatar Jan 05 '23 02:01 varalgit

You can also change it the other way round, which I like better:

$fn=72;

extrudeWithRadius(5,r1=2,r2=2,fn=10)
  offset(r = 5) 
    offset(delta = -5)  
      polygon([[0,0],[20,0],[20,20]]);


module extrudeWithRadius(length,r1=0,r2=0,fn=30){
  n1=sign(r1);n2=sign(r2);
  r1=abs(r1);r2=abs(r2);
 # translate([0,0,r1]){
    linear_extrude(length-r1-r2){
      children();
    }
  }
  for(i=[0:fn-1]){
    color(c=[0,(i+1)/fn,0])
    translate([0,0,i/fn*r1]){
      linear_extrude(r1/fn+0.01){
        offset(n1*sqrt(sq(r1)-sq(r1-(i+1)/fn*r1))-n1*r1){
          children();
        }
      }
    }
    color(c=[0,(fn-i)/fn,0])
    translate([0,0,length-r2+i/fn*r2]){
      linear_extrude(r2/fn+0.01){
        offset(n2*sqrt(sq(r2)-sq(i/fn*r2))-n2*r2){
          children();
        }
      }
    }
  }
}

function sq(x)=x*x;

extrudeWithRadius-rounds-top-and-bottom-differently-(fixed-better)

varalgit avatar Jan 06 '23 20:01 varalgit