diff --git a/shapes.scad b/shapes.scad index 130607d..16b970d 100644 --- a/shapes.scad +++ b/shapes.scad @@ -1207,23 +1207,16 @@ function spheroid(r, d, circum=false, style="aligned", anchor=CENTER, spin=0, or for (j=[0:1:hsides-1]) let(theta = (j+((stagger && i%2!=0)?0.5:0))*360/hsides) spherical_to_xyz(rr, theta, phi), spherical_to_xyz(rr, 0, 180) - ] : style=="octa"? [ - for (tb=[0,1], i=[0:1:3]) let( - theta0 = (i+0.5)*360/4, - theta1 = (i+1.0)*360/4, - theta2 = (i+0.0)*360/4, - phi0 = tb? 0 : 180, - phi1 = 90 - ) - for (k = [0:1:octa_steps]) let( - u = k/octa_steps, - phi = lerp(phi0, phi1, u) - ) - for (l = [0:1:k]) let( - v = k? l/k : 0, - theta = lerp(theta1, theta2, v), - pt = spherical_to_xyz(rr,theta,phi) - ) pt + ] : style=="octa"? let( + meridians = [ + 1, + for (i = [1:1:octa_steps]) i*4, + for (i = [octa_steps-1:-1:1]) i*4, + 1, + ] + ) [ + for (i=idx(meridians), j=[0:1:meridians[i]-1]) + spherical_to_xyz(rr, j*360/meridians[i], i*180/(len(meridians)-1)) ] : style=="icosa"? [ for (tb=[0,1], j=[0,2], i = [0:1:4]) let( theta0 = i*360/5, @@ -1250,7 +1243,7 @@ function spheroid(r, d, circum=false, style="aligned", anchor=CENTER, spin=0, or v = k? l/k : 0, pt = rot(ang2*v, v=ax2, p=vv0) * rr * (tb? -1 : 1) ) pt - ] : assert(in_list(style,["orig","aligned","stagger","icosa"])), + ] : assert(in_list(style,["orig","aligned","stagger","octa","icosa"])), lv = len(verts), faces = style=="orig"? [ [for (i=[0:1:hsides-1]) hsides-i-1], @@ -1278,24 +1271,38 @@ function spheroid(r, d, circum=false, style="aligned", anchor=CENTER, spin=0, or ] ) ] : style=="octa"? let( - pyr = [for (x=[0:1:octa_steps+1]) x], - tri = sum(pyr), - soff = cumsum(pyr) + meridians = [ + 0, 1, + for (i = [1:1:octa_steps]) i*4, + for (i = [octa_steps-1:-1:1]) i*4, + 1, + ], + offs = cumsum(meridians), + pc = select(offs,-1)-1, + os = octa_steps * 2 ) [ - for (tb=[0,1], j=[0,1], i = [0:1:3]) let( - base = ((((tb*2) + j) * 4) + i) * tri + for (i=[0:1:3]) [0, 1+(i+1)%4, 1+i], + for (i=[0:1:3]) [pc-0, pc-(1+(i+1)%4), pc-(1+i)], + for (i=[1:1:octa_steps-1]) let( + m = meridians[i+2]/4 ) - for (k = [0:1:octa_steps-1]) - for (l = [0:1:k]) let( - v1 = base + soff[k] + l, - v2 = base + soff[k+1] + l, - v3 = base + soff[k+1] + (l + 1), - faces = [ - if(l>0) [v1-1,v1,v2], - [v1,v3,v2], - ], - faces2 = (tb+j)%2? [for (f=faces) reverse(f)] : faces - ) each faces2 + for (j=[0:1:3], k=[0:1:m-1]) let( + m1 = meridians[i+1], + m2 = meridians[i+2], + p1 = offs[i+0] + (j*m1/4 + k+0) % m1, + p2 = offs[i+0] + (j*m1/4 + k+1) % m1, + p3 = offs[i+1] + (j*m2/4 + k+0) % m2, + p4 = offs[i+1] + (j*m2/4 + k+1) % m2, + p5 = offs[os-i+0] + (j*m1/4 + k+0) % m1, + p6 = offs[os-i+0] + (j*m1/4 + k+1) % m1, + p7 = offs[os-i-1] + (j*m2/4 + k+0) % m2, + p8 = offs[os-i-1] + (j*m2/4 + k+1) % m2 + ) each [ + [p1, p4, p3], + if (k<m-1) [p1, p2, p4], + [p5, p7, p8], + if (k<m-1) [p5, p8, p6], + ], ] : style=="icosa"? let( pyr = [for (x=[0:1:icosa_steps+1]) x], tri = sum(pyr), diff --git a/version.scad b/version.scad index b62d052..21d2955 100644 --- a/version.scad +++ b/version.scad @@ -8,7 +8,7 @@ ////////////////////////////////////////////////////////////////////// -BOSL_VERSION = [2,0,368]; +BOSL_VERSION = [2,0,369]; // Section: BOSL Library Version Functions