Skip to content

Instantly share code, notes, and snippets.

@groovenectar
Last active April 13, 2025 17:50
Show Gist options
  • Save groovenectar/292db1688b79efd6ce11 to your computer and use it in GitHub Desktop.
Save groovenectar/292db1688b79efd6ce11 to your computer and use it in GitHub Desktop.
// More information: https://danielupshaw.com/openscad-rounded-corners/
module roundedcube_simple(size = [1, 1, 1], center = false, radius = 0.5) {
// If single value, convert to [x, y, z] vector
size = (size[0] == undef) ? [size, size, size] : size;
translate = (center == false) ?
[radius, radius, radius] :
[
radius - (size[0] / 2),
radius - (size[1] / 2),
radius - (size[2] / 2)
];
translate(v = translate)
minkowski() {
cube(size = [
size[0] - (radius * 2),
size[1] - (radius * 2),
size[2] - (radius * 2)
]);
sphere(r = radius);
}
}
@groovenectar
Copy link
Author

groovenectar commented Aug 2, 2021

I am wondering about how to convert this to roundedcylinder_simple.

Thoughts?

It's been a long while since I've worked on this...

I would think that a rounded cylinder could also involve the minkowski transform:

https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/The_OpenSCAD_Language#minkowski

So I guess you would take a cylinder, and then add another cylinder (or perhaps a sphere) on a perpendicular axis along the edge, then apply a minkowski transformation to the whole thing? Actually I wonder if I could have used a cylinder or two for this rather than a sphere, now that I'm digging back in a little bit... I hope/wish I can get back into printing and designing within the next few years!

@daSpud46
Copy link

daSpud46 commented Aug 2, 2021 via email

@groovenectar
Copy link
Author

Thank you for sharing!!

@RobG73
Copy link

RobG73 commented Apr 13, 2025

Thanks to grovenectar for the roundedcube_simple() and roundedcube() modules - they helped me a lot, and enabled me to understand the minkowski operation!

Thanks to daSpud46 for the roundedcylinder_simple() module. However, I think that there is a mistake in the code.

Because he copied the translate part from grovenectar's roundedcube_simple() module, he assumed that the true/false choice affects cylinder in exactly the same way as it affects the position of cube(). But it doesn't!

In cube(), "true" locates the center of the cube at [0,0,0], and "false" locates the lower bottom corner at [0,0,0]. But with cylinder(), "true" only affects the z-position of the cylinder; Whether "true" or "false", the x-center and y-center of the cylinder() is always at [0,0].

So here is my modified code:

module roundedcylinder_simple(size = [1, 1, 1], center = false, radius = 0.5) {
   // If single value, convert to [x, y, z] vector
   size = (size[0] == undef) ? [size, size, size] : size;
  
   // roundedcylinder_simple(size = [height, bottom_radius, top_radius], center = false, radius);

   translate = (center == false) ?
               [0, 0, radius] :
               [0, 0, radius-size[0]/2];
                       
   translate(v = translate)
       minkowski() {
           cylinder(h = size[0] - (radius * 2),
                    r1= size[1] - (radius * 2),
                    r2 = size[2] - (radius * 2)
           );
           sphere(r = radius);
        }
}


$fs = 0.01;
$fn = 60;
roundedcylinder_simple(size=[8,5,5], center=false, radius=1);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment