From 5d39aa71dda9181e55417b48e6ffafabb0eb25ff Mon Sep 17 00:00:00 2001 From: clifford Date: Fri, 22 Jan 2010 14:28:17 +0000 Subject: [PATCH] Clifford Wolf: Added spring() to example20 Improved generated linear_extrude + twist 3d grid git-svn-id: http://svn.clifford.at/openscad/trunk@336 b57f626f-c46c-0410-a088-ec61d464b74c --- dxflinextrude.cc | 68 +++++++++++++++++++++++++++++----------- dxftess-glu.cc | 1 + examples/example020.scad | 37 ++++++++++++++++++++++ 3 files changed, 87 insertions(+), 19 deletions(-) diff --git a/dxflinextrude.cc b/dxflinextrude.cc index 7e0c2c6b..7a5b5883 100644 --- a/dxflinextrude.cc +++ b/dxflinextrude.cc @@ -144,26 +144,56 @@ static void add_slice(PolySet *ps, DxfData::Path *pt, double rot1, double rot2, double kx2 = pt->points[k]->x * cos(rot2*M_PI/180) + pt->points[k]->y * sin(rot2*M_PI/180); double ky2 = pt->points[k]->x * -sin(rot2*M_PI/180) + pt->points[k]->y * cos(rot2*M_PI/180); - ps->append_poly(); - if (pt->is_inner) { - ps->append_vertex(kx1, ky1, h1); - ps->append_vertex(jx1, jy1, h1); - ps->append_vertex(jx2, jy2, h2); - } else { - ps->insert_vertex(kx1, ky1, h1); - ps->insert_vertex(jx1, jy1, h1); - ps->insert_vertex(jx2, jy2, h2); - } + double dia1_len_sq = (jy1-ky2)*(jy1-ky2) + (jx1-kx2)*(jx1-kx2); + double dia2_len_sq = (jy2-ky1)*(jy2-ky1) + (jx2-kx1)*(jx2-kx1); - ps->append_poly(); - if (pt->is_inner) { - ps->append_vertex(kx2, ky2, h2); - ps->append_vertex(kx1, ky1, h1); - ps->append_vertex(jx2, jy2, h2); - } else { - ps->insert_vertex(kx2, ky2, h2); - ps->insert_vertex(kx1, ky1, h1); - ps->insert_vertex(jx2, jy2, h2); + if (dia1_len_sq > dia2_len_sq) + { + ps->append_poly(); + if (pt->is_inner) { + ps->append_vertex(kx1, ky1, h1); + ps->append_vertex(jx1, jy1, h1); + ps->append_vertex(jx2, jy2, h2); + } else { + ps->insert_vertex(kx1, ky1, h1); + ps->insert_vertex(jx1, jy1, h1); + ps->insert_vertex(jx2, jy2, h2); + } + + ps->append_poly(); + if (pt->is_inner) { + ps->append_vertex(kx2, ky2, h2); + ps->append_vertex(kx1, ky1, h1); + ps->append_vertex(jx2, jy2, h2); + } else { + ps->insert_vertex(kx2, ky2, h2); + ps->insert_vertex(kx1, ky1, h1); + ps->insert_vertex(jx2, jy2, h2); + } + } + else + { + ps->append_poly(); + if (pt->is_inner) { + ps->append_vertex(kx1, ky1, h1); + ps->append_vertex(jx1, jy1, h1); + ps->append_vertex(kx2, ky2, h2); + } else { + ps->insert_vertex(kx1, ky1, h1); + ps->insert_vertex(jx1, jy1, h1); + ps->insert_vertex(kx2, ky2, h2); + } + + ps->append_poly(); + if (pt->is_inner) { + ps->append_vertex(jx2, jy2, h2); + ps->append_vertex(kx2, ky2, h2); + ps->append_vertex(jx1, jy1, h1); + } else { + ps->insert_vertex(jx2, jy2, h2); + ps->insert_vertex(kx2, ky2, h2); + ps->insert_vertex(jx1, jy1, h1); + } } } } diff --git a/dxftess-glu.cc b/dxftess-glu.cc index 57eb7041..9e5f5308 100644 --- a/dxftess-glu.cc +++ b/dxftess-glu.cc @@ -95,6 +95,7 @@ static void STDCALL tess_end(void) static void STDCALL tess_error(GLenum errno) { + fprintf(stderr, "GLU tesselation error %s", gluErrorString(errno)); PRINTF("GLU tesselation error %s", gluErrorString(errno)); } diff --git a/examples/example020.scad b/examples/example020.scad index 83229399..e008f0bc 100644 --- a/examples/example020.scad +++ b/examples/example020.scad @@ -32,8 +32,45 @@ module nut(type = 2, r1 = 16, r2 = 21, r3 = 30, s = 6, n = 7, h = 100/5, t = 8/5 } } +module spring(r1 = 100, r2 = 10, h = 100, hr = 12) +{ + stepsize = 1/16; + module segment(i1, i2) { + alpha1 = i1 * 360*r2/hr; + alpha2 = i2 * 360*r2/hr; + len1 = sin(acos(i1*2-1))*r2; + len2 = sin(acos(i2*2-1))*r2; + if (len1 < 0.01) + polygon([ + [ cos(alpha1)*r1, sin(alpha1)*r1 ], + [ cos(alpha2)*(r1-len2), sin(alpha2)*(r1-len2) ], + [ cos(alpha2)*(r1+len2), sin(alpha2)*(r1+len2) ] + ]); + if (len2 < 0.01) + polygon([ + [ cos(alpha1)*(r1+len1), sin(alpha1)*(r1+len1) ], + [ cos(alpha1)*(r1-len1), sin(alpha1)*(r1-len1) ], + [ cos(alpha2)*r1, sin(alpha2)*r1 ], + ]); + if (len1 >= 0.01 && len2 >= 0.01) + polygon([ + [ cos(alpha1)*(r1+len1), sin(alpha1)*(r1+len1) ], + [ cos(alpha1)*(r1-len1), sin(alpha1)*(r1-len1) ], + [ cos(alpha2)*(r1-len2), sin(alpha2)*(r1-len2) ], + [ cos(alpha2)*(r1+len2), sin(alpha2)*(r1+len2) ] + ]); + } + linear_extrude(height = 100, twist = 180*h/hr, + $fn = (hr/r2)/stepsize, convexity = 5) { + for (i = [ stepsize : stepsize : 1+stepsize/2 ]) + segment(i-stepsize, min(i, 1)); + } +} + translate([ -30, 0, 0 ]) screw(); translate([ 30, 0, 0 ]) nut(); + +spring();