From 5c27b0651d741de4d1fb44ddd6d968a2ddab239f Mon Sep 17 00:00:00 2001 From: tessaK9 Date: Mon, 6 Apr 2026 02:12:12 +0200 Subject: [PATCH] rounded off the intersections of ears and headbands --- scad/base/bezier_extrusion.scad | 11 +++++++++-- scad/base/dogear.scad | 17 +++++++++++++++++ stl/dogears.stl | Bin 405884 -> 416284 bytes 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/scad/base/bezier_extrusion.scad b/scad/base/bezier_extrusion.scad index ffbb8c1..95b8bf2 100644 --- a/scad/base/bezier_extrusion.scad +++ b/scad/base/bezier_extrusion.scad @@ -1,4 +1,5 @@ // extrusion takes a list of polygons (list of points in 3d space) and connects these into one big polyeder + module extrusion(points){ //points[0] must have its points ordered clockwise n = len(points); @@ -9,6 +10,12 @@ module extrusion(points){ polyhedron(points = points_new, faces = faces, convexity = 10); } +//angl_to_ctrl converts a start point, outgoing angle, end point and ingoing angle to control points for a bezier extrusion. to use angl_to_ctrl this file needs to be included, not just used + +function angl_to_ctrl (p0, a0, p1, a1, mod = 1) = + let (dist = norm(p1-p0)) + [p0,p0+2/3*mod*dist*[cos(a0),sin(a0)],p1+2/3*mod*dist*[cos(a1),sin(a1)],p1]; + //ctrl is a list containing 4 control points of the bezier curve. shape is polygon in the 2d plane which is being extruded. mod is a function [0,1] -> |R scaling the shape, mod_x in the x-direction (of the shape), mod_y in the y-direction. if partial is true, then the polyeder is rendered in slices with length given by merlon and gap size given by gap, section defines the number of sections the bezier curve is broken into module bezier_extrude(ctrl, shape, mod = function (t) 1, mod_x = function(t) 1, mod_y = function (t) 1, partial = false, merlon = 1, gap = 1, sections = 128){ B_0 = ctrl[0]; @@ -36,8 +43,8 @@ module bezier_extrude(ctrl, shape, mod = function (t) 1, mod_x = function(t) 1, } //some thing to play around with -shape = [[0,0.5],[0.8,0],[0.5,-1],[-0.5,-1],[-0.8,0]]; +/*shape = [[0,0.5],[0.8,0],[0.5,-1],[-0.5,-1],[-0.8,0]]; ctrl = [[0,0],[0,20],[20,20],[20,0]]; wave1 = function (x) 0.75+0.25*cos(8*360*x); wave2 = function (x) 0.75+0.25*sin(8*360*x); -bezier_extrude(ctrl = ctrl, shape = shape, mod_x = wave1, mod_y = wave2, partial = true, merlon = 3, gap = 1, sections = 128); \ No newline at end of file +bezier_extrude(ctrl = angl_to_ctrl([-10,0],90,[10,0],90), shape = shape, mod_x = wave1, mod_y = wave2, partial = true, merlon = 3, gap = 1, sections = 128);*/ \ No newline at end of file diff --git a/scad/base/dogear.scad b/scad/base/dogear.scad index 9fbb113..88bf54e 100644 --- a/scad/base/dogear.scad +++ b/scad/base/dogear.scad @@ -1,9 +1,26 @@ use ; +include ; + +//these values were mostly determined by manually finetuning them +t = 5; +a = 41.186; //arctan(7/8) +mod = function (t) 12*t^2*(1-t)^2+1; +ctrl_0 = angl_to_ctrl([-30.5,0]+t*[1,0], 180, [-30.5,0]+t*[-cos(a-25),-sin(a-25)], a-25, mod = 0.5); +ctrl_1 = angl_to_ctrl([-23.6,7]+t*[1,0], 180, [-23.6,7]+t*[-cos(a+180), -sin(a+180)], a+180); +ctrl_2 = angl_to_ctrl([-8,37]+t*[1,0], 180, [-8.5,37]+t*[0,-1], 75, mod = 0.5); +ctrl_3 = angl_to_ctrl([-7.3,44]+t*[1,0], 180, [-7.3,44]+t*[0,1], 270, mod = 0.5); +rectangle_r = [[1.5,0],[1.5,6],[0,6],[0,0]]; +rectangle_l = [[0,0],[0,6],[-1.5,6],[-1.5,0]]; //a1, a2, a3, a4 are the four angles of the pairs of hinges on the ear from bottom to tip module dogearAllOptions(a1, a2, a3, a4){ translate([25,0,0]){ union(){ + bezier_extrude(ctrl = ctrl_0, shape = rectangle_r, sections = 8); + bezier_extrude(ctrl = ctrl_1, shape = rectangle_l, mod_x = mod, sections = 8); + bezier_extrude(ctrl = ctrl_2, shape = rectangle_r, mod_x = mod, sections = 8); + bezier_extrude(ctrl = ctrl_3, shape = rectangle_l, mod_x = mod, sections = 8); + //translate([-8,37,0]) cube([10,10,20]); linear_extrude(height = 6, center = false, convexity = 10){ polygon(points = [[-33,0],[-25,0],[-25,7]]); } diff --git a/stl/dogears.stl b/stl/dogears.stl index d5997032abc7ca85025b3aa5da9eb4bef84897a7..3eb7231ad8c1e3dace0da60cc5ba5ba9bef428b4 100644 GIT binary patch delta 22199 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 F1_1ndc>(|c delta 12866 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