Skip to content

Commit 11b801e

Browse files
committed
added error check for 'uniform' parameter, reformatted some code
1 parent eb66ba3 commit 11b801e

File tree

3 files changed

+67
-58
lines changed

3 files changed

+67
-58
lines changed

beziers.scad

+26-27
Original file line numberDiff line numberDiff line change
@@ -634,7 +634,7 @@ function path_to_bezpath(path, closed, tangents, uniform=false, size, relsize) =
634634
second + L*tangent2
635635
],
636636
select(path,lastpt)
637-
];
637+
];
638638

639639

640640

@@ -666,30 +666,31 @@ function path_to_bezpath(path, closed, tangents, uniform=false, size, relsize) =
666666
function path_to_bezcornerpath(path, closed, size, relsize) =
667667
is_1region(path) ? path_to_bezcornerpath(path[0], default(closed,true), tangents, size, relsize) :
668668
let(closed=default(closed,false))
669-
assert(is_bool(closed))
670-
assert(num_defined([size,relsize])<=1, "Can't define both size and relsize")
671-
assert(is_path(path,[2,3]),"Input path is not a valid 2d or 3d path")
672-
let(
673-
curvesize = first_defined([size,relsize,0.5]),
674-
relative = is_undef(size),
675-
pathlen = len(path)
669+
assert(is_bool(closed))
670+
assert(num_defined([size,relsize])<=1, "Can't define both size and relsize")
671+
assert(is_path(path,[2,3]),"Input path is not a valid 2d or 3d path")
672+
let(
673+
curvesize = first_defined([size,relsize,0.5]),
674+
relative = is_undef(size),
675+
pathlen = len(path)
676+
)
677+
assert(is_num(curvesize) || len(curvesize)==pathlen, str("Size or relsize must have length ",pathlen))
678+
let(sizevect = is_num(curvesize) ? repeat(curvesize, pathlen) : curvesize)
679+
assert(min(sizevect)>0, "Size or relsize must be greater than zero")
680+
let(
681+
roundpath = closed ? [
682+
for(i=[0:pathlen-1]) let(p3=select(path,[i-1:i+1]))
683+
_bez_path_corner([0.5*(p3[0]+p3[1]), p3[1], 0.5*(p3[1]+p3[2])], sizevect[i], relative),
684+
[0.5*(path[0]+path[pathlen-1])]
685+
]
686+
: [ for(i=[1:pathlen-2]) let(p3=select(path,[i-1:i+1]))
687+
_bez_path_corner(
688+
[i>1?0.5*(p3[0]+p3[1]):p3[0], p3[1], i<pathlen-2?0.5*(p3[1]+p3[2]):p3[2]],
689+
sizevect[i], relative),
690+
[path[pathlen-1]]
691+
]
676692
)
677-
assert(is_num(curvesize) || len(curvesize)==pathlen, str("Size or relsize must have length ",pathlen))
678-
let(sizevect = is_num(curvesize) ? repeat(curvesize, pathlen) : curvesize)
679-
assert(min(sizevect)>0, "Size or relsize must be greater than zero")
680-
let(
681-
roundpath = closed ? [
682-
for(i=[0:pathlen-1]) let(p3=select(path,[i-1:i+1]))
683-
_bez_path_corner([0.5*(p3[0]+p3[1]), p3[1], 0.5*(p3[1]+p3[2])], sizevect[i], relative),
684-
[0.5*(path[0]+path[pathlen-1])]
685-
]
686-
: [ for(i=[1:pathlen-2]) let(p3=select(path,[i-1:i+1]))
687-
_bez_path_corner(
688-
[i>1?0.5*(p3[0]+p3[1]):p3[0], p3[1], i<pathlen-2?0.5*(p3[1]+p3[2]):p3[2]],
689-
sizevect[i], relative),
690-
[path[pathlen-1]]
691-
]
692-
) flatten(roundpath);
693+
flatten(roundpath);
693694

694695

695696
/// Internal function: _bez_path_corner()
@@ -743,9 +744,7 @@ let(
743744
// bz6 is p3
744745
bz3 = p2 + middir * bzdist, // center control point
745746
bz2 = bz3 + midto12unit*(d1<d3 ? cornerlegmin : cornerlegmax),
746-
bz1 = p1 - (d1<=d3 ? leglenmin :
747-
leglenmax)*p21unit,
748-
//norm(0.333*(bz2-p1)))*p21unit,
747+
bz1 = p1 - (d1<=d3 ? leglenmin : leglenmax)*p21unit,
749748
bz4 = bz3 - midto12unit*(d3<d1 ? cornerlegmin : cornerlegmax),
750749
bz5 = p3 - (d3<=d1 ? leglenmin : leglenmax)*p23unit
751750
) [p1, bz1, bz2, bz3, bz4, bz5]; // do not include last control point

rounding.scad

+13-11
Original file line numberDiff line numberDiff line change
@@ -735,18 +735,20 @@ function _rounding_offsets(edgespec,z_dir=1) =
735735
// pts = [[-3.3, 1.7], [-3.7, -2.2], [3.8, -4.8], [-0.9, -2.4]];
736736
// stroke(smooth_path(pts, uniform=false, relsize=0.1),width=.1);
737737
// color("red")move_copies(pts)circle(r=.15,$fn=12);
738-
module smooth_path(path, tangents, size, relsize, method="edges", splinesteps=10, uniform=false, closed=false) {no_module();}
739-
function smooth_path(path, tangents, size, relsize, method="edges", splinesteps=10, uniform=false, closed) =
740-
is_1region(path) ? smooth_path(path[0], tangents, size, relsize, method, splinesteps, uniform, default(closed,true)) :
741-
assert(method=="edges" || method=="corners", "method must be \"edges\" or \"corners\".")
742-
assert(method=="edges" || is_undef(tangent), "The tangents parameter is incompatible with method=\"corners\".")
743-
let (
744-
bez = method=="edges" ?
745-
path_to_bezpath(path, tangents=tangents, size=size, relsize=relsize, uniform=uniform, closed=default(closed,false))
738+
module smooth_path(path, tangents, size, relsize, method="edges", splinesteps=10, uniform, closed=false) {no_module();}
739+
function smooth_path(path, tangents, size, relsize, method="edges", splinesteps=10, uniform, closed) =
740+
is_1region(path)
741+
? smooth_path(path[0], tangents, size, relsize, method, splinesteps, uniform, default(closed,true))
742+
: assert(method=="edges" || method=="corners", "method must be \"edges\" or \"corners\".")
743+
assert(method=="edges" || (is_undef(tangents) && is_undef(uniform)), "The tangents and uniform parameters are incompatible with method=\"corners\".")
744+
let (
745+
uniform = default(uniform,false),
746+
bez = method=="edges"
747+
? path_to_bezpath(path, tangents=tangents, size=size, relsize=relsize, uniform=uniform, closed=default(closed,false))
746748
: path_to_bezcornerpath(path, size=size, relsize=relsize, closed=default(closed,false)),
747-
smoothed = bezpath_curve(bez,splinesteps=splinesteps)
748-
)
749-
closed ? list_unwrap(smoothed) : smoothed;
749+
smoothed = bezpath_curve(bez,splinesteps=splinesteps)
750+
)
751+
closed ? list_unwrap(smoothed) : smoothed;
750752

751753

752754

shapes2d.scad

+28-20
Original file line numberDiff line numberDiff line change
@@ -1854,15 +1854,17 @@ function _squircle_fg(size, squareness) = [
18541854
) p*[cos(theta), aspect*sin(theta)]
18551855
];
18561856

1857-
function squircle_radius_fg(squareness, r, angle) = let(
1858-
s2a = abs(squareness*sin(2*angle))
1859-
) s2a>0 ? r*sqrt(2)/s2a * sqrt(1 - sqrt(1 - s2a*s2a)) : r;
1857+
function squircle_radius_fg(squareness, r, angle) =
1858+
let(
1859+
s2a = abs(squareness*sin(2*angle))
1860+
)
1861+
s2a>0 ? r*sqrt(2)/s2a * sqrt(1 - sqrt(1 - s2a*s2a)) : r;
18601862

18611863
function _linearize_squareness(s) =
18621864
// from Chamberlain Fong (2016). "Squircular Calculations". arXiv.
18631865
// https://arxiv.org/pdf/1604.02174v5
18641866
let(c = 2 - 2*sqrt(2), d = 1 - 0.5*c*s)
1865-
2 * sqrt((1+c)*s*s - c*s) / (d*d);
1867+
2 * sqrt((1+c)*s*s - c*s) / (d*d);
18661868

18671869

18681870
/* Superellipse squircle functions */
@@ -1884,27 +1886,33 @@ function _squircle_se(size, squareness) = [
18841886
) [ra*x, rb*y] / r
18851887
];
18861888

1887-
function squircle_radius_se(n, r, angle) = let(
1888-
x = cos(angle),
1889-
y = sin(angle)
1890-
) (abs(x)^n + abs(y)^n)^(1/n) / r;
1889+
function squircle_radius_se(n, r, angle) =
1890+
let(
1891+
x = cos(angle),
1892+
y = sin(angle)
1893+
)
1894+
(abs(x)^n + abs(y)^n)^(1/n) / r;
18911895

1892-
function _squircle_se_exponent(squareness) = let(
1893-
// limit squareness; error if >0.99889, limit is smaller for r>1
1894-
s=min(0.998,squareness),
1895-
rho = 1 + s*(sqrt(2)-1),
1896-
x = rho / sqrt(2)
1897-
) log(0.5) / log(x);
1896+
function _squircle_se_exponent(squareness) =
1897+
let(
1898+
// limit squareness; error if >0.99889, limit is smaller for r>1
1899+
s=min(0.998,squareness),
1900+
rho = 1 + s*(sqrt(2)-1),
1901+
x = rho / sqrt(2)
1902+
)
1903+
log(0.5) / log(x);
18981904

18991905

19001906
/* Bezier squircle function */
19011907

1902-
function _squircle_bz(size, squareness) = let(
1903-
splinesteps = $fn>=12 ? round($fn/4) : 10,
1904-
size = is_num(size) ? [size,size] : point2d(size),
1905-
sq = square(size, center=true),
1906-
bez = path_to_bezcornerpath(sq, relsize=1-squareness, closed=true)
1907-
) bezpath_curve(bez, splinesteps=splinesteps);
1908+
function _squircle_bz(size, squareness) =
1909+
let(
1910+
splinesteps = $fn>=12 ? round($fn/4) : 10,
1911+
size = is_num(size) ? [size,size] : point2d(size),
1912+
sq = square(size, center=true),
1913+
bez = path_to_bezcornerpath(sq, relsize=1-squareness, closed=true)
1914+
)
1915+
bezpath_curve(bez, splinesteps=splinesteps);
19081916

19091917

19101918

0 commit comments

Comments
 (0)