Skip to content

Instantly share code, notes, and snippets.


Hans Loeblich thehans

View GitHub Profile
thehans / radix_sort.scad
Last active Jan 6, 2021
OpenSCAD radix sort implementation
View radix_sort.scad
// LSD Radix sort (stable)
// base: should be a power of two, otherwise exit condition (d==m) might not be reached.
// key: 3 possible types
// - number (vector index into each element)
// - function (takes element and returns the key value)
// - undef (elements are used directly as the key)
// key values need not be integers, but will be treated as integers via floor()
// e.g. [1.5, 1, 1.2] is considered sorted since they are all same key after floor
function radix_sort(v,base=4,key) = key==undef ?
_rs(v,1,pow(base,-floor(log(max(v))/log(base))),base) :
thehans / rounded_poly_disk.scad
Last active Dec 30, 2020
OpenSCAD Rounded poly disk example. Different radii for xy vs z
View rounded_poly_disk.scad
n = 8;
height = 40;
width = 50; // distance across flats of polygon (when n is even)
rxy = 8;
rz = 3;
width2 = 30;
rxy2 = rxy*width2/width;
rz2 = 0.1; // small but nonzero
thehans / chamfer_extrude.scad
Created Jul 18, 2020
OpenSCAD example of one way to chamfer when extruding a 2D profile
View chamfer_extrude.scad
// example usage
chamfer_extrude(height=10,ch1=-3,ch2=3) {
hull() {
translate([-10,0]) circle(5, $fn=64);
translate([10,0]) circle(5, $fn=64);
thehans / complex_transform.scad
Created Jun 22, 2020
OpenSCAD demo of transformation using complex numbers
View complex_transform.scad
// Demo of using complex numbers to map one 2D point to another.
// Performs rotate and/or scale transform in one operation, without any
// transcendental (trigonometric) functions nor irrational numbers*.
// *please ignore the circular input data
// Enable animation for demo!
// multiply complex numbers
function cmul(c1,c2) = let(a=c1[0],b=c1[1],c=c2[0],d=c2[1])
[a*c-b*d, a*d+b*c];
View pipe_demo.scad
// Pipe library demonstrating a concept of chained operations
$fn = 72; // define exact number of fragments in curves
// using $fs instead would cause some mismatched # of edges during tapers
echo(str("For best results, all angles should be multiples of ", 360/$fn, " degrees"));
in = 25.4;
// Example of how to use pipe
// Note that all calls are chained (there's only one semicolon, at the end)
# If the design does not create a "sync" clock domain, it is created by the nMigen build system
# using the platform default clock (and default reset, if any).
from nmigen import *
from nmigen_boards.de10_nano import *
class Blinky(Elaboratable):
def elaborate(self, platform):
leds = Array(platform.request("led", i) for i in range(0,8))
thehans / L_system.scad
Last active Jan 12, 2020
L-system implementation in OpenSCAD
View L_system.scad
/* L-system OpenSCAD library by Hans Loeblich
Version 2.0
- Now supports "M" move without draw
- Also support position save "[" and restore "]"
- Core functions have been completely rewritten and are about twice as fast using half the memory from before.
- Rules now take the form of a single string per rule: "X=ABC"
- Added new examples to demonstrate added features
This library is for creating L-systems, aka Lindenmayer System,
thehans / rotate_about.scad
Created Nov 24, 2019
OpenSCAD example for rotating about arbitrary pivot point
View rotate_about.scad
module rotate_about(a, v, p=[0,0,0]) {
translate(p) rotate(a,v) translate(-p) children();
// example usage
thehans / fillet_extrude.scad
Created Nov 24, 2019
OpenSCAD example of particular way to fillet when extruding a 2D profile
View fillet_extrude.scad
// example usage
fillet_extrude(height=10,r1=3,r2=-3) {
hull() {
translate([-10,0]) circle(5);
translate([10,0]) circle(5);
rotate(90) hull() {
thehans / rotate_extrude3D.scad
Created Nov 23, 2019
Example of creating a cutout for a 3D object which is pivoting around the origin.
View rotate_extrude3D.scad
module rotate_extrude3D(clearance, bounds=[1000,1000]) {
intersection() { // clip to positive x axis before rotate_extrude
translate([0,-bounds[1]/2]) square(bounds);
offset(delta=clearance) // add clearance to profile
union() for(a=[-90:$fa:90]) // union projections from multiple angles
projection() rotate([-90,a]) children();