From b518763d6f5e19da82518cd62a43a2d8666b8303 Mon Sep 17 00:00:00 2001
From: Garth Minette <gminette@gmail.com>
Date: Sun, 27 Dec 2020 21:48:16 -0800
Subject: [PATCH 01/22] Fixed shift handling for rect geometries.

---
 attachments.scad | 84 ++++++++++++++++++++++++------------------------
 version.scad     |  2 +-
 2 files changed, 43 insertions(+), 43 deletions(-)

diff --git a/attachments.scad b/attachments.scad
index 112f173..2c17410 100644
--- a/attachments.scad
+++ b/attachments.scad
@@ -91,7 +91,7 @@ $tags_hidden = [];
 
 // Function: anchorpt()
 // Usage:
-//   anchor(name, pos, [dir], [rot])
+//   anchor(name, pos, <dir>, <rot>)
 // Description:
 //   Creates a anchor data structure.
 // Arguments:
@@ -105,21 +105,21 @@ function anchorpt(name, pos=[0,0,0], orient=UP, spin=0) = [name, pos, orient, sp
 // Function: attach_geom()
 //
 // Usage: Square/Trapezoid Geometry
-//   geom = attach_geom(anchor, spin, [orient], two_d, size, [size2], [shift], [cp], [offset], [anchors]);
+//   geom = attach_geom(anchor, spin, two_d, size, <size2>, <shift>, <cp>, <offset>, <anchors>);
 // Usage: Circle/Oval Geometry
-//   geom = attach_geom(anchor, spin, [orient], two_d, r|d, [cp], [offset], [anchors]);
+//   geom = attach_geom(anchor, spin, two_d, r|d, <cp>, <offset>, <anchors>);
 // Usage: 2D Path/Polygon Geometry
-//   geom = attach_geom(anchor, spin, [orient], two_d, path, [extent], [cp], [offset], [anchors]);
+//   geom = attach_geom(anchor, spin, two_d, path, <extent>, <cp>, <offset>, <anchors>);
 // Usage: Cubical/Prismoidal Geometry
-//   geom = attach_geom(anchor, spin, [orient], size, [size2], [shift], [cp], [offset], [anchors]);
+//   geom = attach_geom(anchor, spin, <orient>, size, <size2>, <shift>, <cp>, <offset>, <anchors>);
 // Usage: Cylindrical Geometry
-//   geom = attach_geom(anchor, spin, [orient], r|d, l, [cp], [axis], [offset], [anchors]);
+//   geom = attach_geom(anchor, spin, <orient>, r|d, l, <cp>, <axis>, <offset>, <anchors>);
 // Usage: Conical Geometry
-//   geom = attach_geom(anchor, spin, [orient], r1|d1, r2|d2, l, [cp], [axis], [offset], [anchors]);
+//   geom = attach_geom(anchor, spin, <orient>, r1|d1, r2|d2, l, <cp>, <axis>, <offset>, <anchors>);
 // Usage: Spheroid/Ovoid Geometry
-//   geom = attach_geom(anchor, spin, [orient], r|d, [cp], [offset], [anchors]);
+//   geom = attach_geom(anchor, spin, <orient>, r|d, <cp>, <offset>, <anchors>);
 // Usage: VNF Geometry
-//   geom = attach_geom(anchor, spin, [orient], vnf, [extent], [cp], [offset], [anchors]);
+//   geom = attach_geom(anchor, spin, <orient>, vnf, <extent>, <cp>, <offset>, <anchors>);
 //
 // Description:
 //   Given arguments that describe the geometry of an attachable object, returns the internal geometry description.
@@ -332,8 +332,8 @@ function attach_geom_size(geom) =
         ) delt
     ) : type == "rect"? ( //size, size2
         let(
-            size=geom[1], size2=geom[2],
-            maxx = max(size.x,size2)
+            size=geom[1], size2=geom[2], shift=geom[3],
+            maxx = max(size.x,size2+abs(shift))
         ) [maxx, size.y]
     ) : type == "circle"? ( //r
         let( r=geom[1] )
@@ -349,7 +349,7 @@ function attach_geom_size(geom) =
 
 // Function: attach_transform()
 // Usage:
-//   mat = attach_transform(anchor=CENTER, spin=0, orient=UP, geom);
+//   mat = attach_transform(anchor, spin, orient, geom);
 // Description:
 //   Returns the affine3d transformation matrix needed to `anchor`, `spin`, and `orient`
 //   the given geometry `geom` shape into position.
@@ -557,12 +557,12 @@ function find_anchor(anchor, geom) =
             mpt = approx(point2d(anchor),[0,0])? [maxx,0,0] : [maxx, avgy, avgz],
             pos = point3d(cp) + rot(from=RIGHT, to=anchor, p=mpt)
         ) [anchor, pos, anchor, oang]
-    ) : type == "rect"? ( //size, size2
+    ) : type == "rect"? ( //size, size2, shift
         let(
-            size=geom[1], size2=geom[2],
+            size=geom[1], size2=geom[2], shift=geom[3],
             u = (anchor.y+1)/2,
             frpt = [size.x/2*anchor.x, -size.y/2],
-            bkpt = [size2/2*anchor.x,  size.y/2],
+            bkpt = [size2/2*anchor.x+shift,  size.y/2],
             pos = point2d(cp) + lerp(frpt, bkpt, u) + offset,
             vec = unit(rot(from=BACK, to=bkpt-frpt, p=anchor),[0,1])
         ) [anchor, pos, vec, 0]
@@ -629,21 +629,21 @@ function attachment_is_shown(tags) =
 // Function: reorient()
 //
 // Usage: Square/Trapezoid Geometry
-//   reorient(anchor, spin, [orient], two_d, size, [size2], [shift], [cp], [offset], [anchors], [p]);
+//   reorient(anchor, spin, <orient>, two_d, size, <size2>, <shift>, <cp>, <offset>, <anchors>, <p>);
 // Usage: Circle/Oval Geometry
-//   reorient(anchor, spin, [orient], two_d, r|d, [cp], [offset], [anchors], [p]);
+//   reorient(anchor, spin, <orient>, two_d, r|d, <cp>, <offset>, <anchors>, <p>);
 // Usage: 2D Path/Polygon Geometry
-//   reorient(anchor, spin, [orient], two_d, path, [extent], [cp], [offset], [anchors], [p]);
+//   reorient(anchor, spin, <orient>, two_d, path, <extent>, <cp>, <offset>, <anchors>, <p>);
 // Usage: Cubical/Prismoidal Geometry
-//   reorient(anchor, spin, [orient], size, [size2], [shift], [cp], [offset], [anchors], [p]);
+//   reorient(anchor, spin, <orient>, size, <size2>, <shift>, <cp>, <offset>, <anchors>, <p>);
 // Usage: Cylindrical Geometry
-//   reorient(anchor, spin, [orient], r|d, l, [offset], [axis], [cp], [anchors], [p]);
+//   reorient(anchor, spin, <orient>, r|d, l, <offset>, <axis>, <cp>, <anchors>, <p>);
 // Usage: Conical Geometry
-//   reorient(anchor, spin, [orient], r1|d1, r2|d2, l, [axis], [cp], [offset], [anchors], [p]);
+//   reorient(anchor, spin, <orient>, r1|d1, r2|d2, l, <axis>, <cp>, <offset>, <anchors>, <p>);
 // Usage: Spheroid/Ovoid Geometry
-//   reorient(anchor, spin, [orient], r|d, [cp], [offset], [anchors], [p]);
+//   reorient(anchor, spin, <orient>, r|d, <cp>, <offset>, <anchors>, <p>);
 // Usage: VNF Geometry
-//   reorient(anchor, spin, [orient], vnf, [extent], [cp], [offset], [anchors], [p]);
+//   reorient(anchor, spin, <orient>, vnf, <extent>, <cp>, <offset>, <anchors>, <p>);
 //
 // Description:
 //   Given anchor, spin, orient, and general geometry info for a managed volume, this calculates
@@ -723,21 +723,21 @@ function reorient(
 // Module: attachable()
 //
 // Usage: Square/Trapezoid Geometry
-//   attachable(anchor, spin, [orient], two_d, size, [size2], [shift], [cp], [offset], [anchors] ...
+//   attachable(anchor, spin, two_d, size, <size2>, <shift>, <cp>, <offset>, <anchors> ...
 // Usage: Circle/Oval Geometry
-//   attachable(anchor, spin, [orient], two_d, r|d, [cp], [offset], [anchors]) ...
+//   attachable(anchor, spin, two_d, r|d, <cp>, <offset>, <anchors>) ...
 // Usage: 2D Path/Polygon Geometry
-//   attachable(anchor, spin, [orient], two_d, path, [extent], [cp], [offset], [anchors] ...
+//   attachable(anchor, spin, two_d, path, <extent>, <cp>, <offset>, <anchors> ...
 // Usage: Cubical/Prismoidal Geometry
-//   attachable(anchor, spin, [orient], size, [size2], [shift], [cp], [offset], [anchors] ...
+//   attachable(anchor, spin, <orient>, size, <size2>, <shift>, <cp>, <offset>, <anchors> ...
 // Usage: Cylindrical Geometry
-//   attachable(anchor, spin, [orient], r|d, l, [axis], [cp], [offset], [anchors]) ...
+//   attachable(anchor, spin, <orient>, r|d, l, <axis>, <cp>, <offset>, <anchors>) ...
 // Usage: Conical Geometry
-//   attachable(anchor, spin, [orient], r1|d1, r2|d2, l, [axis], [cp], [offset], [anchors]) ...
+//   attachable(anchor, spin, <orient>, r1|d1, r2|d2, l, <axis>, <cp>, <offset>, <anchors>) ...
 // Usage: Spheroid/Ovoid Geometry
-//   attachable(anchor, spin, [orient], r|d, [cp], [offset], [anchors]) ...
+//   attachable(anchor, spin, <orient>, r|d, <cp>, <offset>, <anchors>) ...
 // Usage: VNF Geometry
-//   attachable(anchor, spin, [orient], vnf, [extent], [cp], [offset], [anchors]) ...
+//   attachable(anchor, spin, <orient>, vnf, <extent>, <cp>, <offset>, <anchors>) ...
 //
 // Description:
 //   Manages the anchoring, spin, orientation, and attachments for a 3D volume or 2D area.
@@ -969,8 +969,8 @@ module position(from)
 
 // Module: attach()
 // Usage:
-//   attach(from, [overlap]) ...
-//   attach(from, to, [overlap]) ...
+//   attach(from, <overlap>) ...
+//   attach(from, to, <overlap>) ...
 // Description:
 //   Attaches children to a parent object at an anchor point and orientation.
 //   Attached objects will be overlapped into the parent object by a little bit,
@@ -1012,7 +1012,7 @@ module attach(from, to=undef, overlap=undef, norot=false)
 
 // Module: face_profile()
 // Usage:
-//   face_profile(faces=[], convexity=10, r, d) ...
+//   face_profile(faces, r, d, <convexity>) ...
 // Description:
 //   Given a 2D edge profile, extrudes it into a mask for all edges and corners bounding each given face.
 // Arguments:
@@ -1032,7 +1032,7 @@ module face_profile(faces=[], r, d, convexity=10) {
 
 // Module: edge_profile()
 // Usage:
-//   edge_profile([edges], [except], [convexity]) ...
+//   edge_profile(<edges>, <except>, <convexity>) ...
 // Description:
 //   Takes a 2D mask shape and attaches it to the selected edges, with the appropriate orientation
 //   and extruded length to be `diff()`ed away, to give the edge a matching profile.
@@ -1082,7 +1082,7 @@ module edge_profile(edges=EDGES_ALL, except=[], convexity=10) {
 
 // Module: corner_profile()
 // Usage:
-//   corner_profile([corners], [except], [convexity]) ...
+//   corner_profile(<corners>, <except>, <convexity>) ...
 // Description:
 //   Takes a 2D mask shape, rotationally extrudes and converts it into a corner mask, and attaches it
 //   to the selected corners with the appropriate orientation.  Tags it as a "mask" to allow it to be
@@ -1144,7 +1144,7 @@ module corner_profile(corners=CORNERS_ALL, except=[], r, d, convexity=10) {
 
 // Module: edge_mask()
 // Usage:
-//   edge_mask([edges], [except]) ...
+//   edge_mask(<edges>, <except>) ...
 // Description:
 //   Takes a 3D mask shape, and attaches it to the given edges, with the
 //   appropriate orientation to be `diff()`ed away.
@@ -1186,7 +1186,7 @@ module edge_mask(edges=EDGES_ALL, except=[]) {
 
 // Module: corner_mask()
 // Usage:
-//   corner_mask([corners], [except]) ...
+//   corner_mask(<corners>, <except>) ...
 // Description:
 //   Takes a 3D mask shape, and attaches it to the given corners, with the appropriate
 //   orientation to be `diff()`ed away.  The 3D corner mask shape should be designed to
@@ -1305,8 +1305,8 @@ module show(tags="")
 
 // Module: diff()
 // Usage:
-//   diff(neg, [keep]) ...
-//   diff(neg, pos, [keep]) ...
+//   diff(neg, <keep>) ...
+//   diff(neg, pos, <keep>) ...
 // Description:
 //   If `neg` is given, takes the union of all children with tags that are in `neg`, and differences
 //   them from the union of all children with tags in `pos`.  If `pos` is not given, then all items in
@@ -1363,8 +1363,8 @@ module diff(neg, pos=undef, keep=undef)
 
 // Module: intersect()
 // Usage:
-//   intersect(a, [keep]) ...
-//   intersect(a, b, [keep]) ...
+//   intersect(a, <keep>) ...
+//   intersect(a, b, <keep>) ...
 // Description:
 //   If `a` is given, takes the union of all children with tags that are in `a`, and `intersection()`s
 //   them with the union of all children with tags in `b`.  If `b` is not given, then the union of all
diff --git a/version.scad b/version.scad
index e533b27..9757673 100644
--- a/version.scad
+++ b/version.scad
@@ -8,7 +8,7 @@
 //////////////////////////////////////////////////////////////////////
 
 
-BOSL_VERSION = [2,0,482];
+BOSL_VERSION = [2,0,483];
 
 
 // Section: BOSL Library Version Functions

From f30e46e3ac3264addec1d059e930abd5ba0b451b Mon Sep 17 00:00:00 2001
From: Garth Minette <gminette@gmail.com>
Date: Sun, 27 Dec 2020 21:52:13 -0800
Subject: [PATCH 02/22] Enhanced show_anchors() to handle 2d.

---
 debug.scad   | 26 ++++++++++++++++++--------
 version.scad |  2 +-
 2 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/debug.scad b/debug.scad
index a38a690..96e5715 100644
--- a/debug.scad
+++ b/debug.scad
@@ -274,7 +274,7 @@ function standard_anchors(two_d=false) = [
 
 // Module: anchor_arrow()
 // Usage:
-//   anchor_arrow([s], [color], [flag]);
+//   anchor_arrow(<s>, <color>, <flag>);
 // Description:
 //   Show an anchor orientation arrow.
 // Arguments:
@@ -303,7 +303,7 @@ module anchor_arrow(s=10, color=[0.333,0.333,1], flag=true, $tags="anchor-arrow"
 
 // Module: anchor_arrow2d()
 // Usage:
-//   anchor_arrow2d([s], [color], [flag]);
+//   anchor_arrow2d(<s>, <color>, <flag>);
 // Description:
 //   Show an anchor orientation arrow.
 // Arguments:
@@ -312,7 +312,7 @@ module anchor_arrow(s=10, color=[0.333,0.333,1], flag=true, $tags="anchor-arrow"
 // Example:
 //   anchor_arrow2d(s=20);
 module anchor_arrow2d(s=15, color=[0.333,0.333,1], $tags="anchor-arrow") {
-    noop() stroke([[0,0],[0,s]], width=s/10, endcap1="butt", endcap2="arrow2");
+    noop() color(color) stroke([[0,0],[0,s]], width=s/10, endcap1="butt", endcap2="arrow2");
 }
 
 
@@ -341,18 +341,28 @@ module show_internal_anchors(opacity=0.2) {
 // Example(FlatSpin):
 //   cube(50, center=true) show_anchors();
 module show_anchors(s=10, std=true, custom=true) {
+    check = assert($parent_geom != undef) 1;
+    two_d = attach_geom_2d($parent_geom);
     if (std) {
-        for (anchor=standard_anchors()) {
-            attach(anchor) anchor_arrow(s);
+        for (anchor=standard_anchors(two_d=two_d)) {
+            if(two_d) {
+                attach(anchor) anchor_arrow2d(s);
+            } else {
+                attach(anchor) anchor_arrow(s);
+            }
         }
     }
     if (custom) {
         for (anchor=select($parent_geom,-1)) {
             attach(anchor[0]) {
-                anchor_arrow(s, color="cyan");
-                recolor("black")
+                if(two_d) {
+                    anchor_arrow2d(s, color="cyan");
+                } else {
+                    anchor_arrow(s, color="cyan");
+                }
+                color("black")
                 noop($tags="anchor-arrow") {
-                    xrot(90) {
+                    xrot(two_d? 0 : 90) {
                         up(s/10) {
                             linear_extrude(height=0.01, convexity=12, center=true) {
                                 text(text=anchor[0], size=s/4, halign="center", valign="center");
diff --git a/version.scad b/version.scad
index 9757673..8337caf 100644
--- a/version.scad
+++ b/version.scad
@@ -8,7 +8,7 @@
 //////////////////////////////////////////////////////////////////////
 
 
-BOSL_VERSION = [2,0,483];
+BOSL_VERSION = [2,0,484];
 
 
 // Section: BOSL Library Version Functions

From fb0de58c7ffeb3a04f8eed53d92411f23e670c55 Mon Sep 17 00:00:00 2001
From: Garth Minette <gminette@gmail.com>
Date: Sun, 27 Dec 2020 21:54:31 -0800
Subject: [PATCH 03/22] Fixes for faster construction of sphere()

---
 shapes.scad  | 29 ++++++++++++++++-------------
 version.scad |  2 +-
 2 files changed, 17 insertions(+), 14 deletions(-)

diff --git a/shapes.scad b/shapes.scad
index 5b8c975..53149f6 100644
--- a/shapes.scad
+++ b/shapes.scad
@@ -1159,6 +1159,14 @@ module torus(
 //   Creates a spheroid object, with support for anchoring and attachments.
 //   This is a drop-in replacement for the built-in `sphere()` module.
 //   When called as a function, returns a [VNF](vnf.scad) for a spheroid.
+//   The exact triangulation of this spheroid can be controlled via the `style=`
+//   argument, where the value can be one of `"orig"`, `"aligned"`, `"stagger"`,
+//   `"octa"`, or `"icosa"`:
+//   - `style="orig"` constructs a sphere the same way that the OpenSCAD `sphere()` built-in does.
+//   - `style="aligned"` constructs a sphere where, if `$fn` is a multiple of 4, it has vertices at all axis maxima and minima.  ie: its bounding box is exactly the sphere diameter in length on all three axes.  This is the default.
+//   - `style="stagger"` forms a sphere where all faces are triangular, but the top and bottom poles have thinner triangles.
+//   - `style="octa"` forms a sphere by subdividing an octahedron (8-sided platonic solid).  This makes more uniform faces over the entirety of the sphere, and guarantees the bounding box is the sphere diameter in size on all axes.  The effective `$fn` value is quantized to a multiple of 4, though.  This is used in constructing rounded corners for various other shapes.
+//   - `style="icosa"` forms a sphere by subdividing an icosahedron (20-sided platonic solid).  This makes even more uniform faces over the entirety of the sphere.  The effective `$fn` value is quantized to a multiple of 5, though.
 // Arguments:
 //   r = Radius of the spheroid.
 //   d = Diameter of the spheroid.
@@ -1200,21 +1208,16 @@ module spheroid(r, d, circum=false, style="aligned", anchor=CENTER, spin=0, orie
 {
     r = get_radius(r=r, d=d, dflt=1);
     sides = segs(r);
+    vsides = ceil(sides/2);
     attachable(anchor,spin,orient, r=r) {
         if (style=="orig") {
-            rotate_extrude(convexity=2,$fn=sides) {
-                difference() {
-                    oval(r=r, circum=circum, realign=true, $fn=sides);
-                    left(r) square(2*r,center=true);
-                }
-            }
-        } else if (style=="aligned") {
-            rotate_extrude(convexity=2,$fn=sides) {
-                difference() {
-                    oval(r=r, circum=circum, $fn=sides);
-                    left(r) square(2*r,center=true);
-                }
-            }
+            merids = [ for (i=[0:1:vsides]) 90-(i+0.5)*180/(vsides+1) ];
+            path = [
+                let(a = merids[0]) [0, r*sin(a)],
+                for (a=merids) r * [cos(a), sin(a)],
+                let(a = select(merids,-1)) [0, r*sin(a)]
+            ];
+            rotate_extrude(convexity=2,$fn=sides) polygon(path);
         } else {
             vnf = spheroid(r=r, circum=circum, style=style);
             vnf_polyhedron(vnf, convexity=2);
diff --git a/version.scad b/version.scad
index 8337caf..ca80f65 100644
--- a/version.scad
+++ b/version.scad
@@ -8,7 +8,7 @@
 //////////////////////////////////////////////////////////////////////
 
 
-BOSL_VERSION = [2,0,484];
+BOSL_VERSION = [2,0,485];
 
 
 // Section: BOSL Library Version Functions

From b054edb5fb7d98342de415a512c340e770704be6 Mon Sep 17 00:00:00 2001
From: Garth Minette <gminette@gmail.com>
Date: Sun, 27 Dec 2020 21:55:36 -0800
Subject: [PATCH 04/22] Fix for anchors in trapezoid() when using shift=.

---
 shapes2d.scad | 6 +++---
 version.scad  | 2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/shapes2d.scad b/shapes2d.scad
index b9750da..4fec9a3 100644
--- a/shapes2d.scad
+++ b/shapes2d.scad
@@ -1250,7 +1250,7 @@ module trapezoid(h, w1, w2, angle, shift=0, anchor=CENTER, spin=0) {
         w2 = !is_undef(w2)? w2 : w1 - 2*(adj_ang_to_opp(h, angle) + shift);
         assert(w1>=0 && w2>=0 && h>0, "Degenerate trapezoid geometry.");
         path = [[w1/2,-h/2], [-w1/2,-h/2], [-w2/2+shift,h/2], [w2/2+shift,h/2]];
-        attachable(anchor,spin, two_d=true, size=[w1,h], size2=w2) {
+        attachable(anchor,spin, two_d=true, size=[w1,h], size2=w2, shift=shift) {
             polygon(path);
             children();
         }
@@ -1325,8 +1325,8 @@ function teardrop2d(r, d, ang=45, cap_h, anchor=CENTER, spin=0) =
 // Arguments:
 //   r = The radius of the end circles.
 //   d = The diameter of the end circles.
-//   spread = The distance between the centers of the end circles.
-//   tangent = The angle in degrees of the tangent point for the joining arcs, measured away from the Y axis.
+//   spread = The distance between the centers of the end circles.  Default: 10
+//   tangent = The angle in degrees of the tangent point for the joining arcs, measured away from the Y axis.  Default: 30
 //   anchor = Translate so anchor point is at origin (0,0,0).  See [anchor](attachments.scad#anchor).  Default: `CENTER`
 //   spin = Rotate this many degrees around the Z axis after anchor.  See [spin](attachments.scad#spin).  Default: `0`
 // Examples(2D):
diff --git a/version.scad b/version.scad
index ca80f65..15bdab9 100644
--- a/version.scad
+++ b/version.scad
@@ -8,7 +8,7 @@
 //////////////////////////////////////////////////////////////////////
 
 
-BOSL_VERSION = [2,0,485];
+BOSL_VERSION = [2,0,486];
 
 
 // Section: BOSL Library Version Functions

From eb12f5f9cb1581dcfb99fd3d7fd4e79dd1910b08 Mon Sep 17 00:00:00 2001
From: Garth Minette <gminette@gmail.com>
Date: Mon, 28 Dec 2020 02:10:50 -0800
Subject: [PATCH 05/22] Tutorials work..  Shapes2d and Paths.

---
 tutorials/Paths.md                         | 504 +++++++++++++++++++
 tutorials/Shapes2d.md                      | 553 +++++++++++++++++++++
 tutorials/{Basic_Shapes.md => Shapes3d.md} | 241 +--------
 version.scad                               |   2 +-
 4 files changed, 1073 insertions(+), 227 deletions(-)
 create mode 100644 tutorials/Paths.md
 create mode 100644 tutorials/Shapes2d.md
 rename tutorials/{Basic_Shapes.md => Shapes3d.md} (55%)

diff --git a/tutorials/Paths.md b/tutorials/Paths.md
new file mode 100644
index 0000000..68e5421
--- /dev/null
+++ b/tutorials/Paths.md
@@ -0,0 +1,504 @@
+# Paths, Polygons and Regions Tutorial
+
+## Paths
+A number of advanced features in BOSL2 rely on paths, which are just ordered lists of points.
+
+First-off, some terminology:
+- A 2D point is a vectors of X and Y axis position values ie: `[3,4]` or `[7,-3]`.
+- A 3D point is a vectors of X, Y and Z axis position values ie: `[3,4,2]` or `[-7,5,3]`.
+- A 2D path is simply a list of two or more 2D points.  ie: `[[5,7], [1,-5], [-5,6]]`
+- A 3D path is simply a list of two or more 3D points.  ie: `[[5,7,-1], [1,-5,3], [-5,6,1]]`
+- A polygon is a 2D (or planar 3D) path where the last point is assumed to connect to the first point.
+- A region is a list of 2D polygons, where each polygon is XORed against all the others.  ie: if one polygon is inside another, it makes a hole in the first polygon.
+
+### Stroke
+A path can be hard to visualize, since it's just a bunch of numbers in the source code.
+One way to see the path is to pass it to `polygon()`:
+
+```openscad-2D
+    path = [[0,0], [-10,10], [0,20], [10,20], [10,10]];
+    polygon(path);
+```
+
+Sometimes, however, it's easier to see just the path itself.  For this, you can use the `stroke()` module.
+At its most basic, `stroke()` just shows the path's line segments:
+
+```openscad-2D
+    path = [[0,0], [-10,10], [0,20], [10,20], [10,10]];
+    stroke(path);
+```
+
+You can vary the width of the drawn path with the `width=` argument:
+
+```openscad-2D
+    path = [[0,0], [-10,10], [0,20], [10,20], [10,10]];
+    stroke(path, width=3);
+```
+
+You can vary the line length along the path by giving a list of widths, one per point:
+
+```openscad-2D
+    path = [[0,0], [-10,10], [0,20], [10,20], [10,10]];
+    stroke(path, width=[3,2,1,2,3]);
+```
+
+If a path is meant to represent a closed polygon, you can use `closed=true` to show it that way:
+
+```openscad-2D
+    path = [[0,0], [-10,10], [0,20], [10,20], [10,10]];
+    stroke(path, closed=true);
+```
+
+The ends of the drawn path are normally capped with a "round" endcap, but there are other options:
+
+```openscad-2D
+    path = [[0,0], [-10,10], [0,20], [10,20], [10,10]];
+    stroke(path, endcaps="round");
+```
+
+```openscad-2D
+    path = [[0,0], [-10,10], [0,20], [10,20], [10,10]];
+    stroke(path, endcaps="butt");
+```
+
+```openscad-2D
+    path = [[0,0], [-10,10], [0,20], [10,20], [10,10]];
+    stroke(path, endcaps="line");
+```
+
+```openscad-2D
+    path = [[0,0], [-10,10], [0,20], [10,20], [10,10]];
+    stroke(path, endcaps="tail");
+```
+
+```openscad-2D
+    path = [[0,0], [-10,10], [0,20], [10,20], [10,10]];
+    stroke(path, endcaps="arrow2");
+```
+
+For more standard supported endcap options, see the docs for [`stroke()`](shapes2d.scad#stroke).
+
+The start and ending endcaps can be specified individually or separately, using `endcap1=` and `endcap2=`:
+
+```openscad-2D
+    path = [[0,0], [-10,10], [0,20], [10,20], [10,10]];
+    stroke(path, endcap2="arrow2");
+```
+
+```openscad-2D
+    path = [[0,0], [-10,10], [0,20], [10,20], [10,10]];
+    stroke(path, endcap1="butt", endcap2="arrow2");
+```
+
+```openscad-2D
+    path = [[0,0], [-10,10], [0,20], [10,20], [10,10]];
+    stroke(path, endcap1="tail", endcap2="arrow");
+```
+
+The size of the endcaps will be relative to the width of the line where the endcap is to be placed:
+
+```openscad-2D
+    path = [[0,0], [-10,10], [0,20], [10,20], [10,10]];
+    widths = [1, 1.25, 1.5, 1.75, 2];
+    stroke(path, width=widths, endcaps="arrow2");
+```
+
+If none of the standard endcaps are useful to you, it is possible to design your own, simply by
+passing a path to the `endcaps=`, `endcap1=`, or `endcap2=` arguments.  You may also need to give
+`trim=` to tell it how far back to trim the main line, so it renders nicely.  The values in the
+endcap polygon, and in the `trim=` argument are relative to the line width.  A value of 1 is one
+line width size.
+
+Untrimmed:
+
+```openscad-2D
+    path = [[0,0], [-10,10], [0,20], [10,20], [10,10]];
+    dblarrow = [[0,0], [2,-3], [0.5,-2.3], [2,-4], [0.5,-3.5], [-0.5,-3.5], [-2,-4], [-0.5,-2.3], [-2,-3]];
+    stroke(path, endcaps=dblarrow);
+```
+
+Trimmed:
+
+```openscad-2D
+    path = [[0,0], [-10,10], [0,20], [10,20], [10,10]];
+    dblarrow = [[0,0], [2,-3], [0.5,-2.3], [2,-4], [0.5,-3.5], [-0.5,-3.5], [-2,-4], [-0.5,-2.3], [-2,-3]];
+    stroke(path, trim=3.5, endcaps=dblarrow);
+```
+
+### Standard 2D Shape Polygons
+BOSL2 will let you get the perimeter polygon for almost all of the standard 2D shapes simply by calling them like a function:
+
+```openscad-2D
+    path = square(40, center=true);
+    stroke(path, closed=true, endcap2="arrow2");
+```
+
+```openscad-2D
+    path = rect([40,30], rounding=5, center=true);
+    stroke(path, closed=true, endcap2="arrow2");
+```
+
+```openscad-2D
+    path = trapezoid(w1=40, w2=20, h=30);
+    stroke(path, closed=true, endcap2="arrow2");
+```
+
+```openscad-2D
+    path = circle(d=50);
+    stroke(path, closed=true, endcap2="arrow2");
+```
+
+```openscad-2D
+    path = oval(d=[50,30]);
+    stroke(path, closed=true, endcap2="arrow2");
+```
+
+```openscad-2D
+    path = pentagon(d=50);
+    stroke(path, closed=true, endcap2="arrow2");
+```
+
+```openscad-2D
+    path = star(n=5, step=2, d=50);
+    stroke(path, closed=true, endcap2="arrow2");
+```
+
+### Arcs
+Often, when you are constructing a path, you will want to add an arc.  The `arc()` command lets you do that:
+
+```openscad-2D
+    path = arc(r=30, angle=120);
+    stroke(path, endcap2="arrow2");
+```
+
+```openscad-2D
+    path = arc(d=60, angle=120);
+    stroke(path, endcap2="arrow2");
+```
+
+If you give the `N=` argument, you can control exactly how many points the arc is divided into:
+
+```openscad-2D
+    path = arc(N=5, r=30, angle=120);
+    stroke(path, endcap2="arrow2");
+```
+
+With the `start=` argument, you can start the arc somewhere other than the X+ axis:
+
+```openscad-2D
+    path = arc(start=45, r=30, angle=120);
+    stroke(path, endcap2="arrow2");
+```
+
+Alternatively, you can give starting and ending angles in a list in the `angle=` argument:
+
+```openscad-2D
+    path = arc(angle=[120,45], r=30);
+    stroke(path, endcap2="arrow2");
+```
+
+The `cp=` argument lets you center the arc somewhere other than the origin:
+
+```openscad-2D
+    path = arc(cp=[10,0], r=30, angle=120);
+    stroke(path, endcap2="arrow2");
+```
+
+The arc can also be given by three points on the arc:
+
+```openscad-2D
+    pts = [[-15,10],[0,20],[35,-5]];
+    path = arc(points=pts);
+    stroke(path, endcap2="arrow2");
+```
+
+
+### Turtle Graphics
+Another way you can create a path is using the `turtle()` command.  It implements a simple path
+description language that is similar to LOGO Turtle Graphics. The concept is that you have a virtial
+turtle or cursor walking a path.  It can "move" forward or backward, or turn "left" or "right" in
+place:
+
+```openscad-2D
+    path = turtle([
+        "move", 10,
+        "left", 90,
+        "move", 20,
+        "left", 135,
+        "move", 10*sqrt(2),
+        "right", 90,
+        "move", 10*sqrt(2),
+        "left", 135,
+        "move", 20
+    ]);
+    stroke(path, endcap2="arrow2");
+```
+
+The position and the facing of the turtle/cursor updates after each command.  The motion and turning
+commands can also have default distances or angles given:
+
+```openscad-2D
+    path = turtle([
+        "angle",360/6,
+        "length",10,
+        "move","turn",
+        "move","turn",
+        "move","turn",
+        "move","turn",
+        "move"
+    ]);
+    stroke(path, endcap2="arrow2");
+```
+
+You can use "scale" to relatively scale up the default motion length:
+
+```openscad-2D
+    path = turtle([
+        "angle",360/6,
+        "length",10,
+        "move","turn",
+        "move","turn",
+        "scale",2,
+        "move","turn",
+        "move","turn",
+        "scale",0.5,
+        "move"
+    ]);
+    stroke(path, endcap2="arrow2");
+```
+
+Sequences of commands can be repeated using the "repeat" command:
+
+```openscad-2D
+    path=turtle([
+        "angle",360/5,
+        "length",10,
+        "repeat",5,["move","turn"]
+    ]);
+    stroke(path, endcap2="arrow2");
+```
+
+More complicated commands also exist, including those that form arcs:
+
+```openscad-2D
+    path = turtle([
+        "move", 10,
+        "left", 90,
+        "move", 20,
+        "arcleft", 10, 180,
+        "move", 20
+    ]);
+    stroke(path, endcap2="arrow2");
+```
+
+A comprehensive list of supported turtle commands can be found in the docs for [`turtle()`](shapes2d.scad#turtle).
+
+### Transforming Paths and Polygons
+To translate a path, you can just pass it to the `move()` (or up/down/left/right/fwd/back) function in the `p=` argument:
+
+```openscad-2D
+    path = move([-15,-30], p=square(50,center=true));
+    stroke(path, endcap2="arrow2");
+```
+
+```openscad-2D
+    path = fwd(30, p=square(50,center=true));
+    stroke(path, endcap2="arrow2");
+```
+
+```openscad-2D
+    path = left(30, p=square(50,center=true));
+    stroke(path, endcap2="arrow2");
+```
+
+To scale a path, you can just pass it to the `scale()` (or [xyz]scale) function in the `p=` argument:
+
+```openscad-2D
+    path = scale([1.5,0.75], p=square(50,center=true));
+    stroke(path, endcap2="arrow2");
+```
+
+```openscad-2D
+    path = xscale(1.5, p=square(50,center=true));
+    stroke(path, endcap2="arrow2");
+```
+
+```openscad-2D
+    path = yscale(1.5, p=square(50,center=true));
+    stroke(path, endcap2="arrow2");
+```
+
+To rotate a path, just can pass it to the `rot()` (or [xyz]rot) function in the `p=` argument:
+
+```openscad-2D
+    path = rot(30, p=square(50,center=true));
+    stroke(path, endcap2="arrow2");
+```
+
+```openscad-2D
+    path = zrot(30, p=square(50,center=true));
+    stroke(path, endcap2="arrow2");
+```
+
+To mirror a path, just can pass it to the `mirror()` (or [xyz]flip) function in the `p=` argument:
+
+```openscad-2D
+    path = mirror([1,1], p=trapezoid(w1=10, w2=0, h=5));
+    stroke(path, endcap2="arrow2");
+```
+
+```openscad-2D
+    path = xflip(p=trapezoid(w1=10, w2=0, h=5));
+    stroke(path, endcap2="arrow2");
+```
+
+```openscad-2D
+    path = yflip(p=trapezoid(w1=10, w2=0, h=5));
+    stroke(path, endcap2="arrow2");
+```
+
+You can get raw transformation matrices for various transformations by calling them like a function without a `p=` argument:
+
+```openscad-2D
+    mat = move([5,10]);
+    multmatrix(mat) square(50,center=true);
+```
+
+```openscad-2D
+    mat = scale([1.5,0.75]);
+    multmatrix(mat) square(50,center=true);
+```
+
+```openscad-2D
+    mat = rot(30);
+    multmatrix(mat) square(50,center=true);
+```
+
+Raw transformation matrices can be multiplied together to precalculate a compound transformation.  For example, to scale a shape, then rotate it, then translate the result, you can do something like:
+
+```openscad-2D
+    mat = move([5,10]) * rot(30, planar=true) * scale([1.5,0.75]);
+    multmatrix(mat) square(50,center=true);
+```
+
+To apply a compound transformation matrix to a path, you can use the `apply()` function:
+
+```openscad-2D
+    mat = move([5,10]) * rot(30, planar=true) * scale([1.5,0.75]);
+    path = square(50,center=true);
+    tpath = apply(mat, path);
+    stroke(tpath, endcap2="arrow2");
+```
+
+
+### Regions
+A polygon is good to denote a single closed 2D shape with no holes in it.  For more complex 2D
+shapes, you will need to use regions.  A region is a list of 2D polygons, where each polygon is
+XORed against all the others.  You can display a region using the `region()` module.
+
+If you have a region with one polygon fully inside another, it makes a hole:
+
+```openscad-2D
+    rgn = [square(50,center=true), circle(d=30)];
+    region(rgn);
+```
+
+If you have a region with multiple polygons that are not contained by any others, they make multiple discontiguous shapes:
+
+```openscad-2D
+    rgn = [
+        move([-30, 20], p=square(20,center=true)),
+        move([  0,-20], p=trapezoid(w1=20, w2=10, h=20)),
+        move([ 30, 20], p=square(20,center=true)),
+    ];
+    region(rgn);
+```
+
+Region polygons can be nested abitrarily deep, in multiple discontiguous shapes:
+
+```openscad-2D
+    rgn = [
+        for (d=[50:-10:10]) left(30, p=circle(d=d)),
+        for (d=[50:-10:10]) right(30, p=circle(d=d))
+    ];
+    region(rgn);
+```
+
+A region with crossing polygons is somewhat poorly formed, but the intersection(s) of the polygons become holes:
+
+```openscad-2D
+    rgn = [
+        left(15, p=circle(d=50)),
+        right(15, p=circle(d=50))
+    ];
+    region(rgn);
+```
+
+### Boolean Region Geometry
+Similarly to how OpenSCAD can perform operations like union/difference/intersection/offset on shape geometry,
+the BOSL2 library lets you perform those same operations on regions:
+
+```openscad-2D
+    rgn1 = [for (d=[40:-10:10]) circle(d=d)];
+    rgn2 = [square([60,12], center=true)];
+    rgn = union(rgn1, rgn2);
+    region(rgn);
+```
+
+```openscad-2D
+    rgn1 = [for (d=[40:-10:10]) circle(d=d)];
+    rgn2 = [square([60,12], center=true)];
+    rgn = difference(rgn1, rgn2);
+    region(rgn);
+```
+
+```openscad-2D
+    rgn1 = [for (d=[40:-10:10]) circle(d=d)];
+    rgn2 = [square([60,12], center=true)];
+    rgn = exclusive_or(rgn1, rgn2);
+    region(rgn);
+```
+
+```openscad-2D
+    rgn1 = [for (d=[40:-10:10]) circle(d=d)];
+    rgn2 = [square([60,12], center=true)];
+    rgn = intersection(rgn1, rgn2);
+    region(rgn);
+```
+
+```openscad-2D
+    orig_rgn = [star(n=5, step=2, d=50)];
+    rgn = offset(orig_rgn, r=-3, closed=true);
+    color("blue") region(orig_rgn);
+    region(rgn);
+```
+
+You can use regions for several useful things.  If you wanted a grid of holes in your object that
+form the shape given by a region, you can do that with `grid2d()`:
+
+```openscad-3D
+    rgn = [
+        circle(d=100),
+        star(n=5,step=2,d=100,spin=90)
+    ];
+    difference() {
+        cyl(h=5, d=120);
+        grid2d(size=[120,120], spacing=[4,4], inside=rgn) cyl(h=10,d=2);
+    }
+```
+
+You can also sweep a region through 3-space to make a solid:
+
+```openscad-3D
+    $fa=1; $fs=1;
+    rgn = [ for (d=[50:-10:10]) circle(d=d) ];
+    tforms = [
+        for (a=[90:-5:0]) xrot(a, cp=[0,-70]),
+        for (a=[0:5:90]) xrot(a, cp=[0,70]),
+        move([0,150,-70]) * xrot(90),
+    ];
+    sweep(rgn, tforms, closed=false, caps=true);
+```
+
+
+
diff --git a/tutorials/Shapes2d.md b/tutorials/Shapes2d.md
new file mode 100644
index 0000000..28b353b
--- /dev/null
+++ b/tutorials/Shapes2d.md
@@ -0,0 +1,553 @@
+# 2D Shapes Tutorial
+
+## Primitives
+There are two built-in 2D primitive shapes that OpenSCAD provides: `square()`, and `circle()`.
+The BOSL2 library provides alternative to these shapes so that they support more features,
+and more ways to simply reorient them.
+
+
+### 2D Squares
+You can still use the built-in `square()` in the familiar ways that OpenSCAD provides:
+
+```openscad-2D
+    square(100, center=false);
+```
+
+```openscad-2D
+    square(100, center=true);
+```
+
+```openscad-2D
+    square([60,40], center=true);
+```
+
+The BOSL2 library provides an enhanced equivalent to `square()` called `rect()`.
+You can use it in the same way you use `square()`, but it also provides
+extended functionality. For example, it allows you to round the corners:
+
+```openscad-2D
+    rect([60,40], center=true, rounding=10);
+```
+
+Or chamfer them:
+
+```openscad-2D
+    rect([60,40], center=true, chamfer=10);
+```
+
+You can even specify *which* corners get rounded or chamfered.  If you pass a
+list of four size numbers to the `rounding=` or `chamfer=` arguments, it will
+give each corner its own size.  In order, it goes from the back-right (quadrant I)
+corner, counter-clockwise around to the back-left (quadrant II) corner, to the
+forward-left (quadrant III) corner, to the forward-right (quadrant IV) corner:
+
+```openscad-2DImgOnly
+    module text3d(text) color("black") text(
+        text=text, font="Times", size=10,
+        halign="center", valign="center"
+    );
+    translate([ 50, 50]) text3d("I");
+    translate([-50, 50]) text3d("II");
+    translate([-50,-50]) text3d("III");
+    translate([ 50,-50]) text3d("IV");
+    rect([90,80], center=true);
+```
+
+If a size is given as `0`, then there is no rounding and/or chamfering for
+that quadrant's corner:
+
+```openscad-2D
+    rect([60,40], center=true, rounding=[0,5,10,15]);
+```
+
+```openscad-2D
+    rect([60,40], center=true, chamfer=[0,5,10,15]);
+```
+
+You can give both `rounding=` and `chamfer=` arguments to mix rounding and
+chamfering, but only if you specify per corner.  If you want a rounding in
+a corner, specify a 0 chamfer for that corner, and vice versa:
+
+```openscad-2D
+    rect([60,40], center=true, rounding=[5,0,10,0], chamfer=[0,5,0,15]);
+```
+
+#### Anchors and Spin
+Another way that `rect()` is enhanced over `square()`, is that you can anchor,
+spin and attach it.
+
+The `anchor=` argument is an alternative to `center=`, which allows more
+alignment options.  It takes a vector as a value, pointing roughly towards
+the side or corner you want to align to the origin.  For example, to align
+the center of the back edge to the origin, set the anchor to `[0,1]`:
+
+```openscad-2D
+    rect([60,40], anchor=[0,1]);
+```
+
+To align the front right corner to the origin:
+
+```openscad-2D
+    rect([60,40], anchor=[1,-1]);
+```
+
+To center:
+
+```openscad-2D
+    rect([60,40], anchor=[0,0]);
+```
+
+To make it clearer when giving vectors, there are several standard vector
+constants defined:
+
+Constant | Direction | Value
+-------- | --------- | -----------
+`LEFT`   | X-        | `[-1, 0, 0]`
+`RIGHT`  | X+        | `[ 1, 0, 0]`
+`FRONT`/`FORWARD`/`FWD` | Y- | `[ 0,-1, 0]`
+`BACK`   | Y+        | `[ 0, 1, 0]`
+`BOTTOM`/`BOT`/`BTM`/`DOWN` | Z- | `[ 0, 0,-1]` (3D only.)
+`TOP`/`UP` | Z+      | `[ 0, 0, 1]` (3D only.)
+`CENTER`/`CTR` | Centered | `[ 0, 0, 0]`
+
+Note that even though these are 3D vectors, you can use most of them,
+(except `UP`/`DOWN`, of course) for anchors in 2D shapes:
+
+```openscad-2D
+    rect([60,40], anchor=BACK);
+```
+
+```openscad-2D
+    rect([60,40], anchor=CENTER);
+```
+
+You can add vectors together to point to corners:
+
+```openscad-2D
+    rect([60,40], anchor=FRONT+RIGHT);
+```
+
+Finally, the `spin` argument can rotate the shape by a given number of degrees
+clockwise:
+
+```openscad-2D
+    rect([60,40], anchor=CENTER, spin=30);
+```
+
+Anchoring or centering is performed before the spin:
+
+```openscad-2D
+    rect([60,40], anchor=BACK, spin=30);
+```
+
+Anchor points double as attachment points, so that you can attach other shapes:
+
+```openscad-2D
+    rect([60,40],center=true)
+        show_anchors();
+```
+
+### 2D Circles and Ovals
+The built-in `circle()` primitive can be used as expected:
+
+```openscad-2D
+    circle(r=50);
+```
+
+```openscad-2D
+    circle(d=100);
+```
+
+```openscad-2D
+    circle(d=100, $fn=8);
+```
+
+The BOSL2 library also provides an enhanced equivalent of `circle()` called `oval()`.
+You can use it in the same way you use `circle()`, but it also provides extended
+functionality. For example, it allows more control over its size and orientation.
+
+Since a circle in OpenSCAD can only be approximated by a regular polygon with
+a number of straight sides, this can lead to size and shape inaccuracies.
+To counter this, the `realign=` and `circum=` arguments are also provided.
+
+The `realign=` argument, if set `true`, rotates the `oval()` by half the angle
+between the sides:
+
+```openscad-2D
+    oval(d=100, $fn=8, realign=true);
+```
+
+The `circum=` argument, if true, makes it so that the polygon forming the
+`oval()` circumscribes the ideal circle instead of inscribing it.
+
+Inscribing the ideal circle:
+
+```openscad-2D
+    difference() {
+        circle(d=100, $fn=360);
+        oval(d=100, $fn=8);
+    }
+```
+
+Circumscribing the ideal circle:
+
+```openscad-2D
+    difference() {
+        oval(d=100, $fn=8, circum=true);
+        circle(d=100, $fn=360);
+    }
+```
+
+The `oval()` module, as its name suggests, can be given separate X and Y radii
+or diameters.  To do this, just give `r=` or `d=` with a list of two radii or
+diameters:
+
+```openscad-2D
+    oval(r=[30,20]);
+```
+
+```openscad-2D
+    oval(d=[60,40]);
+```
+
+Another way that `oval()` is enhanced over `circle()`, is that you can anchor,
+spin and attach it.
+
+```openscad-2D
+    oval(r=50, anchor=BACK);
+```
+
+```openscad-2D
+    oval(r=50, anchor=FRONT+RIGHT);
+```
+
+Using spin on a circle may not make initial sense, until you remember that
+anchoring is performed before spin:
+
+```openscad-2D
+    oval(r=50, anchor=FRONT, spin=-30);
+```
+
+
+### Trapezoids
+
+OpenSCAD doesn't provide a simple way to make 2D triangles, trapezoids, or parallelograms.
+The BOSL2 library can provide all of these shapes with the `trapezoid()` module.
+
+To make a simple triangle, just make one of the widths zero:
+
+```openscad-2D
+    trapezoid(w1=50, w2=0, h=50);
+```
+
+To make a right triangle, you need to use the `shift=` argument, to shift the back of the trapezoid along the X axis:
+
+```openscad-2D
+    trapezoid(w1=50, w2=0, h=50, shift=-25);
+```
+
+```openscad-2D
+    trapezoid(w1=50, w2=0, h=50, shift=25);
+```
+
+```openscad-2D
+    trapezoid(w1=0, w2=50, h=50, shift=-25);
+```
+
+```openscad-2D
+    trapezoid(w1=0, w2=50, h=50, shift=25);
+```
+
+You can make a trapezoid by specifying non-zero widths for both the front (`w1=`) and back (`w2=`):
+
+```openscad-2D
+    trapezoid(w1=30, w2=50, h=50);
+```
+
+A parallelogram is just a matter of using the same width for front and back, with a shift along the X axis:
+
+```openscad-2D
+    trapezoid(w1=50, w2=50, shift=20, h=50);
+```
+
+A quadrilateral can be made by having unequal, non-zero front (`w1=`) and back (`w2=`) widths, with the back shifted along the X axis:
+
+```openscad-2D
+    trapezoid(w1=50, w2=30, shift=20, h=50);
+```
+
+You can use `anchor=` and `spin=`, just like with other attachable shapes.  However, the anchor
+points are based on the side angles of the faces, and may not be where you expect them:
+
+```openscad-2D
+    trapezoid(w1=30, w2=50, h=50)
+        show_anchors();
+```
+
+### Regular N-Gons
+
+OpenSCAD lets you make regular N-gons (pentagon, hexagon, etc) by using `circle()` with `$fn`.
+While this is concise, it may be less than obvious at first glance:
+
+```openscad-2D
+    circle(d=50, $fn=5);
+```
+
+The BOSL2 library has modules that are named more clearly:
+
+```openscad-2D
+    pentagon(d=50);
+```
+
+```openscad-2D
+    hexagon(d=50);
+```
+
+```openscad-2D
+    octagon(d=50);
+```
+
+```openscad-2D
+    regular_ngon(n=7, d=50);
+```
+
+These modules also provide you with extra functionality.
+
+They can be sized by side length:
+
+```openscad-2D
+    pentagon(side=20);
+```
+
+They can be sized by circumscribed circle radius/diameter:
+
+```openscad-2D
+    pentagon(ir=25);
+    pentagon(id=50);
+```
+
+They can be realigned by half a side's angle:
+
+```openscad-2D
+    left(30)  pentagon(d=50, realign=true);
+    right(30) pentagon(d=50, realign=false);
+```
+
+They can be rounded:
+
+```openscad-2D
+    pentagon(d=50, rounding=10);
+```
+
+```openscad-2D
+    hexagon(d=50, rounding=10);
+```
+
+They also have somewhat different attachment behavior:
+
+```openscad-2D
+    color("green") stroke(circle(d=50), closed=true);
+    oval(d=50,$fn=5)
+        attach(LEFT) color("blue") anchor_arrow2d();
+```
+
+```openscad-2D
+    pentagon(d=50)
+        attach(LEFT) color("blue") anchor_arrow2d();
+```
+
+You can use `anchor=` and `spin=`, just like with other attachable shapes.  However, the anchor
+points are based on where the anchor vector would intersect the side of the N-gon, and may not
+be where you expect them:
+
+```openscad-2D
+    pentagon(d=50)
+        show_anchors(custom=false);
+```
+
+N-gons also have named anchor points for their sides and tips:
+
+```openscad-2D
+    pentagon(d=30)
+        show_anchors(std=false);
+```
+
+
+### Stars
+
+The BOSL2 library has stars as a basic supported shape.  They can have any number of points.
+You can specify a star's shape by point count, inner and outer vertex radius/diameters:
+
+```openscad-2D
+    star(n=3, id=10, d=50);
+```
+
+```openscad-2D
+    star(n=5, id=15, r=25);
+```
+
+```openscad-2D
+    star(n=10, id=30, d=50);
+```
+
+Or you can specify the star shape by point count and number of points to step:
+
+```openscad-2D
+    star(n=7, step=2, d=50);
+```
+
+```openscad-2D
+    star(n=7, step=3, d=50);
+```
+
+If the `realign=` argument is given a true value, then the star will be rotated by half a point angle:
+
+```openscad-2D
+    left(30) star(n=5, step=2, d=50);
+    right(30) star(n=5, step=2, d=50, realign=true);
+```
+
+The `align_tip=` argument can be given a vector so that you can align the first point in a specific direction:
+
+```openscad-2D
+    star(n=5, ir=15, or=30, align_tip=BACK+LEFT)
+        attach("tip0") color("blue") anchor_arrow2d();
+```
+
+```openscad-2D
+    star(n=5, ir=15, or=30, align_tip=BACK+RIGHT)
+        attach("tip0") color("blue") anchor_arrow2d();
+```
+
+Similarly, the first indentation or pit can be oriented towards a specific vector with `align_pit=`:
+
+
+```openscad-2D
+    star(n=5, ir=15, or=30, align_pit=BACK+LEFT)
+        attach("pit0") color("blue") anchor_arrow2d();
+```
+
+```openscad-2D
+    star(n=5, ir=15, or=30, align_pit=BACK+RIGHT)
+        attach("pit0") color("blue") anchor_arrow2d();
+```
+
+You can use `anchor=` and `spin=`, just like with other attachable shapes.  However, the anchor
+points are based on the furthest extents of the shape, and may not be where you expect them:
+
+```openscad-2D
+    star(n=5, step=2, d=50)
+        show_anchors(custom=false);
+```
+
+Stars also have named anchor points for their pits, tips, and midpoints between tips:
+
+```openscad-2D
+    star(n=5, step=2, d=40)
+        show_anchors(std=false);
+```
+
+
+
+### Teardrop2D
+
+Often when 3D printing, you may want to make a circular hole in a vertical wall.  If the hole is
+too big, however, the overhang at the top of the hole can cause problems with printing on an
+FDM/FFF printer.  If you don't want to use support material, you can just use the teardrop shape.
+The `teardrop2d()` module will let you make a 2D version of the teardrop shape, so that you can
+extrude it later:
+
+```openscad-2D
+    teardrop2d(r=20);
+```
+
+```openscad-2D
+    teardrop2d(d=50);
+```
+
+The default overhang angle is 45 degrees, but you can adjust that with the `ang=` argument:
+
+```openscad-2D
+    teardrop2d(d=50, ang=30);
+```
+
+If you prefer to flatten the top of the teardrop, to encourage bridging, you can use the `cap_h=`
+argument:
+
+```openscad-2D
+    teardrop2d(d=50, cap_h=25);
+```
+
+```openscad-2D
+    teardrop2d(d=50, ang=30, cap_h=30);
+```
+
+You can use `anchor=` and `spin=`, just like with other attachable shapes.  However, the anchor
+points are based on the furthest extents of the shape, and may not be where you expect them:
+
+```openscad-2D
+    teardrop2d(d=50, ang=30, cap_h=30)
+        show_anchors();
+```
+
+
+### Glued Circles
+
+A more unusal shape that BOSL2 provides is Glued Circles.  It's basically a pair of circles,
+connected by what looks like a gloopy glued miniscus:
+
+```openscad-2D
+    glued_circles(d=30, spread=40);
+```
+
+The `r=`/`d=` arguments can specify the radius or diameter of the two circles:
+
+```openscad-2D
+    glued_circles(r=20, spread=45);
+```
+
+```openscad-2D
+    glued_circles(d=40, spread=45);
+```
+
+The `spread=` argument specifies the distance between the centers of the two circles:
+
+```openscad-2D
+    glued_circles(d=30, spread=30);
+```
+
+```openscad-2D
+    glued_circles(d=30, spread=40);
+```
+
+The `tangent=` argument gives the angle of the tangent of the meniscus on the two circles:
+
+```openscad-2D
+    glued_circles(d=30, spread=30, tangent=45);
+```
+
+```openscad-2D
+    glued_circles(d=30, spread=30, tangent=20);
+```
+
+```openscad-2D
+    glued_circles(d=30, spread=30, tangent=-20);
+```
+
+One useful thing you can do is to string a few `glued_circle()`s in a line then extrude them to make a ribbed wall:
+
+```openscad-3D
+    $fn=36;  s=10;
+    linear_extrude(height=50,convexity=16,center=true)
+        xcopies(s*sqrt(2),n=3)
+            glued_circles(d=s, spread=s*sqrt(2), tangent=45);
+```
+
+You can use `anchor=` and `spin=`, just like with other attachable shapes.  However, the anchor
+points are based on the furthest extents of the shape, and may not be where you expect them:
+
+```openscad-2D
+    glued_circles(d=40, spread=40, tangent=45)
+        show_anchors();
+```
+
diff --git a/tutorials/Basic_Shapes.md b/tutorials/Shapes3d.md
similarity index 55%
rename from tutorials/Basic_Shapes.md
rename to tutorials/Shapes3d.md
index 9f848b5..c65f2c0 100644
--- a/tutorials/Basic_Shapes.md
+++ b/tutorials/Shapes3d.md
@@ -1,233 +1,13 @@
 # Basic Shapes Tutorial
 
 ## Primitives
-There are 5 built-in primitive shapes that OpenSCAD provides.
-`square()`, `circle()`, `cube()`, `cylinder()`, and `sphere()`.
-The BOSL2 library extends or provides alternative to these shapes so
+There are 3 built-in 3D primitive shapes that OpenSCAD provides: `cube()`, `cylinder()`,
+and `sphere()`.  The BOSL2 library extends and provides alternative to these shapes so
 that they support more features, and more ways to simply reorient them.
 
 
-### 2D Squares
-You can still use the built-in `square()` in the familiar ways that OpenSCAD provides:
-
-```openscad-2D
-    square(100, center=false);
-```
-
-```openscad-2D
-    square(100, center=true);
-```
-
-```openscad-2D
-    square([60,40], center=true);
-```
-
-The BOSL2 library provides an enhanced equivalent to `square()` called `rect()`.
-You can use it in the same way you use `square()`, but it also provides
-extended functionality. For example, it allows you to round the corners:
-
-```openscad-2D
-    rect([60,40], center=true, rounding=10);
-```
-
-Or chamfer them:
-
-```openscad-2D
-    rect([60,40], center=true, chamfer=10);
-```
-
-You can even specify *which* corners get rounded or chamfered.  If you pass a
-list of four size numbers to the `rounding=` or `chamfer=` arguments, it will
-give each corner its own size.  In order, it goes from the back-right (quadrant I)
-corner, counter-clockwise around to the back-left (quadrant II) corner, to the
-forward-left (quadrant III) corner, to the forward-right (quadrant IV) corner:
-
-```openscad-2DImgOnly
-    module text3d(text) color("black") text(
-        text=text, font="Times", size=10,
-        halign="center", valign="center"
-    );
-    translate([ 50, 50]) text3d("I");
-    translate([-50, 50]) text3d("II");
-    translate([-50,-50]) text3d("III");
-    translate([ 50,-50]) text3d("IV");
-    rect([90,80], center=true);
-```
-
-If a size is given as `0`, then there is no rounding and/or chamfering for
-that quadrant's corner:
-
-```openscad-2D
-    rect([60,40], center=true, rounding=[0,5,10,15]);
-```
-
-```openscad-2D
-    rect([60,40], center=true, chamfer=[0,5,10,15]);
-```
-
-You can give both `rounding=` and `chamfer=` arguments to mix rounding and
-chamfering, but only if you specify per corner.  If you want a rounding in
-a corner, specify a 0 chamfer for that corner, and vice versa:
-
-```openscad-2D
-    rect([60,40], center=true, rounding=[5,0,10,0], chamfer=[0,5,0,15]);
-```
-
-#### Anchors and Spin
-Another way that `rect()` is enhanced over `square()`, is that you can anchor,
-spin and attach it.
-
-The `anchor=` argument is an alternative to `center=`, which allows more
-alignment options.  It takes a vector as a value, pointing roughly towards
-the side or corner you want to align to the origin.  For example, to align
-the center of the back edge to the origin, set the anchor to `[0,1]`:
-
-```openscad-2D
-    rect([60,40], anchor=[0,1]);
-```
-
-To align the front right corner to the origin:
-
-```openscad-2D
-    rect([60,40], anchor=[1,-1]);
-```
-
-To center:
-
-```openscad-2D
-    rect([60,40], anchor=[0,0]);
-```
-
-To make it clearer when giving vectors, there are several standard vector
-constants defined:
-
-Constant | Direction | Value
--------- | --------- | -----------
-`LEFT`   | X-        | `[-1, 0, 0]`
-`RIGHT`  | X+        | `[ 1, 0, 0]`
-`FRONT`/`FORWARD`/`FWD` | Y- | `[ 0,-1, 0]`
-`BACK`   | Y+        | `[ 0, 1, 0]`
-`BOTTOM`/`BOT`/`BTM`/`DOWN` | Z- | `[ 0, 0,-1]` (3D only.)
-`TOP`/`UP` | Z+      | `[ 0, 0, 1]` (3D only.)
-`CENTER`/`CTR` | Centered | `[ 0, 0, 0]`
-
-Note that even though these are 3D vectors, you can use most of them,
-(except `UP`/`DOWN`, of course) for anchors in 2D shapes:
-
-```openscad-2D
-    rect([60,40], anchor=BACK);
-```
-
-```openscad-2D
-    rect([60,40], anchor=CENTER);
-```
-
-You can add vectors together to point to corners:
-
-```openscad-2D
-    rect([60,40], anchor=FRONT+RIGHT);
-```
-
-Finally, the `spin` argument can rotate the shape by a given number of degrees
-clockwise:
-
-```openscad-2D
-    rect([60,40], anchor=CENTER, spin=30);
-```
-
-Anchoring or centering is performed before the spin:
-
-```openscad-2D
-    rect([60,40], anchor=BACK, spin=30);
-```
-
-
-### 2D Circles
-The built-in `circle()` primitive can be used as expected:
-
-```openscad-2D
-    circle(r=50);
-```
-
-```openscad-2D
-    circle(d=100);
-```
-
-```openscad-2D
-    circle(d=100, $fn=8);
-```
-
-The BOSL2 library provides an enhanced equivalent of `circle()` called `oval()`.
-You can use it in the same way you use `circle()`, but it also provides
-extended functionality. For example, it allows more control over its size and
-orientation.
-
-Since a circle in OpenSCAD can only be approximated by a regular polygon with
-a number of straight sides, this can lead to size and shape inaccuracies.
-To counter this, the `realign=` and `circum=` arguments are also provided.
-
-The `realign=` argument, if set `true`, rotates the `oval()` by half the angle
-between the sides:
-
-```openscad-2D
-    oval(d=100, $fn=8, realign=true);
-```
-
-The `circum=` argument, if true, makes it so that the polygon forming the
-`oval()` circumscribes the ideal circle instead of inscribing it.
-
-Inscribing the ideal circle:
-
-```openscad-2D
-    difference() {
-        circle(d=100, $fn=360);
-        oval(d=100, $fn=8);
-    }
-```
-
-Circumscribing the ideal circle:
-
-```openscad-2D
-    difference() {
-        oval(d=100, $fn=8, circum=true);
-        circle(d=100, $fn=360);
-    }
-```
-
-The `oval()` module, as its name suggests, can be given separate X and Y radii
-or diameters.  To do this, just give `r=` or `d=` with a list of two radii or
-diameters:
-
-```openscad-2D
-    oval(r=[30,20]);
-```
-
-```openscad-2D
-    oval(d=[60,40]);
-```
-
-Another way that `oval()` is enhanced over `circle()`, is that you can anchor,
-spin and attach it.
-
-```openscad-2D
-    oval(r=50, anchor=BACK);
-```
-
-```openscad-2D
-    oval(r=50, anchor=FRONT+RIGHT);
-```
-
-Using spin on a circle may not make initial sense, until you remember that
-anchoring is performed before spin:
-
-```openscad-2D
-    oval(r=50, anchor=FRONT, spin=-30);
-```
-
-
 ### 3D Cubes
-BOSL2 overrides the built-in `cube()` module.  It still can be used as you
-expect from the built-in:
+BOSL2 overrides the built-in `cube()` module.  It still can be used as you expect from the built-in:
 
 ```openscad-3D
     cube(100);
@@ -243,7 +23,7 @@ expect from the built-in:
 
 It is also enhanced to allow you to anchor, spin, orient, and attach it.
 
-You can use `anchor=` similarly to how you use it with `square()` or `rect()`,
+You can use `anchor=` similarly to how you use it with `rect()` or `oval()`,
 except you can also anchor vertically in 3D, allowing anchoring to faces, edges,
 and corners:
 
@@ -546,11 +326,20 @@ The "stagger" style will stagger the triangulation of the vertical rows:
     spheroid(d=100, style="stagger", $fn=20);
 ```
 
-The "icosa"` style will make for roughly equal-sized triangles for the entire
-sphere surface:
+The "icosa" style will make for roughly equal-sized triangles for the entire
+sphere surface, based on subdividing an icosahedron.  This style will round the
+effective `$fn` to a multiple of 5 when constructing the spheroid:
 
 ```openscad-3D
     spheroid(d=100, style="icosa", $fn=20);
 ```
 
+The "octa" style will also make for roughly equal-sized triangles for the entire
+sphere surface, but based on subdividing an octahedron.  This is useful in that it
+guarantees vertices at the axis extrema.  This style will round the effective `$fn`
+to a multiple of 4 when constructing the spheroid:
+
+```openscad-3D
+    spheroid(d=100, style="octa", $fn=20);
+```
 
diff --git a/version.scad b/version.scad
index 15bdab9..b9ab152 100644
--- a/version.scad
+++ b/version.scad
@@ -8,7 +8,7 @@
 //////////////////////////////////////////////////////////////////////
 
 
-BOSL_VERSION = [2,0,486];
+BOSL_VERSION = [2,0,487];
 
 
 // Section: BOSL Library Version Functions

From 2b0a129212e36faed172ef2024deea796ff41e25 Mon Sep 17 00:00:00 2001
From: Garth Minette <gminette@gmail.com>
Date: Mon, 28 Dec 2020 02:12:21 -0800
Subject: [PATCH 06/22] Basic_Shapes.md -> Shapes2d & Shapes3d

---
 scripts/make_tutorials.sh | 2 +-
 version.scad              | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/scripts/make_tutorials.sh b/scripts/make_tutorials.sh
index 10ba8ae..9c0fee4 100755
--- a/scripts/make_tutorials.sh
+++ b/scripts/make_tutorials.sh
@@ -15,7 +15,7 @@ done
 if [[ "$FILES" != "" ]]; then
     PREVIEW_LIBS="$FILES"
 else
-    PREVIEW_LIBS="Transforms Distributors Basic_Shapes FractalTree"
+    PREVIEW_LIBS="Transforms Distributors Shapes2d Shapes3d Paths FractalTree"
 fi
 
 dir="$(basename $PWD)"
diff --git a/version.scad b/version.scad
index b9ab152..ce60d19 100644
--- a/version.scad
+++ b/version.scad
@@ -8,7 +8,7 @@
 //////////////////////////////////////////////////////////////////////
 
 
-BOSL_VERSION = [2,0,487];
+BOSL_VERSION = [2,0,488];
 
 
 // Section: BOSL Library Version Functions

From 70a924e7769b8c5b94f751602a313afcb76144c4 Mon Sep 17 00:00:00 2001
From: Garth Minette <gminette@gmail.com>
Date: Mon, 28 Dec 2020 02:46:33 -0800
Subject: [PATCH 07/22] Paths tutorial image fixes.

---
 tutorials/Paths.md | 42 +++++++++++++++++++++---------------------
 version.scad       |  2 +-
 2 files changed, 22 insertions(+), 22 deletions(-)

diff --git a/tutorials/Paths.md b/tutorials/Paths.md
index 68e5421..68963dd 100644
--- a/tutorials/Paths.md
+++ b/tutorials/Paths.md
@@ -4,8 +4,8 @@
 A number of advanced features in BOSL2 rely on paths, which are just ordered lists of points.
 
 First-off, some terminology:
-- A 2D point is a vectors of X and Y axis position values ie: `[3,4]` or `[7,-3]`.
-- A 3D point is a vectors of X, Y and Z axis position values ie: `[3,4,2]` or `[-7,5,3]`.
+- A 2D point is a vectors of X and Y axis position values.  ie: `[3,4]` or `[7,-3]`.
+- A 3D point is a vectors of X, Y and Z axis position values.  ie: `[3,4,2]` or `[-7,5,3]`.
 - A 2D path is simply a list of two or more 2D points.  ie: `[[5,7], [1,-5], [-5,6]]`
 - A 3D path is simply a list of two or more 3D points.  ie: `[[5,7,-1], [1,-5,3], [-5,6,1]]`
 - A polygon is a 2D (or planar 3D) path where the last point is assumed to connect to the first point.
@@ -298,74 +298,74 @@ To translate a path, you can just pass it to the `move()` (or up/down/left/right
 
 ```openscad-2D
     path = move([-15,-30], p=square(50,center=true));
-    stroke(path, endcap2="arrow2");
+    stroke(path, closed=true, endcap2="arrow2");
 ```
 
 ```openscad-2D
     path = fwd(30, p=square(50,center=true));
-    stroke(path, endcap2="arrow2");
+    stroke(path, closed=true, endcap2="arrow2");
 ```
 
 ```openscad-2D
     path = left(30, p=square(50,center=true));
-    stroke(path, endcap2="arrow2");
+    stroke(path, closed=true, endcap2="arrow2");
 ```
 
 To scale a path, you can just pass it to the `scale()` (or [xyz]scale) function in the `p=` argument:
 
 ```openscad-2D
     path = scale([1.5,0.75], p=square(50,center=true));
-    stroke(path, endcap2="arrow2");
+    stroke(path, closed=true, endcap2="arrow2");
 ```
 
 ```openscad-2D
     path = xscale(1.5, p=square(50,center=true));
-    stroke(path, endcap2="arrow2");
+    stroke(path, closed=true, endcap2="arrow2");
 ```
 
 ```openscad-2D
     path = yscale(1.5, p=square(50,center=true));
-    stroke(path, endcap2="arrow2");
+    stroke(path, closed=true, endcap2="arrow2");
 ```
 
 To rotate a path, just can pass it to the `rot()` (or [xyz]rot) function in the `p=` argument:
 
 ```openscad-2D
     path = rot(30, p=square(50,center=true));
-    stroke(path, endcap2="arrow2");
+    stroke(path, closed=true, endcap2="arrow2");
 ```
 
 ```openscad-2D
     path = zrot(30, p=square(50,center=true));
-    stroke(path, endcap2="arrow2");
+    stroke(path, closed=true, endcap2="arrow2");
 ```
 
 To mirror a path, just can pass it to the `mirror()` (or [xyz]flip) function in the `p=` argument:
 
 ```openscad-2D
-    path = mirror([1,1], p=trapezoid(w1=10, w2=0, h=5));
-    stroke(path, endcap2="arrow2");
+    path = mirror([1,1], p=trapezoid(w1=40, w2=10, h=25));
+    stroke(path, closed=true, endcap2="arrow2");
 ```
 
 ```openscad-2D
-    path = xflip(p=trapezoid(w1=10, w2=0, h=5));
-    stroke(path, endcap2="arrow2");
+    path = xflip(p=trapezoid(w1=40, w2=10, h=25));
+    stroke(path, closed=true, endcap2="arrow2");
 ```
 
 ```openscad-2D
-    path = yflip(p=trapezoid(w1=10, w2=0, h=5));
-    stroke(path, endcap2="arrow2");
+    path = yflip(p=trapezoid(w1=40, w2=10, h=25));
+    stroke(path, closed=true, endcap2="arrow2");
 ```
 
 You can get raw transformation matrices for various transformations by calling them like a function without a `p=` argument:
 
 ```openscad-2D
-    mat = move([5,10]);
+    mat = move([5,10,0]);
     multmatrix(mat) square(50,center=true);
 ```
 
 ```openscad-2D
-    mat = scale([1.5,0.75]);
+    mat = scale([1.5,0.75,1]);
     multmatrix(mat) square(50,center=true);
 ```
 
@@ -377,7 +377,7 @@ You can get raw transformation matrices for various transformations by calling t
 Raw transformation matrices can be multiplied together to precalculate a compound transformation.  For example, to scale a shape, then rotate it, then translate the result, you can do something like:
 
 ```openscad-2D
-    mat = move([5,10]) * rot(30, planar=true) * scale([1.5,0.75]);
+    mat = move([5,10,0]) * rot(30) * scale([1.5,0.75,1]);
     multmatrix(mat) square(50,center=true);
 ```
 
@@ -455,14 +455,14 @@ the BOSL2 library lets you perform those same operations on regions:
 ```openscad-2D
     rgn1 = [for (d=[40:-10:10]) circle(d=d)];
     rgn2 = [square([60,12], center=true)];
-    rgn = exclusive_or(rgn1, rgn2);
+    rgn = intersection(rgn1, rgn2);
     region(rgn);
 ```
 
 ```openscad-2D
     rgn1 = [for (d=[40:-10:10]) circle(d=d)];
     rgn2 = [square([60,12], center=true)];
-    rgn = intersection(rgn1, rgn2);
+    rgn = exclusive_or(rgn1, rgn2);
     region(rgn);
 ```
 
diff --git a/version.scad b/version.scad
index ce60d19..e34c880 100644
--- a/version.scad
+++ b/version.scad
@@ -8,7 +8,7 @@
 //////////////////////////////////////////////////////////////////////
 
 
-BOSL_VERSION = [2,0,488];
+BOSL_VERSION = [2,0,489];
 
 
 // Section: BOSL Library Version Functions

From 4af7fe8e05412ae476e2eded18dc98e777babbb9 Mon Sep 17 00:00:00 2001
From: Garth Minette <gminette@gmail.com>
Date: Mon, 28 Dec 2020 03:25:08 -0800
Subject: [PATCH 08/22] Make style=orig spheroid more accurately match built-in
 sphere.

---
 shapes.scad  | 4 ++--
 version.scad | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/shapes.scad b/shapes.scad
index 53149f6..0a984b9 100644
--- a/shapes.scad
+++ b/shapes.scad
@@ -1211,13 +1211,13 @@ module spheroid(r, d, circum=false, style="aligned", anchor=CENTER, spin=0, orie
     vsides = ceil(sides/2);
     attachable(anchor,spin,orient, r=r) {
         if (style=="orig") {
-            merids = [ for (i=[0:1:vsides]) 90-(i+0.5)*180/(vsides+1) ];
+            merids = [ for (i=[0:1:vsides-1]) 90-(i+0.5)*180/vsides ];
             path = [
                 let(a = merids[0]) [0, r*sin(a)],
                 for (a=merids) r * [cos(a), sin(a)],
                 let(a = select(merids,-1)) [0, r*sin(a)]
             ];
-            rotate_extrude(convexity=2,$fn=sides) polygon(path);
+            rotate(180) rotate_extrude(convexity=2,$fn=sides) polygon(path);
         } else {
             vnf = spheroid(r=r, circum=circum, style=style);
             vnf_polyhedron(vnf, convexity=2);
diff --git a/version.scad b/version.scad
index e34c880..9935ce7 100644
--- a/version.scad
+++ b/version.scad
@@ -8,7 +8,7 @@
 //////////////////////////////////////////////////////////////////////
 
 
-BOSL_VERSION = [2,0,489];
+BOSL_VERSION = [2,0,490];
 
 
 // Section: BOSL Library Version Functions

From 53fae5a3b29c66431459deb1c6d2144cf291560c Mon Sep 17 00:00:00 2001
From: Garth Minette <gminette@gmail.com>
Date: Mon, 28 Dec 2020 03:31:51 -0800
Subject: [PATCH 09/22] Improve orig sphere matching to builtin, at small
 scales.

---
 shapes.scad  | 8 ++++----
 version.scad | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/shapes.scad b/shapes.scad
index 0a984b9..31e35b1 100644
--- a/shapes.scad
+++ b/shapes.scad
@@ -1213,11 +1213,11 @@ module spheroid(r, d, circum=false, style="aligned", anchor=CENTER, spin=0, orie
         if (style=="orig") {
             merids = [ for (i=[0:1:vsides-1]) 90-(i+0.5)*180/vsides ];
             path = [
-                let(a = merids[0]) [0, r*sin(a)],
-                for (a=merids) r * [cos(a), sin(a)],
-                let(a = select(merids,-1)) [0, r*sin(a)]
+                let(a = merids[0]) [0, sin(a)],
+                for (a=merids) [cos(a), sin(a)],
+                let(a = select(merids,-1)) [0, sin(a)]
             ];
-            rotate(180) rotate_extrude(convexity=2,$fn=sides) polygon(path);
+            scale(r) rotate(180) rotate_extrude(convexity=2,$fn=sides) polygon(path);
         } else {
             vnf = spheroid(r=r, circum=circum, style=style);
             vnf_polyhedron(vnf, convexity=2);
diff --git a/version.scad b/version.scad
index 9935ce7..c4a8879 100644
--- a/version.scad
+++ b/version.scad
@@ -8,7 +8,7 @@
 //////////////////////////////////////////////////////////////////////
 
 
-BOSL_VERSION = [2,0,490];
+BOSL_VERSION = [2,0,491];
 
 
 // Section: BOSL Library Version Functions

From 69124938a6d4eec9a905e6326a0dcfc678d11ba1 Mon Sep 17 00:00:00 2001
From: Garth Minette <gminette@gmail.com>
Date: Tue, 29 Dec 2020 21:02:46 -0800
Subject: [PATCH 10/22] Added planer=true to minkowski_difference() and
 bounding_box().  Refactored shell2d().

---
 mutators.scad | 229 ++++++++++++++++++++++++++------------------------
 version.scad  |   2 +-
 2 files changed, 121 insertions(+), 110 deletions(-)

diff --git a/mutators.scad b/mutators.scad
index 80b9752..1e54c6f 100644
--- a/mutators.scad
+++ b/mutators.scad
@@ -19,6 +19,7 @@
 //   Returns an axis-aligned cube shape that exactly contains all the 3D children given.
 // Arguments:
 //   excess = The amount that the bounding box should be larger than needed to bound the children, in each axis.
+//   planar = If true, creates a 2D bounding rectangle.  Is false, creates a 3D bounding cube.  Default: false
 // Example:
 //   #bounding_box() {
 //       translate([10,8,4]) cube(5);
@@ -26,32 +27,41 @@
 //   }
 //   translate([10,8,4]) cube(5);
 //   translate([3,0,12]) cube(2);
-module bounding_box(excess=0) {
+module bounding_box(excess=0, planar=true) {
     xs = excess>.1? excess : 1;
     // a 3D approx. of the children projection on X axis
     module _xProjection()
-        linear_extrude(xs, center=true)
+        if (planar) {
             projection()
                 rotate([90,0,0])
                     linear_extrude(xs, center=true)
-                        projection()
-                            hull()
-                                children();
+                        hull()
+                            children();
+        } else {
+            linear_extrude(xs, center=true)
+                projection()
+                    rotate([90,0,0])
+                        linear_extrude(xs, center=true)
+                            projection()
+                                hull()
+                                    children();
+        }
 
     // a bounding box with an offset of 1 in all axis
     module _oversize_bbox() {
         minkowski() {
             _xProjection() children(); // x axis
-            rotate(-90) _xProjection() rotate(90) children(); // y axis
-            rotate([0,-90,0]) _xProjection() rotate([0,90,0]) children(); // z axis
+            union() {
+                rotate(-90) _xProjection() rotate(90) children(); // y axis
+                if(!planar) rotate([0,-90,0]) _xProjection() rotate([0,90,0]) children(); // z axis
+            }
         }
     }
 
-    // offset children() (a cube) by -1 in all axis
     module _shrink_cube() {
         intersection() {
-            translate((1-excess)*[ 1, 1, 1]) children();
-            translate((1-excess)*[-1,-1,-1]) children();
+            translate((1-excess)*[ 1, 1, planar?0: 1]) children();
+            translate((1-excess)*[-1,-1, planar?0:-1]) children();
         }
     }
 
@@ -209,7 +219,6 @@ function left_half(_arg1=_undef, _arg2=_undef, _arg3=_undef,
 //   right_half([s], [x]) ...
 //   right_half(planar=true, [s], [x]) ...
 //
-//
 // Description:
 //   Slices an object at a vertical Y-Z cut plane, and masks away everything that is left of it.
 //
@@ -516,31 +525,103 @@ module cylindrical_extrude(or, ir, od, id, size=1000, convexity=10, spin=0, orie
 // Section: Offset Mutators
 //////////////////////////////////////////////////////////////////////
 
-// Module: round3d()
+// Module: minkowski_difference()
 // Usage:
-//   round3d(r) ...
-//   round3d(or) ...
-//   round3d(ir) ...
-//   round3d(or, ir) ...
+//   minkowski_difference() { base_shape(); diff_shape(); ... }
 // Description:
-//   Rounds arbitrary 3D objects.  Giving `r` rounds all concave and convex corners.  Giving just `ir`
+//   Takes a 3D base shape and one or more 3D diff shapes, carves out the diff shapes from the
+//   surface of the base shape, in a way complementary to how `minkowski()` unions shapes to the
+//   surface of its base shape.
+// Arguments:
+//   planar = If true, performs minkowski difference in 2D.  Default: false (3D)
+// Example:
+//   minkowski_difference() {
+//       union() {
+//           cube([120,70,70], center=true);
+//           cube([70,120,70], center=true);
+//           cube([70,70,120], center=true);
+//       }
+//       sphere(r=10);
+//   }
+module minkowski_difference(planar=false) {
+    difference() {
+        bounding_box(excess=0, planar=planar) children(0);
+        render(convexity=20) {
+            minkowski() {
+                difference() {
+                    bounding_box(excess=1, planar=planar) children(0);
+                    children(0);
+                }
+                for (i=[1:1:$children-1]) children(i);
+            }
+        }
+    }
+}
+
+
+// Module: round2d()
+// Usage:
+//   round2d(r) ...
+//   round2d(or) ...
+//   round2d(ir) ...
+//   round2d(or, ir) ...
+// Description:
+//   Rounds arbitrary 2D objects.  Giving `r` rounds all concave and convex corners.  Giving just `ir`
 //   rounds just concave corners.  Giving just `or` rounds convex corners.  Giving both `ir` and `or`
-//   can let you round to different radii for concave and convex corners.  The 3D object must not have
-//   any parts narrower than twice the `or` radius.  Such parts will disappear.  This is an *extremely*
-//   slow operation.  I cannot emphasize enough just how slow it is.  It uses `minkowski()` multiple times.
-//   Use this as a last resort.  This is so slow that no example images will be rendered.
+//   can let you round to different radii for concave and convex corners.  The 2D object must not have
+//   any parts narrower than twice the `or` radius.  Such parts will disappear.
 // Arguments:
 //   r = Radius to round all concave and convex corners to.
 //   or = Radius to round only outside (convex) corners to.  Use instead of `r`.
 //   ir = Radius to round only inside (concave) corners to.  Use instead of `r`.
-module round3d(r, or, ir, size=100)
+// Examples(2D):
+//   round2d(r=10) {square([40,100], center=true); square([100,40], center=true);}
+//   round2d(or=10) {square([40,100], center=true); square([100,40], center=true);}
+//   round2d(ir=10) {square([40,100], center=true); square([100,40], center=true);}
+//   round2d(or=16,ir=8) {square([40,100], center=true); square([100,40], center=true);}
+module round2d(r, or, ir)
 {
     or = get_radius(r1=or, r=r, dflt=0);
     ir = get_radius(r1=ir, r=r, dflt=0);
-    offset3d(or, size=size)
-        offset3d(-ir-or, size=size)
-            offset3d(ir, size=size)
+    offset(or) offset(-ir-or) offset(delta=ir,chamfer=true) children();
+}
+
+
+// Module: shell2d()
+// Usage:
+//   shell2d(thickness, [or], [ir], [fill], [round])
+// Description:
+//   Creates a hollow shell from 2D children, with optional rounding.
+// Arguments:
+//   thickness = Thickness of the shell.  Positive to expand outward, negative to shrink inward, or a two-element list to do both.
+//   or = Radius to round corners on the outside of the shell.  If given a list of 2 radii, [CONVEX,CONCAVE], specifies the radii for convex and concave corners separately.  Default: 0 (no outside rounding)
+//   ir = Radius to round corners on the inside of the shell.  If given a list of 2 radii, [CONVEX,CONCAVE], specifies the radii for convex and concave corners separately.  Default: 0 (no inside rounding)
+// Examples(2D):
+//   shell2d(10) {square([40,100], center=true); square([100,40], center=true);}
+//   shell2d(-10) {square([40,100], center=true); square([100,40], center=true);}
+//   shell2d([-10,10]) {square([40,100], center=true); square([100,40], center=true);}
+//   shell2d(10,or=10) {square([40,100], center=true); square([100,40], center=true);}
+//   shell2d(10,ir=10) {square([40,100], center=true); square([100,40], center=true);}
+//   shell2d(10,round=10) {square([40,100], center=true); square([100,40], center=true);}
+//   shell2d(10,fill=10) {square([40,100], center=true); square([100,40], center=true);}
+//   shell2d(8,or=16,ir=8,round=16,fill=8) {square([40,100], center=true); square([100,40], center=true);}
+module shell2d(thickness, or=0, ir=0)
+{
+    thickness = is_num(thickness)? (
+        thickness<0? [thickness,0] : [0,thickness]
+    ) : (thickness[0]>thickness[1])? (
+        [thickness[1],thickness[0]]
+    ) : thickness;
+    orad = is_finite(or)? [or,or] : or;
+    irad = is_finite(ir)? [ir,ir] : ir;
+    difference() {
+        round2d(or=orad[0],ir=orad[1])
+            offset(delta=thickness[1])
                 children();
+        round2d(or=irad[1],ir=irad[0])
+            offset(delta=thickness[0])
+                children();
+    }
 }
 
 
@@ -583,101 +664,31 @@ module offset3d(r=1, size=100, convexity=10) {
 }
 
 
-// Module: round2d()
+// Module: round3d()
 // Usage:
-//   round2d(r) ...
-//   round2d(or) ...
-//   round2d(ir) ...
-//   round2d(or, ir) ...
+//   round3d(r) ...
+//   round3d(or) ...
+//   round3d(ir) ...
+//   round3d(or, ir) ...
 // Description:
-//   Rounds arbitrary 2D objects.  Giving `r` rounds all concave and convex corners.  Giving just `ir`
+//   Rounds arbitrary 3D objects.  Giving `r` rounds all concave and convex corners.  Giving just `ir`
 //   rounds just concave corners.  Giving just `or` rounds convex corners.  Giving both `ir` and `or`
-//   can let you round to different radii for concave and convex corners.  The 2D object must not have
-//   any parts narrower than twice the `or` radius.  Such parts will disappear.
+//   can let you round to different radii for concave and convex corners.  The 3D object must not have
+//   any parts narrower than twice the `or` radius.  Such parts will disappear.  This is an *extremely*
+//   slow operation.  I cannot emphasize enough just how slow it is.  It uses `minkowski()` multiple times.
+//   Use this as a last resort.  This is so slow that no example images will be rendered.
 // Arguments:
 //   r = Radius to round all concave and convex corners to.
 //   or = Radius to round only outside (convex) corners to.  Use instead of `r`.
 //   ir = Radius to round only inside (concave) corners to.  Use instead of `r`.
-// Examples(2D):
-//   round2d(r=10) {square([40,100], center=true); square([100,40], center=true);}
-//   round2d(or=10) {square([40,100], center=true); square([100,40], center=true);}
-//   round2d(ir=10) {square([40,100], center=true); square([100,40], center=true);}
-//   round2d(or=16,ir=8) {square([40,100], center=true); square([100,40], center=true);}
-module round2d(r, or, ir)
+module round3d(r, or, ir, size=100)
 {
     or = get_radius(r1=or, r=r, dflt=0);
     ir = get_radius(r1=ir, r=r, dflt=0);
-    offset(or) offset(-ir-or) offset(delta=ir,chamfer=true) children();
-}
-
-
-// Module: shell2d()
-// Usage:
-//   shell2d(thickness, [or], [ir], [fill], [round])
-// Description:
-//   Creates a hollow shell from 2D children, with optional rounding.
-// Arguments:
-//   thickness = Thickness of the shell.  Positive to expand outward, negative to shrink inward, or a two-element list to do both.
-//   or = Radius to round convex corners/pointy bits on the outside of the shell.
-//   ir = Radius to round concave corners on the outside of the shell.
-//   round = Radius to round convex corners/pointy bits on the inside of the shell.
-//   fill = Radius to round concave corners on the inside of the shell.
-// Examples(2D):
-//   shell2d(10) {square([40,100], center=true); square([100,40], center=true);}
-//   shell2d(-10) {square([40,100], center=true); square([100,40], center=true);}
-//   shell2d([-10,10]) {square([40,100], center=true); square([100,40], center=true);}
-//   shell2d(10,or=10) {square([40,100], center=true); square([100,40], center=true);}
-//   shell2d(10,ir=10) {square([40,100], center=true); square([100,40], center=true);}
-//   shell2d(10,round=10) {square([40,100], center=true); square([100,40], center=true);}
-//   shell2d(10,fill=10) {square([40,100], center=true); square([100,40], center=true);}
-//   shell2d(8,or=16,ir=8,round=16,fill=8) {square([40,100], center=true); square([100,40], center=true);}
-module shell2d(thickness, or=0, ir=0, fill=0, round=0)
-{
-    thickness = is_num(thickness)? (
-        thickness<0? [thickness,0] : [0,thickness]
-    ) : (thickness[0]>thickness[1])? (
-        [thickness[1],thickness[0]]
-    ) : thickness;
-    difference() {
-        round2d(or=or,ir=ir)
-            offset(delta=thickness[1])
+    offset3d(or, size=size)
+        offset3d(-ir-or, size=size)
+            offset3d(ir, size=size)
                 children();
-        round2d(or=fill,ir=round)
-            offset(delta=thickness[0])
-                children();
-    }
-}
-
-
-// Module: minkowski_difference()
-// Usage:
-//   minkowski_difference() { base_shape(); diff_shape(); ... }
-// Description:
-//   Takes a 3D base shape and one or more 3D diff shapes, carves out the diff shapes from the
-//   surface of the base shape, in a way complementary to how `minkowski()` unions shapes to the
-//   surface of its base shape.
-// Example:
-//   minkowski_difference() {
-//       union() {
-//           cube([120,70,70], center=true);
-//           cube([70,120,70], center=true);
-//           cube([70,70,120], center=true);
-//       }
-//       sphere(r=10);
-//   }
-module minkowski_difference() {
-    difference() {
-        bounding_box(excess=0) children(0);
-        render(convexity=10) {
-            minkowski() {
-                difference() {
-                    bounding_box(excess=1) children(0);
-                    children(0);
-                }
-                for (i=[1:1:$children-1]) children(i);
-            }
-        }
-    }
 }
 
 
diff --git a/version.scad b/version.scad
index e533b27..9757673 100644
--- a/version.scad
+++ b/version.scad
@@ -8,7 +8,7 @@
 //////////////////////////////////////////////////////////////////////
 
 
-BOSL_VERSION = [2,0,482];
+BOSL_VERSION = [2,0,483];
 
 
 // Section: BOSL Library Version Functions

From a9c3b1f244d21cf13fe99d0408deaff7a83884c6 Mon Sep 17 00:00:00 2001
From: Garth Minette <gminette@gmail.com>
Date: Tue, 29 Dec 2020 21:08:41 -0800
Subject: [PATCH 11/22] Initial mutators tutorial.

---
 tutorials/Mutators.md | 273 ++++++++++++++++++++++++++++++++++++++++++
 version.scad          |   2 +-
 2 files changed, 274 insertions(+), 1 deletion(-)
 create mode 100644 tutorials/Mutators.md

diff --git a/tutorials/Mutators.md b/tutorials/Mutators.md
new file mode 100644
index 0000000..1b0df85
--- /dev/null
+++ b/tutorials/Mutators.md
@@ -0,0 +1,273 @@
+# Mutators Tutorial
+
+<!-- TOC -->
+
+## 3D Space Halving
+Sometimes you want to take a 3D shape like a sphere, and cut it in half.
+The BOSL2 library provides a number of ways to do this:
+
+```openscad
+    left_half() sphere(d=100);
+```
+
+```openscad
+    right_half() sphere(d=100);
+```
+
+```openscad
+    front_half() sphere(d=100);
+```
+
+```openscad
+    back_half() sphere(d=100);
+```
+
+```openscad
+    bottom_half() sphere(d=100);
+```
+
+```openscad
+    top_half() sphere(d=100);
+```
+
+You can use the `half_of()` module if you want to split space in a way not aligned with an axis:
+
+```openscad
+    half_of([-1,0,-1]) sphere(d=100);
+```
+
+The plane of dissection can be shifted along the axis of any of these operators:
+
+```openscad
+    left_half(x=20) sphere(d=100);
+```
+
+```openscad
+    back_half(y=-20) sphere(d=100);
+```
+
+```openscad
+    bottom_half(y=20) sphere(d=100);
+```
+
+```openscad
+    half_of([-1,0,-1], cp=[20,0,20]) sphere(d=100);
+```
+
+By default, these operators can be applied to objects that fit in a cube 1000 on a side. If you need
+to apply these halving operators to objects larger than this, you can give the size in the `s=`
+argument:
+
+```openscad
+    bottom_half(s=2000) sphere(d=1500);
+```
+
+## 2D Plane Halving
+To cut 2D shapes in half, you will need to add the `planar=true` argument:
+
+```openscad
+    left_half(planar=true) circle(d=100);
+```
+
+```openscad
+    right_half(planar=true) circle(d=100);
+```
+
+```openscad
+    front_half(planar=true) circle(d=100);
+```
+
+```openscad
+    back_half(planar=true) circle(d=100);
+```
+
+## Chained Mutators
+If you have a set of shapes that you want to do pair-wise hulling of, you can use `chain_hull()`:
+
+```openscad
+    chain_hull() {
+        cube(5, center=true);
+        translate([30, 0, 0]) sphere(d=15);
+        translate([60, 30, 0]) cylinder(d=10, h=20);
+        translate([60, 60, 0]) cube([10,1,20], center=false);
+    }
+```
+
+## Extrusion Mutators
+The OpenSCAD `linear_extrude()` module can take a 2D shape and extrude it vertically in a line:
+
+```openscad
+    linear_extrude(height=30) zrot(45) square(40,center=true);
+```
+
+The `rotate_extrude()` module can take a 2D shape and rotate it around the Z axis.
+
+```openscad
+    linear_extrude(height=30) left(30) zrot(45) square(40,center=true);
+```
+
+In a similar manner, the BOSL2 `cylindrical_extrude()` module can take a 2d shape and extrude it
+out radially from the center of a cylinder:
+
+```openscad
+    cylindrical_extrude(or=40, ir=35)
+        text(text="Hello World!", size=10, halign="center", valign="center");
+```
+
+
+## Offset Mutators
+
+### Minkowski Difference
+Openscad provides the `minkowski()` module to trace a shape over the entire surface of another shape:
+
+```openscad
+    minkowski() {
+        union() {
+            cube([100,33,33], center=true);
+            cube([33,100,33], center=true);
+            cube([33,33,100], center=true);
+        }
+        sphere(r=8);
+    }
+```
+
+However, it doesn't provide the inverse of this operation; to remove a shape from the entire surface
+of another object.  For this, the BOSL2 library provides the `minkowski_difference()` module:
+
+```openscad
+    minkowski_difference() {
+        union() {
+            cube([100,33,33], center=true);
+            cube([33,100,33], center=true);
+            cube([33,33,100], center=true);
+        }
+        sphere(r=8);
+    }
+```
+
+To perform a `minkowski_difference()` on 2D shapes, you need to supply the `planar=true` argument:
+
+```openscad-2D
+    minkowski_difference(planar=true) {
+        union() {
+            square([100,33], center=true);
+            square([33,100], center=true);
+        }
+        circle(r=8);
+    }
+```
+
+### Round2d
+The `round2d()` module lets you take a 2D shape and round inside and outside corners.  The inner concave corners are rounded to the radius `ir=`, while the outer convex corners are rounded to the radius `or=`:
+
+```openscad-2D
+    round2d(or=8) star(6, step=2, d=100);
+```
+
+```openscad-2D
+    round2d(ir=12) star(6, step=2, d=100);
+```
+
+```openscad-2D
+    round2d(or=8,ir=12) star(6, step=2, d=100);
+```
+
+You can use `r=` to effectively set both `ir=` and `or=` to the same value:
+
+```openscad-2D
+    round2d(r=8) star(6, step=2, d=100);
+```
+
+### Shell2d
+With the `shell2d()` module, you can take an arbitrary shape, and get the shell outline of it.
+With a positive thickness, the shell is offset outwards from the original shape:
+
+```openscad-2D
+    shell2d(thickness=5) star(5,step=2,d=100);
+    color("blue") stroke(star(5,step=2,d=100),closed=true);
+```
+
+With a negative thickness, the shell if inset from the original shape:
+
+```openscad-2D
+    shell2d(thickness=-5) star(5,step=2,d=100);
+    color("blue") stroke(star(5,step=2,d=100),closed=true);
+```
+
+You can give a pair of thickness values if you want it both inset and outset from the original shape:
+
+```openscad-2D
+    shell2d(thickness=[-5,5]) star(5,step=2,d=100);
+    color("blue") stroke(star(5,step=2,d=100),closed=true);
+```
+
+You can add rounding to the outside by passing a radius to the `or=` argument.
+
+```openscad-2D
+    shell2d(thickness=-5,or=5) star(5,step=2,d=100);
+```
+
+If you need to pass different radii for the convex and concave corners of the outside, you can pass them as `or=[CONVEX,CONCAVE]`:
+
+```openscad-2D
+    shell2d(thickness=-5,or=[5,10]) star(5,step=2,d=100);
+```
+
+A radius of 0 can be used to specify no rounding:
+
+```openscad-2D
+    shell2d(thickness=-5,or=[5,0]) star(5,step=2,d=100);
+```
+
+You can add rounding to the inside by passing a radius to the `ir=` argument.
+
+```openscad-2D
+    shell2d(thickness=-5,ir=5) star(5,step=2,d=100);
+```
+
+If you need to pass different radii for the convex and concave corners of the inside, you can pass them as `ir=[CONVEX,CONCAVE]`:
+
+```openscad-2D
+    shell2d(thickness=-5,ir=[8,3]) star(5,step=2,d=100);
+```
+
+You can use `or=` and `ir=` together to get nice combined rounding effects:
+
+```openscad-2D
+    shell2d(thickness=-5,or=[7,2],ir=[7,2]) star(5,step=2,d=100);
+```
+
+```openscad-2D
+    shell2d(thickness=-5,or=[5,0],ir=[5,0]) star(5,step=2,d=100);
+```
+
+
+### Round3d
+### Offset3d
+(To be Written)
+
+
+## Color Manipulators
+The built-in OpenSCAD `color()` module can let you set the RGB color of an object, but it's often
+easier to select colors using other color schemes.  You can use the HSL or Hue-Saturation-Lightness
+color scheme with the `HSL()` module:
+
+```openscad
+    for (h=[0:0.1:1], s=[0:0.1:1], l=[0:0.1:1]) {
+        translate(100*[h,s,l]) {
+            HSL(h*360,1-s,l) cube(10,center=true);
+        }
+    }
+```
+
+You can use the HSV or Hue-Saturation-Value color scheme with the `HSV()` module:
+
+```openscad
+    for (h=[0:0.1:1], s=[0:0.1:1], v=[0:0.1:1]) {
+        translate(100*[h,s,v]) {
+            HSV(h*360,1-s,v) cube(10,center=true);
+        }
+    }
+```
+
+
diff --git a/version.scad b/version.scad
index 1c6817a..e704828 100644
--- a/version.scad
+++ b/version.scad
@@ -8,7 +8,7 @@
 //////////////////////////////////////////////////////////////////////
 
 
-BOSL_VERSION = [2,0,492];
+BOSL_VERSION = [2,0,493];
 
 
 // Section: BOSL Library Version Functions

From 36298b38d6118ec1ae609d71ff1585e2d669c94b Mon Sep 17 00:00:00 2001
From: Garth Minette <gminette@gmail.com>
Date: Tue, 29 Dec 2020 21:21:12 -0800
Subject: [PATCH 12/22] Added Mutators tutorial to generation list.

---
 scripts/make_tutorials.sh | 2 +-
 version.scad              | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/scripts/make_tutorials.sh b/scripts/make_tutorials.sh
index 9c0fee4..b99fb65 100755
--- a/scripts/make_tutorials.sh
+++ b/scripts/make_tutorials.sh
@@ -15,7 +15,7 @@ done
 if [[ "$FILES" != "" ]]; then
     PREVIEW_LIBS="$FILES"
 else
-    PREVIEW_LIBS="Transforms Distributors Shapes2d Shapes3d Paths FractalTree"
+    PREVIEW_LIBS="Shapes2d Shapes3d Transforms Distributors Mutators Paths FractalTree"
 fi
 
 dir="$(basename $PWD)"
diff --git a/version.scad b/version.scad
index e704828..1a85679 100644
--- a/version.scad
+++ b/version.scad
@@ -8,7 +8,7 @@
 //////////////////////////////////////////////////////////////////////
 
 
-BOSL_VERSION = [2,0,493];
+BOSL_VERSION = [2,0,494];
 
 
 // Section: BOSL Library Version Functions

From 1a9b683890336f2d5b0b7fb5c41b726db3a50305 Mon Sep 17 00:00:00 2001
From: Garth Minette <gminette@gmail.com>
Date: Tue, 29 Dec 2020 21:23:02 -0800
Subject: [PATCH 13/22] Bottom half example fix.

---
 tutorials/Mutators.md | 2 +-
 version.scad          | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/tutorials/Mutators.md b/tutorials/Mutators.md
index 1b0df85..3ad3eb1 100644
--- a/tutorials/Mutators.md
+++ b/tutorials/Mutators.md
@@ -47,7 +47,7 @@ The plane of dissection can be shifted along the axis of any of these operators:
 ```
 
 ```openscad
-    bottom_half(y=20) sphere(d=100);
+    bottom_half(z=20) sphere(d=100);
 ```
 
 ```openscad
diff --git a/version.scad b/version.scad
index 1a85679..10ffe9c 100644
--- a/version.scad
+++ b/version.scad
@@ -8,7 +8,7 @@
 //////////////////////////////////////////////////////////////////////
 
 
-BOSL_VERSION = [2,0,494];
+BOSL_VERSION = [2,0,495];
 
 
 // Section: BOSL Library Version Functions

From 6fb034301606e2d7e61786b82cbf6f75ea914dab Mon Sep 17 00:00:00 2001
From: Garth Minette <gminette@gmail.com>
Date: Tue, 29 Dec 2020 22:04:47 -0800
Subject: [PATCH 14/22] minkowski_difference() 3d bugfix.

---
 mutators.scad | 13 +++++++++----
 version.scad  |  2 +-
 2 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/mutators.scad b/mutators.scad
index 1e54c6f..2a2556f 100644
--- a/mutators.scad
+++ b/mutators.scad
@@ -49,11 +49,16 @@ module bounding_box(excess=0, planar=true) {
 
     // a bounding box with an offset of 1 in all axis
     module _oversize_bbox() {
-        minkowski() {
-            _xProjection() children(); // x axis
-            union() {
+        if (planar) {
+            minkowski() {
+                _xProjection() children(); // x axis
                 rotate(-90) _xProjection() rotate(90) children(); // y axis
-                if(!planar) rotate([0,-90,0]) _xProjection() rotate([0,90,0]) children(); // z axis
+            }
+        } else {
+            minkowski() {
+                _xProjection() children(); // x axis
+                rotate(-90) _xProjection() rotate(90) children(); // y axis
+                rotate([0,-90,0]) _xProjection() rotate([0,90,0]) children(); // z axis
             }
         }
     }
diff --git a/version.scad b/version.scad
index 10ffe9c..ae8cf68 100644
--- a/version.scad
+++ b/version.scad
@@ -8,7 +8,7 @@
 //////////////////////////////////////////////////////////////////////
 
 
-BOSL_VERSION = [2,0,495];
+BOSL_VERSION = [2,0,496];
 
 
 // Section: BOSL Library Version Functions

From 0299270f6a3c82973d2474fa61b640a1379b60ef Mon Sep 17 00:00:00 2001
From: Garth Minette <gminette@gmail.com>
Date: Wed, 30 Dec 2020 00:34:25 -0800
Subject: [PATCH 15/22] Added rounding and chamfering to trapezoid()

---
 paths.scad    | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++
 shapes2d.scad |  60 ++++++++++++++------
 version.scad  |   2 +-
 3 files changed, 197 insertions(+), 17 deletions(-)

diff --git a/paths.scad b/paths.scad
index fe14a50..0588310 100644
--- a/paths.scad
+++ b/paths.scad
@@ -407,6 +407,158 @@ function path_torsion(path, closed=false) =
     ];
 
 
+// Function: path_chamfer_and_rounding()
+// Usage:
+//   path2 = path_chamfer_and_rounding(path, [closed], [chamfer], [rounding]);
+// Description:
+//   Rounds or chamfers corners in the given path.
+// Arguments:
+//   path = The path to chamfer and/or round.
+//   closed = If true, treat path like a closed polygon.  Default: true
+//   chamfer = The length of the chamfer faces at the corners.  If given as a list of numbers, gives individual chamfers for each corner, from first to last.  Default: 0 (no chamfer)
+//   rounding = The rounding radius for the corners.  If given as a list of numbers, gives individual radii for each corner, from first to last.  Default: 0 (no rounding)
+// Example(2D): Chamfering a Path
+//   path = star(5, step=2, d=100);
+//   path2 = path_chamfer_and_rounding(path, closed=true, chamfer=5);
+//   stroke(path2, closed=true);
+// Example(2D): Per-Corner Chamfering
+//   path = star(5, step=2, d=100);
+//   chamfs = [for (i=[0:1:4]) each 3*[i,i]];
+//   path2 = path_chamfer_and_rounding(path, closed=true, chamfer=chamfs);
+//   stroke(path2, closed=true);
+// Example(2D): Rounding a Path
+//   path = star(5, step=2, d=100);
+//   path2 = path_chamfer_and_rounding(path, closed=true, rounding=5);
+//   stroke(path2, closed=true);
+// Example(2D): Per-Corner Chamfering
+//   path = star(5, step=2, d=100);
+//   rs = [for (i=[0:1:4]) each 3*[i,i]];
+//   path2 = path_chamfer_and_rounding(path, closed=true, rounding=rs);
+//   stroke(path2, closed=true);
+// Example(2D): Mixing Chamfers and Roundings
+//   path = star(5, step=2, d=100);
+//   chamfs = [for (i=[0:4]) each [5,0]];
+//   rs = [for (i=[0:4]) each [0,10]];
+//   path2 = path_chamfer_and_rounding(path, closed=true, chamfer=chamfs, rounding=rs);
+//   stroke(path2, closed=true);
+function path_chamfer_and_rounding(path, closed, chamfer, rounding) =
+	let (
+		path = deduplicate(path,closed=true),
+		lp = len(path),
+		chamfer = is_undef(chamfer)? repeat(0,lp) :
+			is_vector(chamfer)? list_pad(chamfer,lp,0) :
+			is_num(chamfer)? repeat(chamfer,lp) :
+			assert(false, "Bad chamfer value."),
+		rounding = is_undef(rounding)? repeat(0,lp) :
+			is_vector(rounding)? list_pad(rounding,lp,0) :
+			is_num(rounding)? repeat(rounding,lp) :
+			assert(false, "Bad rounding value."),
+		corner_paths = [
+			for (i=(closed? [0:1:lp-1] : [1:1:lp-2])) let(
+				p1 = select(path,i-1),
+				p2 = select(path,i),
+				p3 = select(path,i+1)
+			)
+			chamfer[i]  > 0? _corner_chamfer_path(p1, p2, p3, side=chamfer[i]) :
+			rounding[i] > 0? _corner_roundover_path(p1, p2, p3, r=rounding[i]) :
+			[p2]
+		],
+		out = [
+			if (!closed) path[0],
+			for (i=(closed? [0:1:lp-1] : [1:1:lp-2])) let(
+				p1 = select(path,i-1),
+				p2 = select(path,i),
+				crn1 = select(corner_paths,i-1),
+				crn2 = corner_paths[i],
+				l1 = norm(select(crn1,-1)-p1),
+				l2 = norm(crn2[0]-p2),
+				needed = l1 + l2,
+				seglen = norm(p2-p1),
+				check = assert(seglen >= needed, str("Path segment ",i," is too short to fulfill rounding/chamfering for the adjacent corners."))
+			) each crn2,
+			if (!closed) select(path,-1)
+		]
+	) deduplicate(out);
+
+
+function _corner_chamfer_path(p1, p2, p3, dist1, dist2, side, angle) = 
+	let(
+		v1 = unit(p1 - p2),
+		v2 = unit(p3 - p2),
+		n = vector_axis(v1,v2),
+		ang = vector_angle(v1,v2),
+		path = (is_num(dist1) && is_undef(dist2) && is_undef(side))? (
+			// dist1 & optional angle
+			assert(dist1 > 0)
+			let(angle = default(angle,(180-ang)/2))
+			assert(is_num(angle))
+			assert(angle > 0 && angle < 180)
+			let(
+				pta = p2 + dist1*v1,
+				a3 = 180 - angle - ang
+			) assert(a3>0, "Angle too extreme.")
+			let(
+				side = sin(angle) * dist1/sin(a3),
+				ptb = p2 + side*v2
+			) [pta, ptb]
+		) : (is_undef(dist1) && is_num(dist2) && is_undef(side))? (
+			// dist2 & optional angle
+			assert(dist2 > 0)
+			let(angle = default(angle,(180-ang)/2))
+			assert(is_num(angle))
+			assert(angle > 0 && angle < 180)
+			let(
+				ptb = p2 + dist2*v2,
+				a3 = 180 - angle - ang
+			) assert(a3>0, "Angle too extreme.")
+			let(
+				side = sin(angle) * dist2/sin(a3),
+				pta = p2 + side*v1
+			) [pta, ptb]
+		) : (is_undef(dist1) && is_undef(dist2) && is_num(side))? (
+			// side & optional angle
+			assert(side > 0)
+			let(angle = default(angle,(180-ang)/2))
+			assert(is_num(angle))
+			assert(angle > 0 && angle < 180)
+			let(
+				a3 = 180 - angle - ang
+			) assert(a3>0, "Angle too extreme.")
+			let(
+				dist1 = sin(a3) * side/sin(ang),
+				dist2 = sin(angle) * side/sin(ang),
+				pta = p2 + dist1*v1,
+				ptb = p2 + dist2*v2
+			) [pta, ptb]
+		) : (is_num(dist1) && is_num(dist2) && is_undef(side) && is_undef(side))? (
+			// dist1 & dist2
+			assert(dist1 > 0)
+			assert(dist2 > 0)
+			let(
+				pta = p2 + dist1*v1,
+				ptb = p2 + dist2*v2
+			) [pta, ptb]
+		) : (
+			assert(false,"Bad arguments.")
+		)
+	) path;
+
+
+function _corner_roundover_path(p1, p2, p3, r, d) = 
+	let(
+		r = get_radius(r=r,d=d,dflt=undef),
+		res = circle_2tangents(p1, p2, p3, r=r, tangents=true),
+		cp = res[0],
+		n = res[1],
+		tp1 = res[2],
+		ang = res[4]+res[5],
+		steps = floor(segs(r)*ang/360+0.5),
+		step = ang / steps,
+		path = [for (i=[0:1:steps]) move(cp, p=rot(a=-i*step, v=n, p=tp1-cp))]
+	) path;
+
+
+
 // Function: path3d_spiral()
 // Description:
 //   Returns a 3D spiral path.
diff --git a/shapes2d.scad b/shapes2d.scad
index 4fec9a3..8325bb8 100644
--- a/shapes2d.scad
+++ b/shapes2d.scad
@@ -1206,6 +1206,8 @@ module octagon(r, d, or, od, ir, id, side, rounding=0, realign=false, align_tip,
 //   w2 = The X axis width of the back end of the trapezoid.
 //   angle = If given in place of `h`, `w1`, or `w2`, then the missing value is calculated such that the right side has that angle away from the Y axis.
 //   shift = Scalar value to shift the back of the trapezoid along the X axis by.  Default: 0
+//   rounding = The rounding radius for the corners.  If given as a list of four numbers, gives individual radii for each corner, in the order [X+Y+,X-Y+,X-Y-,X+Y-]. Default: 0 (no rounding)
+//   chamfer = The Length of the chamfer faces at the corners.  If given as a list of four numbers, gives individual chamfers for each corner, in the order [X+Y+,X-Y+,X-Y-,X+Y-].  Default: 0 (no chamfer)
 //   anchor = Translate so anchor point is at origin (0,0,0).  See [anchor](attachments.scad#anchor).  Default: `CENTER`
 //   spin = Rotate this many degrees around the Z axis after anchor.  See [spin](attachments.scad#spin).  Default: `0`
 // Examples(2D):
@@ -1217,42 +1219,68 @@ module octagon(r, d, or, od, ir, id, side, rounding=0, realign=false, align_tip,
 //   trapezoid(h=20, w2=10, angle=30);
 //   trapezoid(h=20, w2=30, angle=-30);
 //   trapezoid(w1=30, w2=10, angle=30);
+// Example(2D): Chamferred Trapezoid
+//   trapezoid(h=30, w1=60, w2=40, chamfer=5);
+// Example(2D): Rounded Trapezoid
+//   trapezoid(h=30, w1=60, w2=40, rounding=5);
+// Example(2D): Mixed Chamfering and Rounding
+//   trapezoid(h=30, w1=60, w2=40, rounding=[5,0,10,0],chamfer=[0,8,0,15],$fa=1,$fs=1);
 // Example(2D): Called as Function
 //   stroke(closed=true, trapezoid(h=30, w1=40, w2=20));
-function trapezoid(h, w1, w2, angle, shift=0, anchor=CENTER, spin=0) =
+function trapezoid(h, w1, w2, angle, shift=0, chamfer=0, rounding=0, anchor=CENTER, spin=0) =
     assert(is_undef(h) || is_finite(h))
     assert(is_undef(w1) || is_finite(w1))
     assert(is_undef(w2) || is_finite(w2))
     assert(is_undef(angle) || is_finite(angle))
     assert(num_defined([h, w1, w2, angle]) == 3, "Must give exactly 3 of the arguments h, w1, w2, and angle.")
     assert(is_finite(shift))
+	assert(is_finite(chamfer)  || is_vector(chamfer,4))
+	assert(is_finite(rounding) || is_vector(rounding,4))
     let(
+		simple = chamfer==0 && rounding==0,
         h  = !is_undef(h)?  h  : opp_ang_to_adj(abs(w2-w1)/2, abs(angle)),
         w1 = !is_undef(w1)? w1 : w2 + 2*(adj_ang_to_opp(h, angle) + shift),
-        w2 = !is_undef(w2)? w2 : w1 - 2*(adj_ang_to_opp(h, angle) + shift),
-        path = [[w1/2,-h/2], [-w1/2,-h/2], [-w2/2+shift,h/2], [w2/2+shift,h/2]]
+        w2 = !is_undef(w2)? w2 : w1 - 2*(adj_ang_to_opp(h, angle) + shift)
     )
     assert(w1>=0 && w2>=0 && h>0, "Degenerate trapezoid geometry.")
-    reorient(anchor,spin, two_d=true, size=[w1,h], size2=w2, p=path);
+    assert(w1+w2>0, "Degenerate trapezoid geometry.")
+    let(
+        base_path = [
+            [w2/2+shift,h/2],
+            [-w2/2+shift,h/2],
+            [-w1/2,-h/2],
+            [w1/2,-h/2],
+        ],
+		cpath = simple? base_path :
+			path_chamfer_and_rounding(
+				base_path, closed=true,
+				chamfer=chamfer,
+				rounding=rounding
+			),
+		path = reverse(cpath)
+	) simple?
+		reorient(anchor,spin, two_d=true, size=[w1,h], size2=w2, shift=shift, p=path) :
+		reorient(anchor,spin, two_d=true, path=path, p=path);
 
 
 
-module trapezoid(h, w1, w2, angle, shift=0, anchor=CENTER, spin=0) {
-    assert(is_undef(h) || is_finite(h));
-    assert(is_undef(w1) || is_finite(w1));
-    assert(is_undef(w2) || is_finite(w2));
-    assert(is_undef(angle) || is_finite(angle));
-    assert(num_defined([h, w1, w2, angle]) == 3, "Must give exactly 3 of the arguments h, w1, w2, and angle.");
-    assert(is_finite(shift));
+module trapezoid(h, w1, w2, angle, shift=0, chamfer=0, rounding=0, anchor=CENTER, spin=0) {
+	path = trapezoid(h=h, w1=w1, w2=w2, angle=angle, shift=shift, chamfer=chamfer, rounding=rounding);
     union() {
+		simple = chamfer==0 && rounding==0;
         h  = !is_undef(h)?  h  : opp_ang_to_adj(abs(w2-w1)/2, abs(angle));
         w1 = !is_undef(w1)? w1 : w2 + 2*(adj_ang_to_opp(h, angle) + shift);
         w2 = !is_undef(w2)? w2 : w1 - 2*(adj_ang_to_opp(h, angle) + shift);
-        assert(w1>=0 && w2>=0 && h>0, "Degenerate trapezoid geometry.");
-        path = [[w1/2,-h/2], [-w1/2,-h/2], [-w2/2+shift,h/2], [w2/2+shift,h/2]];
-        attachable(anchor,spin, two_d=true, size=[w1,h], size2=w2, shift=shift) {
-            polygon(path);
-            children();
+        if (simple) {
+            attachable(anchor,spin, two_d=true, size=[w1,h], size2=w2, shift=shift) {
+                polygon(path);
+                children();
+            }
+        } else {
+            attachable(anchor,spin, two_d=true, path=path) {
+                polygon(path);
+                children();
+            }
         }
     }
 }
diff --git a/version.scad b/version.scad
index ae8cf68..2aa024d 100644
--- a/version.scad
+++ b/version.scad
@@ -8,7 +8,7 @@
 //////////////////////////////////////////////////////////////////////
 
 
-BOSL_VERSION = [2,0,496];
+BOSL_VERSION = [2,0,497];
 
 
 // Section: BOSL Library Version Functions

From 6e677498f919d4e78ddb428bde15299352477ccf Mon Sep 17 00:00:00 2001
From: Garth Minette <gminette@gmail.com>
Date: Wed, 30 Dec 2020 00:38:24 -0800
Subject: [PATCH 16/22] Example fix for path_chamfer_and_rounding()

---
 paths.scad   | 2 +-
 version.scad | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/paths.scad b/paths.scad
index 0588310..f7bfe29 100644
--- a/paths.scad
+++ b/paths.scad
@@ -432,7 +432,7 @@ function path_torsion(path, closed=false) =
 //   stroke(path2, closed=true);
 // Example(2D): Per-Corner Chamfering
 //   path = star(5, step=2, d=100);
-//   rs = [for (i=[0:1:4]) each 3*[i,i]];
+//   rs = [for (i=[0:1:4]) each 2*[i,i]];
 //   path2 = path_chamfer_and_rounding(path, closed=true, rounding=rs);
 //   stroke(path2, closed=true);
 // Example(2D): Mixing Chamfers and Roundings
diff --git a/version.scad b/version.scad
index 2aa024d..b242730 100644
--- a/version.scad
+++ b/version.scad
@@ -8,7 +8,7 @@
 //////////////////////////////////////////////////////////////////////
 
 
-BOSL_VERSION = [2,0,497];
+BOSL_VERSION = [2,0,498];
 
 
 // Section: BOSL Library Version Functions

From b8f655e43c3f1da7ef2fb06c600ccef5a5e41024 Mon Sep 17 00:00:00 2001
From: Garth Minette <gminette@gmail.com>
Date: Wed, 30 Dec 2020 15:44:17 -0800
Subject: [PATCH 17/22] Added logo to README.

---
 README.md            |   1 +
 images/BOSL2logo.png | Bin 0 -> 117043 bytes
 version.scad         |   2 +-
 3 files changed, 2 insertions(+), 1 deletion(-)
 create mode 100644 images/BOSL2logo.png

diff --git a/README.md b/README.md
index 23177f4..40b1f4c 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,5 @@
 # BOSL2
+![BOSL2 Logo](images/BOSL2logo.png)
 
 **The Belfry OpenScad Library, v2**
 
diff --git a/images/BOSL2logo.png b/images/BOSL2logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..95eea7446a12c0ffec6a8397130591bc8f51e4b9
GIT binary patch
literal 117043
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

literal 0
HcmV?d00001

diff --git a/version.scad b/version.scad
index b242730..df40abf 100644
--- a/version.scad
+++ b/version.scad
@@ -8,7 +8,7 @@
 //////////////////////////////////////////////////////////////////////
 
 
-BOSL_VERSION = [2,0,498];
+BOSL_VERSION = [2,0,499];
 
 
 // Section: BOSL Library Version Functions

From d1fe384f95fe68c8701396c38f13af63de1a47c9 Mon Sep 17 00:00:00 2001
From: Garth Minette <gminette@gmail.com>
Date: Thu, 31 Dec 2020 16:33:09 -0800
Subject: [PATCH 18/22] Bugfix for malformed teardrop2d()

---
 shapes2d.scad | 21 +++++++++++----------
 version.scad  |  2 +-
 2 files changed, 12 insertions(+), 11 deletions(-)

diff --git a/shapes2d.scad b/shapes2d.scad
index 8325bb8..6efa392 100644
--- a/shapes2d.scad
+++ b/shapes2d.scad
@@ -1321,21 +1321,22 @@ module teardrop2d(r, d, ang=45, cap_h, anchor=CENTER, spin=0)
 function teardrop2d(r, d, ang=45, cap_h, anchor=CENTER, spin=0) =
     let(
         r = get_radius(r=r, d=d, dflt=1),
-        cord = 2 * r * cos(ang),
-        cord_h = r * sin(ang),
-        tip_y = (cord/2)/tan(ang),
-        cap_h = min((!is_undef(cap_h)? cap_h : tip_y+cord_h), tip_y+cord_h),
-        cap_w = cord * (1 - (cap_h - cord_h)/tip_y),
-        ang = min(ang,asin(cap_h/r)),
-        sa = 180 - ang,
-        ea = 360 + ang,
+        tanpt = polar_to_xy(r, ang),
+        tip_y = adj_ang_to_hyp(r, 90-ang),
+        cap_h = min(default(cap_h,tip_y), tip_y),
+        cap_w = tanpt.y >= cap_h
+          ? hyp_opp_to_adj(r, cap_h)
+          : adj_ang_to_opp(tip_y-cap_h, ang),
+        ang2 = min(ang,atan2(cap_h,cap_w)),
+        sa = 180 - ang2,
+        ea = 360 + ang2,
         steps = segs(r)*(ea-sa)/360,
         step = (ea-sa)/steps,
         path = deduplicate(
             [
-                [ cap_w/2,cap_h],
+                [ cap_w,cap_h],
                 for (i=[0:1:steps]) let(a=ea-i*step) r*[cos(a),sin(a)],
-                [-cap_w/2,cap_h]
+                [-cap_w,cap_h]
             ], closed=true
         ),
         maxx_idx = max_index(subindex(path,0)),
diff --git a/version.scad b/version.scad
index df40abf..98921b7 100644
--- a/version.scad
+++ b/version.scad
@@ -8,7 +8,7 @@
 //////////////////////////////////////////////////////////////////////
 
 
-BOSL_VERSION = [2,0,499];
+BOSL_VERSION = [2,0,500];
 
 
 // Section: BOSL Library Version Functions

From d1fb992e2cc04a6587832c8616596086cae9a43a Mon Sep 17 00:00:00 2001
From: Garth Minette <gminette@gmail.com>
Date: Fri, 1 Jan 2021 00:59:37 -0800
Subject: [PATCH 19/22] Refactored and modernized heightfield(), enabling
 functional literal use.

---
 shapes.scad  | 187 ++++++++++++++++++++++++++-------------------------
 version.scad |   2 +-
 2 files changed, 97 insertions(+), 92 deletions(-)

diff --git a/shapes.scad b/shapes.scad
index 31e35b1..c03cbc6 100644
--- a/shapes.scad
+++ b/shapes.scad
@@ -1689,112 +1689,117 @@ module arced_slot(
 }
 
 
-// Module: heightfield()
-// Usage:
-//   heightfield(heightfield, [size], [bottom]);
+// Function&Module: heightfield()
+// Usage: As Module
+//   heightfield(data, <size>, <bottom>, <maxz>, <xrange>, <yrange>, <style>, <convexity>);
+// Usage: As Function
+//   vnf = heightfield(data, <size>, <bottom>, <maxz>, <xrange>, <yrange>, <style>);
 // Description:
-//   Given a regular rectangular 2D grid of scalar values, generates a 3D surface where the height at
-//   any given point is the scalar value for that position.
+//   Given a regular rectangular 2D grid of scalar values, or a function literal, generates a 3D
+//   surface where the height at any given point is the scalar value for that position.
 // Arguments:
-//   heightfield = The 2D rectangular array of heights.
-//   size = The [X,Y] size of the surface to create.  If given as a scalar, use it for both X and Y sizes.
-//   bottom = The Z coordinate for the bottom of the heightfield object to create.  Must be less than the minimum heightfield value.  Default: 0
-//   convexity = Max number of times a line could intersect a wall of the surface being formed.
+//   data = This is either the 2D rectangular array of heights, or a function literal that takes X and Y arguments.
+//   size = The [X,Y] size of the surface to create.  If given as a scalar, use it for both X and Y sizes. Default: `[100,100]`
+//   bottom = The Z coordinate for the bottom of the heightfield object to create.  Any heights lower than this will be truncated to very slightly above this height.  Default: -20
+//   maxz = The maximum height to model.  Truncates anything taller to this height.  Default: 99
+//   xrange = A range of values to iterate X over when calculating a surface from a function literal.  Default: [-1 : 0.01 : 1]
+//   yrange = A range of values to iterate Y over when calculating a surface from a function literal.  Default: [-1 : 0.01 : 1]
+//   style = The style of subdividing the quads into faces.  Valid options are "default", "alt", and "quincunx".  Default: "default"
+//   convexity = Max number of times a line could intersect a wall of the surface being formed. Module only.  Default: 10
+//   anchor = Translate so anchor point is at origin (0,0,0).  See [anchor](attachments.scad#anchor).  Default: `CENTER`
+//   spin = Rotate this many degrees around the Z axis.  See [spin](attachments.scad#spin).  Default: `0`
+//   orient = Vector to rotate top towards.  See [orient](attachments.scad#orient).  Default: `UP`
 // Example:
-//   heightfield(size=[100,100], bottom=-20, heightfield=[
+//   heightfield(size=[100,100], bottom=-20, data=[
 //       for (x=[-180:4:180]) [for(y=[-180:4:180]) 10*cos(3*norm([x,y]))]
 //   ]);
 // Example:
 //   intersection() {
-//       heightfield(size=[100,100], heightfield=[
+//       heightfield(size=[100,100], data=[
 //           for (x=[-180:5:180]) [for(y=[-180:5:180]) 10+5*cos(3*x)*sin(3*y)]
 //       ]);
 //       cylinder(h=50,d=100);
 //   }
-module heightfield(heightfield, size=[100,100], bottom=0, convexity=10)
+// Example: Heightfield by Function
+//   fn = function (x,y) 10*sin(x*360)*cos(y*360);
+//   heightfield(size=[100,100], data=fn);
+// Example: Heightfield by Function, with Specific Ranges
+//   fn = function (x,y) 2*cos(5*norm([x,y]));
+//   heightfield(size=[100,100], bottom=-20, data=fn, xrange=[-180:2:180], yrange=[-180:2:180]);
+module heightfield(data, size=[100,100], xrange=[-1:0.04:1], yrange=[-1:0.04:1], bottom=-20, maxz=100, style="default", convexity=10, anchor=CENTER, spin=0, orient=UP)
 {
     size = is_num(size)? [size,size] : point2d(size);
-    dim = array_dim(heightfield);
-    assert(dim.x!=undef);
-    assert(dim.y!=undef);
-    assert(bottom<min(flatten(heightfield)), "bottom must be less than the minimum heightfield value.");
-    spacing = vdiv(size,dim-[1,1]);
-    vertices = concat(
-        [
-            for (i=[0:1:dim.x-1], j=[0:1:dim.y-1]) let(
-                pos = [i*spacing.x-size.x/2, j*spacing.y-size.y/2, heightfield[i][j]]
-            ) pos
-        ], [
-            for (i=[0:1:dim.x-1]) let(
-                pos = [i*spacing.x-size.x/2, -size.y/2, bottom]
-            ) pos
-        ], [
-            for (i=[0:1:dim.x-1]) let(
-                pos = [i*spacing.x-size.x/2, size.y/2, bottom]
-            ) pos
-        ], [
-            for (j=[0:1:dim.y-1]) let(
-                pos = [-size.x/2, j*spacing.y-size.y/2, bottom]
-            ) pos
-        ], [
-            for (j=[0:1:dim.y-1]) let(
-                pos = [size.x/2, j*spacing.y-size.y/2, bottom]
-            ) pos
-        ]
-    );
-    faces = concat(
-        [
-            for (i=[0:1:dim.x-2], j=[0:1:dim.y-2]) let(
-                idx1 = (i+0)*dim.y + j+0,
-                idx2 = (i+0)*dim.y + j+1,
-                idx3 = (i+1)*dim.y + j+0,
-                idx4 = (i+1)*dim.y + j+1
-            ) each [[idx1, idx2, idx4], [idx1, idx4, idx3]]
-        ], [
-            for (i=[0:1:dim.x-2]) let(
-                idx1 = dim.x*dim.y,
-                idx2 = dim.x*dim.y+dim.x+i,
-                idx3 = idx2+1
-            ) [idx1,idx3,idx2]
-        ], [
-            for (i=[0:1:dim.y-2]) let(
-                idx1 = dim.x*dim.y,
-                idx2 = dim.x*dim.y+dim.x*2+dim.y+i,
-                idx3 = idx2+1
-            ) [idx1,idx2,idx3]
-        ], [
-            for (i=[0:1:dim.x-2]) let(
-                idx1 = (i+0)*dim.y+0,
-                idx2 = (i+1)*dim.y+0,
-                idx3 = dim.x*dim.y+i,
-                idx4 = idx3+1
-            ) each [[idx1, idx2, idx4], [idx1, idx4, idx3]]
-        ], [
-            for (i=[0:1:dim.x-2]) let(
-                idx1 = (i+0)*dim.y+dim.y-1,
-                idx2 = (i+1)*dim.y+dim.y-1,
-                idx3 = dim.x*dim.y+dim.x+i,
-                idx4 = idx3+1
-            ) each [[idx1, idx4, idx2], [idx1, idx3, idx4]]
-        ], [
-            for (j=[0:1:dim.y-2]) let(
-                idx1 = j,
-                idx2 = j+1,
-                idx3 = dim.x*dim.y+dim.x*2+j,
-                idx4 = idx3+1
-            ) each [[idx1, idx4, idx2], [idx1, idx3, idx4]]
-        ], [
-            for (j=[0:1:dim.y-2]) let(
-                idx1 = (dim.x-1)*dim.y+j,
-                idx2 = idx1+1,
-                idx3 = dim.x*dim.y+dim.x*2+dim.y+j,
-                idx4 = idx3+1
-            ) each [[idx1, idx2, idx4], [idx1, idx4, idx3]]
-        ]
-    );
-    polyhedron(points=vertices, faces=faces, convexity=convexity);
+    vnf = heightfield(data=data, size=size, xrange=xrange, yrange=yrange, bottom=bottom, maxz=maxz, style=style);
+    attachable(anchor,spin,orient, vnf=vnf) {
+        vnf_polyhedron(vnf, convexity=convexity);
+        children();
+    }
 }
 
 
+function heightfield(data, size=[100,100], xrange=[-1:0.04:1], yrange=[-1:0.04:1], bottom=-20, maxz=100, style="default", anchor=CENTER, spin=0, orient=UP) =
+    assert(is_list(data) || is_function(data))
+    let(
+        size = is_num(size)? [size,size] : point2d(size),
+        xvals = is_list(data)
+          ? [for (i=idx(data[0])) i]
+          : assert(is_list(xrange)||is_range(xrange)) [for (x=xrange) x],
+        yvals = is_list(data)
+          ? [for (i=idx(data)) i]
+          : assert(is_list(yrange)||is_range(yrange)) [for (y=yrange) y],
+        xcnt = len(xvals),
+        ycnt = len(yvals),
+        minx = min(xvals),
+        maxx = max(xvals),
+        miny = min(yvals),
+        maxy = max(yvals),
+        verts = is_list(data) ? [
+                for (y = [0:1:yvals-1]) [
+                    for (x = [0:1:xvals-1]) [
+                        size.x * (x/(xvals-1)-0.5),
+                        size.y * (y/(yvals-1)-0.5),
+                        data[y][x]
+                    ]
+                ]
+            ] : [
+                for (x = xrange) [
+                    for (y = yrange)
+                    let( z = data(x,y) ) [
+                        size.x * ((x-minx)/(maxx-minx)-0.5),
+                        size.y * ((y-miny)/(maxy-miny)-0.5),
+                        min(maxz, max(bottom+0.1, default(z,0)))
+                    ]
+                ]
+            ],
+        vnf = vnf_merge([
+            vnf_vertex_array(verts, style=style),
+            vnf_vertex_array([
+                [for (v=verts[0]) [v.x, v.y, bottom]],
+                verts[0]
+            ]),
+            vnf_vertex_array([
+                verts[ycnt-1],
+                [for (v=verts[ycnt-1]) [v.x, v.y, bottom]]
+            ]),
+            vnf_vertex_array([
+                [for (r=verts) let(v=r[0]) v],
+                [for (r=verts) let(v=r[0]) [v.x, v.y, bottom]],
+            ]),
+            vnf_vertex_array([
+                [for (r=verts) let(v=r[xcnt-1]) [v.x, v.y, bottom]],
+                [for (r=verts) let(v=r[xcnt-1]) v],
+            ]),
+            vnf_vertex_array([
+                [
+                    for (r=verts) let(v=r[0]) [v.x, v.y, bottom],
+                    for (v=verts[ycnt-1]) [v.x, v.y, bottom],
+                ], [
+                    for (v=verts[0]) [v.x, v.y, bottom],
+                    for (r=verts) let(v=r[xcnt-1]) [v.x, v.y, bottom],
+                ]
+            ])
+        ])
+    ) reorient(anchor,spin,orient, vnf=vnf, p=vnf);
+
 
 // vim: expandtab tabstop=4 shiftwidth=4 softtabstop=4 nowrap
diff --git a/version.scad b/version.scad
index 98921b7..0be78e9 100644
--- a/version.scad
+++ b/version.scad
@@ -8,7 +8,7 @@
 //////////////////////////////////////////////////////////////////////
 
 
-BOSL_VERSION = [2,0,500];
+BOSL_VERSION = [2,0,502];
 
 
 // Section: BOSL Library Version Functions

From 9633608341cfac001bc0feb26c5a08f8a8dfc26c Mon Sep 17 00:00:00 2001
From: Garth Minette <gminette@gmail.com>
Date: Fri, 1 Jan 2021 01:21:17 -0800
Subject: [PATCH 20/22] Fixed data array heightfield handling.

---
 shapes.scad  | 37 +++++++++++++++++++------------------
 version.scad |  2 +-
 2 files changed, 20 insertions(+), 19 deletions(-)

diff --git a/shapes.scad b/shapes.scad
index c03cbc6..0b03cbc 100644
--- a/shapes.scad
+++ b/shapes.scad
@@ -1711,12 +1711,12 @@ module arced_slot(
 //   orient = Vector to rotate top towards.  See [orient](attachments.scad#orient).  Default: `UP`
 // Example:
 //   heightfield(size=[100,100], bottom=-20, data=[
-//       for (x=[-180:4:180]) [for(y=[-180:4:180]) 10*cos(3*norm([x,y]))]
+//       for (y=[-180:4:180]) [for(x=[-180:4:180]) 10*cos(3*norm([x,y]))]
 //   ]);
 // Example:
 //   intersection() {
 //       heightfield(size=[100,100], data=[
-//           for (x=[-180:5:180]) [for(y=[-180:5:180]) 10+5*cos(3*x)*sin(3*y)]
+//           for (y=[-180:5:180]) [for(x=[-180:5:180]) 10+5*cos(3*x)*sin(3*y)]
 //       ]);
 //       cylinder(h=50,d=100);
 //   }
@@ -1748,23 +1748,24 @@ function heightfield(data, size=[100,100], xrange=[-1:0.04:1], yrange=[-1:0.04:1
           ? [for (i=idx(data)) i]
           : assert(is_list(yrange)||is_range(yrange)) [for (y=yrange) y],
         xcnt = len(xvals),
-        ycnt = len(yvals),
         minx = min(xvals),
         maxx = max(xvals),
+        ycnt = len(yvals),
         miny = min(yvals),
         maxy = max(yvals),
         verts = is_list(data) ? [
-                for (y = [0:1:yvals-1]) [
-                    for (x = [0:1:xvals-1]) [
-                        size.x * (x/(xvals-1)-0.5),
-                        size.y * (y/(yvals-1)-0.5),
+                for (y = [0:1:ycnt-1]) [
+                    for (x = [0:1:xcnt-1]) [
+                        size.x * (x/(xcnt-1)-0.5),
+                        size.y * (y/(ycnt-1)-0.5),
                         data[y][x]
                     ]
                 ]
             ] : [
-                for (x = xrange) [
-                    for (y = yrange)
-                    let( z = data(x,y) ) [
+                for (y = yrange) [
+                    for (x = xrange) let(
+                        z = data(x,y)
+                    ) [
                         size.x * ((x-minx)/(maxx-minx)-0.5),
                         size.y * ((y-miny)/(maxy-miny)-0.5),
                         min(maxz, max(bottom+0.1, default(z,0)))
@@ -1772,30 +1773,30 @@ function heightfield(data, size=[100,100], xrange=[-1:0.04:1], yrange=[-1:0.04:1
                 ]
             ],
         vnf = vnf_merge([
-            vnf_vertex_array(verts, style=style),
+            vnf_vertex_array(verts, style=style, reverse=true),
             vnf_vertex_array([
+                verts[0],
                 [for (v=verts[0]) [v.x, v.y, bottom]],
-                verts[0]
             ]),
             vnf_vertex_array([
+                [for (v=verts[ycnt-1]) [v.x, v.y, bottom]],
                 verts[ycnt-1],
-                [for (v=verts[ycnt-1]) [v.x, v.y, bottom]]
             ]),
             vnf_vertex_array([
-                [for (r=verts) let(v=r[0]) v],
                 [for (r=verts) let(v=r[0]) [v.x, v.y, bottom]],
+                [for (r=verts) let(v=r[0]) v],
             ]),
             vnf_vertex_array([
-                [for (r=verts) let(v=r[xcnt-1]) [v.x, v.y, bottom]],
                 [for (r=verts) let(v=r[xcnt-1]) v],
+                [for (r=verts) let(v=r[xcnt-1]) [v.x, v.y, bottom]],
             ]),
             vnf_vertex_array([
                 [
-                    for (r=verts) let(v=r[0]) [v.x, v.y, bottom],
-                    for (v=verts[ycnt-1]) [v.x, v.y, bottom],
-                ], [
                     for (v=verts[0]) [v.x, v.y, bottom],
                     for (r=verts) let(v=r[xcnt-1]) [v.x, v.y, bottom],
+                ], [
+                    for (r=verts) let(v=r[0]) [v.x, v.y, bottom],
+                    for (v=verts[ycnt-1]) [v.x, v.y, bottom],
                 ]
             ])
         ])
diff --git a/version.scad b/version.scad
index 0be78e9..1b775bd 100644
--- a/version.scad
+++ b/version.scad
@@ -8,7 +8,7 @@
 //////////////////////////////////////////////////////////////////////
 
 
-BOSL_VERSION = [2,0,502];
+BOSL_VERSION = [2,0,503];
 
 
 // Section: BOSL Library Version Functions

From 6b77a3a199c60bf6e32e0815b7c29231d9718de0 Mon Sep 17 00:00:00 2001
From: Garth Minette <gminette@gmail.com>
Date: Fri, 1 Jan 2021 01:26:36 -0800
Subject: [PATCH 21/22] Don't do function literals in examples.  We can't
 render them yet.

---
 shapes.scad  | 4 ++--
 version.scad | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/shapes.scad b/shapes.scad
index 0b03cbc..40a950b 100644
--- a/shapes.scad
+++ b/shapes.scad
@@ -1720,10 +1720,10 @@ module arced_slot(
 //       ]);
 //       cylinder(h=50,d=100);
 //   }
-// Example: Heightfield by Function
+// Example(NORENDER): Heightfield by Function
 //   fn = function (x,y) 10*sin(x*360)*cos(y*360);
 //   heightfield(size=[100,100], data=fn);
-// Example: Heightfield by Function, with Specific Ranges
+// Example(NORENDER): Heightfield by Function, with Specific Ranges
 //   fn = function (x,y) 2*cos(5*norm([x,y]));
 //   heightfield(size=[100,100], bottom=-20, data=fn, xrange=[-180:2:180], yrange=[-180:2:180]);
 module heightfield(data, size=[100,100], xrange=[-1:0.04:1], yrange=[-1:0.04:1], bottom=-20, maxz=100, style="default", convexity=10, anchor=CENTER, spin=0, orient=UP)
diff --git a/version.scad b/version.scad
index 1b775bd..39cf19e 100644
--- a/version.scad
+++ b/version.scad
@@ -8,7 +8,7 @@
 //////////////////////////////////////////////////////////////////////
 
 
-BOSL_VERSION = [2,0,503];
+BOSL_VERSION = [2,0,504];
 
 
 // Section: BOSL Library Version Functions

From a683fa9ead6ca5017e472456123bea50cf50b23a Mon Sep 17 00:00:00 2001
From: Garth Minette <gminette@gmail.com>
Date: Fri, 1 Jan 2021 16:31:15 -0800
Subject: [PATCH 22/22] Fix for cuboid negative chamfer/rounding overhangs.

---
 shapes.scad  | 6 ++++--
 version.scad | 2 +-
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/shapes.scad b/shapes.scad
index 40a950b..a99e9f3 100644
--- a/shapes.scad
+++ b/shapes.scad
@@ -185,7 +185,8 @@ module cuboid(
                             // Add multi-edge corners.
                             if (trimcorners) {
                                 for (za=[-1,1], ya=[-1,1], xa=[-1,1]) {
-                                    if (corner_edge_count(edges, [xa,ya,za]) > 1) {
+                                    ce = corner_edges(edges, [xa,ya,za]);
+                                    if (ce.x + ce.y > 1) {
                                         translate(vmul([xa,ya,za]/2, size+[ach-0.01,ach-0.01,-ach])) {
                                             cube([ach+0.01,ach+0.01,ach], center=true);
                                         }
@@ -270,7 +271,8 @@ module cuboid(
                             // Add multi-edge corners.
                             if (trimcorners) {
                                 for (za=[-1,1], ya=[-1,1], xa=[-1,1]) {
-                                    if (corner_edge_count(edges, [xa,ya,za]) > 1) {
+                                    ce = corner_edges(edges, [xa,ya,za]);
+                                    if (ce.x + ce.y > 1) {
                                         translate(vmul([xa,ya,za]/2, size+[ard-0.01,ard-0.01,-ard])) {
                                             cube([ard+0.01,ard+0.01,ard], center=true);
                                         }
diff --git a/version.scad b/version.scad
index 39cf19e..8a19e0d 100644
--- a/version.scad
+++ b/version.scad
@@ -8,7 +8,7 @@
 //////////////////////////////////////////////////////////////////////
 
 
-BOSL_VERSION = [2,0,504];
+BOSL_VERSION = [2,0,505];
 
 
 // Section: BOSL Library Version Functions