+ Offset middle = 0.5*(inward0 + inward2);
+
+ // "middle" now is a vector in the right direction for the
+ // shrinkage. Its size needs to be large enough that the
+ // projection on either of the inward vectors has a size of 1.
+
+ Real proj = dot_product (middle, inward0);
+
+ // What's the size of proj? Assuming that we have a corner
+ // angle of phi where 0 corresponds to a continuing line, the
+ // length of middle is 0.5 |(1+cos phi, sin phi)| = cos (phi/2),
+ // so its projection has length
+ // cos^2 (phi/2) = 0.5 + 0.5 cos (phi).
+ // We don't really want to move inwards more than 3 blob
+ // diameters corresponding to 6 blob radii. So
+ // cos (phi/2) = 1/6 gives phi ~ 161, meaning that a 20 degree
+ // corner necessitates moving 3 blob diameters from the corner
+ // in order to stay inside the lines. Ruler and circle agree.
+ // 0.03 is close enough to 1/36. Basically we want to keep the
+ // shape from inverting from pulling too far inward.
+ // 3 diameters is pretty much a handwaving guess.
+
+ if (abs (proj) < 0.03)
+ proj = proj < 0 ? -0.03 : 0.03;
+
+ shrunk_points[i1] = p1 - (0.5 * blotdiameter / proj) * middle
+ * extroversion;
+ }