diff --git a/pressfit_headband.scad b/pressfit_headband.scad index 2731c7a..f027969 100644 --- a/pressfit_headband.scad +++ b/pressfit_headband.scad @@ -18,6 +18,61 @@ module testblock_recepticle() { } } +module catear(height, thickness, fractal=0, side_len=30, bend_factor=0.5, stretch_factor=1.2, debug=false) { + $A=[0, side_len/2]; + $B=[0,-side_len/2]; + $C=[-(side_len/2/sin(120))*1.5*stretch_factor, 0]; + $c=sqrt(pow($A.x-$B.x, 2)+pow($A.y-$B.y, 2)); + $b=sqrt(pow($A.x-$C.x, 2)+pow($A.y-$C.y, 2)); + $a=sqrt(pow($C.x-$B.x, 2)+pow($C.y-$B.y, 2)); + $hc=-$C.x; + $alpha=asin($hc/$b); + $beta=$alpha; + $gamma=180-$alpha-$beta; + $delta=180*bend_factor; + $bend_radius=$a/(2*cos(90-$delta/2)); + $bend_offset=$bend_radius*sin(90-$delta/2); + + translate([0, -$c/2, 0]) + rotate($beta, [0, 0, 1]) + translate([0, $a/2, 0]) + translate([$bend_offset, 0, 0]) + color("#00ffff") partial_ring( + part=$delta/360, + radius=$bend_radius, + thickness=thickness, + height=height + ); + translate([0, $c/2, 0]) + rotate(-$alpha, [0, 0, 1]) + translate([0, -$b/2, 0]) + translate([$bend_offset, 0, 0]) + color("#ff00ff") partial_ring( + part=$delta/360, + radius=$bend_radius, + thickness=thickness, + height=height + ); + translate($A) color("#aaaaaa") cylinder(h=height, d=thickness, center=true); + translate($B) color("#bbbbbb") cylinder(h=height, d=thickness, center=true); + translate($C) color("#cccccc") cylinder(h=height, d=thickness, center=true); + + if (debug) { + echo("A", $A, "a", $a, "alpha", $alpha); + echo("B", $B, "b", $b, "beta ", $beta); + echo("C", $C, "c", $c, "gamma", $gamma); + echo("bend_factor", bend_factor); + echo("delta:", $delta); + echo("bend_radius", $bend_radius); + echo("bend_offset", $bend_offset); + color("#000000") cylinder(h=4, d=4); + translate($C/2) color("red") cube([$hc, thickness, height*1.1], center=true); + color("red") cube([thickness, $c, height*1.1], center=true); + color("red")translate([0, $c/2, 0]) rotate(-$alpha, [0, 0, 1]) translate([0, -$b/2, 0]) cube([thickness, $b, height*1.1], center=true); + color("red")translate([0, -$c/2, 0]) rotate($beta, [0, 0, 1]) translate([0, $a/2, 0]) cube([thickness, $a, height*1.1], center=true); + } +} + module partial_ring(part, radius, thickness, height) { rotate(180-180*part, [0, 0, 1]) rotate_extrude(angle=360*part) @@ -92,4 +147,41 @@ module pressfit_headband(size=60, height=4.6, thickness=3, part=0.7, stretch_len }; } -pressfit_headband(); +module catear_headband(debug=false, size=60, height=4.6, thickness=3, part=0.7, stretch_len=40, tip_len=0.1, tip_bend=20, rake_depth=0.5, rake_width=0.5, rake_stretch=.5, ear_scale=1, ear_bend_factor=0.15, ear_stretch_factor=1.4, ear_angle=48) { + union() { + rotate( ear_angle, [0, 0, 1]) { + translate([-size, 0, 0]) catear( + debug=debug, + height=height, + thickness=thickness, + side_len=size/2*ear_scale, + bend_factor=ear_bend_factor, + stretch_factor=ear_stretch_factor + ); + } + rotate(-ear_angle, [0, 0, 1]) { + translate([-size, 0, 0]) catear( + debug=false, + height=height, + thickness=thickness, + side_len=size/2*ear_scale, + bend_factor=ear_bend_factor, + stretch_factor=ear_stretch_factor + ); + } + headband( + size=size, + height=height, + thickness=thickness, + part=part, + stretch_len=stretch_len, + tip_len=tip_len, + tip_bend=tip_bend, + rake_depth=rake_depth, + rake_width=rake_width, + rake_stretch=rake_stretch + ); + }; +} + +catear_headband();