From e2ed3f91221d636667a29923259a8b3b3bfd3ef4 Mon Sep 17 00:00:00 2001
From: Revar Desmera <revarbat@gmail.com>
Date: Sun, 21 Aug 2022 02:49:47 -0700
Subject: [PATCH] Fix for issue #928

---
 drawing.scad | 59 ++++++++++++++++++++++++++--------------------------
 vnf.scad     |  4 ++--
 2 files changed, 31 insertions(+), 32 deletions(-)

diff --git a/drawing.scad b/drawing.scad
index 2854856..7124732 100644
--- a/drawing.scad
+++ b/drawing.scad
@@ -85,7 +85,6 @@
 //   joint_color = If given, sets the color of the joints.  Overrides `color=` and `dots_color=`.
 //   dots_color = If given, sets the color of the endcaps and joints.  Overrides `color=`.
 //   convexity = Max number of times a line could intersect a wall of an endcap.
-//   hull = If true, use `hull()` to make higher quality joints between segments, at the cost of being much slower.  Default: true
 // Example(2D): Drawing a Path
 //   path = [[0,100], [100,100], [200,0], [100,-100], [100,0]];
 //   stroke(path, width=20);
@@ -157,7 +156,7 @@ function stroke(
     endcap_angle,  endcap_angle1,  endcap_angle2,  joint_angle,  dots_angle,
     endcap_color,  endcap_color1,  endcap_color2,  joint_color,  dots_color, color,
     trim, trim1, trim2,
-    convexity=10, hull=true
+    convexity=10
 ) = no_function("stroke");
 
 
@@ -170,7 +169,7 @@ module stroke(
     endcap_angle,  endcap_angle1,  endcap_angle2,  joint_angle,  dots_angle,
     endcap_color,  endcap_color1,  endcap_color2,  joint_color,  dots_color, color,
     trim, trim1, trim2,
-    convexity=10, hull=true
+    convexity=10
 ) {
     no_children($children);
     module setcolor(clr) {
@@ -359,7 +358,7 @@ module stroke(
                     for (i = [1:1:len(path2)-2]) {
                         $fn = quantup(segs(widths[i]/2),4);
                         translate(path2[i]) {
-                            if (joints != undef) {
+                            if (joints != undef && joints != "round") {
                                 joint_shape = _shape_path(
                                     joints, width[i],
                                     joint_width,
@@ -372,18 +371,21 @@ module stroke(
                                   ? rot(from=BACK,to=v1)
                                   : zrot(joint_angle);
                                 multmatrix(mat) polygon(joint_shape);
-                            } else if (hull) {
-                                hull() {
-                                    rot(from=BACK, to=path2[i]-path2[i-1])
-                                        circle(d=widths[i]);
-                                    rot(from=BACK, to=path2[i+1]-path2[i])
-                                        circle(d=widths[i]);
-                                }
                             } else {
-                                rot(from=BACK, to=path2[i]-path2[i-1])
-                                    circle(d=widths[i]);
-                                rot(from=BACK, to=path2[i+1]-path2[i])
-                                    circle(d=widths[i]);
+                                v1 = path2[i] - path2[i-1];
+                                v2 = path2[i+1] - path2[i];
+                                ang = modang(v_theta(v2) - v_theta(v1));
+                                pv1 = rot(-90, p=unit(v1,BACK));
+                                pv2 = rot(-90, p=unit(v2,BACK));
+                                if (!approx(ang,0)) {
+                                    if (ang>=0) {
+                                        rot(from=RIGHT, to=pv1)
+                                            arc(d=widths[i], angle=ang, wedge=true);
+                                    } else {
+                                        rot(from=RIGHT, to=-pv2)
+                                            arc(d=widths[i], angle=-ang, wedge=true);
+                                    }
+                                }
                             }
                         }
                     }
@@ -439,7 +441,7 @@ module stroke(
                     for (i = [1:1:len(path2)-2]) {
                         $fn = sides[i];
                         translate(path2[i]) {
-                            if (joints != undef) {
+                            if (joints != undef && joints != "round") {
                                 joint_shape = _shape_path(
                                     joints, width[i],
                                     joint_width,
@@ -462,21 +464,18 @@ module stroke(
                                         }
                                     }
                                 }
-                            } else if (hull) {
-                                hull(){
-                                    multmatrix(rotmats[i]) {
-                                        sphere(d=widths[i],style="aligned");
-                                    }
-                                    multmatrix(rotmats[i-1]) {
-                                        sphere(d=widths[i],style="aligned");
-                                    }
-                                }
                             } else {
-                                multmatrix(rotmats[i]) {
-                                    sphere(d=widths[i],style="aligned");
-                                }
-                                multmatrix(rotmats[i-1]) {
-                                    sphere(d=widths[i],style="aligned");
+                                corner = select(path2,i-1,i+1);
+                                axis = vector_axis(corner);
+                                ang = vector_angle(corner);
+                                if (!approx(ang,0)) {
+                                    frame_map(x=path2[i-1]-path2[i], z=-axis) {
+                                        zrot(90-0.5) {
+                                            rotate_extrude(angle=180-ang+1) {
+                                                arc(d=widths[i], start=-90, angle=180);
+                                            }
+                                        }
+                                    }
                                 }
                             }
                         }
diff --git a/vnf.scad b/vnf.scad
index 95c7c61..95cd202 100644
--- a/vnf.scad
+++ b/vnf.scad
@@ -1703,9 +1703,9 @@ module vnf_validate(vnf, size=1, show_warns=true, check_isects=false, opacity=0.
         color(clr) {
             if (is_vector(pts[0])) {
                 if (len(pts)==2) {
-                    stroke(pts, width=size, closed=true, endcaps="butt", hull=false, $fn=8);
+                    stroke(pts, width=size, closed=true, endcaps="butt", $fn=8);
                 } else if (len(pts)>2) {
-                    stroke(pts, width=size, closed=true, hull=false, $fn=8);
+                    stroke(pts, width=size, closed=true, $fn=8);
                     polyhedron(pts,[[for (i=idx(pts)) i]]);
                 } else {
                     move_copies(pts) sphere(d=size*3, $fn=18);