diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,16 @@
+## [v1.4.2](https://github.com/diagrams/diagrams-lib/tree/v1.4.2) (2017-12-20)
+
+- New functions:
+    - `boxGrid`, for computing a grid of regularly spaced points.
+    - `scalingRotationTo` and `scaleRotateTo`, for affine conformal 2D
+      transformations.
+- Documentation fixes:
+    - `dirBetween`
+    - `PolyOrientation`
+- Upper bound updates: allow `tasty-0.12`, `tasty-quickcheck-0.9`,
+  `tasty-hunit-0.10`, `optparse-applicative-0.14`
+- Test with GHC 8.2.2
+
 ## [v1.4.1.2](https://github.com/diagrams/diagrams-lib/tree/v1.4.1.2) (2017-06-10)
 
 - Fix test suite compilation failure [#299](https://github.com/diagrams/diagrams-lib/issues/299).
diff --git a/diagrams-lib.cabal b/diagrams-lib.cabal
--- a/diagrams-lib.cabal
+++ b/diagrams-lib.cabal
@@ -1,5 +1,5 @@
 Name:                diagrams-lib
-Version:             1.4.1.2
+Version:             1.4.2
 Synopsis:            Embedded domain-specific language for declarative graphics
 Description:         Diagrams is a flexible, extensible EDSL for creating
                      graphics of many types.  Graphics can be created
@@ -18,10 +18,10 @@
 Bug-reports:         http://github.com/diagrams/diagrams-lib/issues
 Category:            Graphics
 Build-type:          Simple
-Cabal-version:       >=1.10
+Cabal-version:       >=1.18
 Extra-source-files:  CHANGELOG.md, README.markdown, diagrams/*.svg
 Extra-doc-files:     diagrams/*.svg
-Tested-with:         GHC == 7.6.3, GHC == 7.8.4, GHC == 7.10.2, GHC == 8.0.1
+Tested-with:         GHC == 7.6.3, GHC == 7.8.4, GHC == 7.10.2, GHC == 8.0.1, GHC == 8.2.2
 Source-repository head
   type:     git
   location: http://github.com/diagrams/diagrams-lib.git
@@ -115,14 +115,14 @@
                        intervals >= 0.7 && < 0.9,
                        lens >= 4.6 && < 4.16,
                        tagged >= 0.7,
-                       optparse-applicative >= 0.11 && < 0.14,
+                       optparse-applicative >= 0.11 && < 0.15,
                        filepath,
                        JuicyPixels >= 3.1.5 && < 3.3,
                        hashable >= 1.1 && < 1.3,
                        linear >= 1.20.1 && < 1.21,
                        adjunctions >= 4.0 && < 5.0,
                        distributive >=0.2.2 && < 1.0,
-                       process >= 1.1 && < 1.5,
+                       process >= 1.1 && < 1.7,
                        fsnotify >= 0.2.1 && < 0.3,
                        directory >= 1.2 && < 1.4,
                        unordered-containers >= 0.2 && < 0.3,
@@ -158,9 +158,9 @@
                , Instances
   hs-source-dirs: test
   build-depends:       base,
-                       tasty >= 0.10 && < 0.12,
-                       tasty-hunit >= 0.9.2 && < 0.10,
-                       tasty-quickcheck >= 0.8 && < 0.9,
+                       tasty >= 0.10 && < 0.13,
+                       tasty-hunit >= 0.9.2 && < 0.11,
+                       tasty-quickcheck >= 0.8 && < 0.10,
                        deepseq >= 1.3 && < 1.5,
                        diagrams-lib,
                        lens,
diff --git a/src/Diagrams/BoundingBox.hs b/src/Diagrams/BoundingBox.hs
--- a/src/Diagrams/BoundingBox.hs
+++ b/src/Diagrams/BoundingBox.hs
@@ -41,6 +41,8 @@
   , contains, contains'
   , inside, inside', outside, outside'
 
+  , boxGrid
+
     -- * Operations on bounding boxes
   , union, intersection
   ) where
@@ -311,3 +313,20 @@
 --   function is just an alias for @mappend@.
 union :: (Additive v, Ord n) => BoundingBox v n -> BoundingBox v n -> BoundingBox v n
 union = mappend
+
+-- | @boxGrid f box@ returns a grid of regularly spaced points inside
+--   the box, such that there are @(1/f)@ points along each dimension.
+--   For example, for a 3D box with corners at (0,0,0) and (2,2,2),
+--   @boxGrid 0.1@ would yield a grid of approximately 1000 points (it
+--   might actually be @11^3@ instead of @10^3@) spaced @0.2@ units
+--   apart.
+boxGrid
+  :: (Traversable v, Additive v, Num n, Enum n)
+  => n -> BoundingBox v n -> [Point v n]
+boxGrid f = maybe [] (sequenceA . uncurry (liftI2 mkRange)) . getCorners
+  where
+    mkRange lo hi = [lo, (1-f)*lo + f*hi .. hi]
+
+    -- liftA2 mkRange on the two corner points creates a (Point V2
+    -- [n]), where each component is the range of values for that
+    -- dimension.  sequenceA then yields a grid of type [Point V2 n].
diff --git a/src/Diagrams/Direction.hs b/src/Diagrams/Direction.hs
--- a/src/Diagrams/Direction.hs
+++ b/src/Diagrams/Direction.hs
@@ -80,6 +80,6 @@
   => Direction v n -> Direction v n -> Angle n
 angleBetweenDirs d1 d2 = angleBetween (fromDirection d1) (fromDirection d2)
 
--- | @dirBetween p q@ returns the directions from @p@ to @q@
+-- | @dirBetween p q@ returns the direction from @p@ to @q@.
 dirBetween :: (Additive v, Num n) => Point v n -> Point v n -> Direction v n
-dirBetween p q = dir $ p .-. q
+dirBetween p q = dir $ q .-. p
diff --git a/src/Diagrams/TwoD.hs b/src/Diagrams/TwoD.hs
--- a/src/Diagrams/TwoD.hs
+++ b/src/Diagrams/TwoD.hs
@@ -212,6 +212,8 @@
        , translationX, translateX
        , translationY, translateY
        , translation, translate
+         -- ** Conformal affine maps
+       , scalingRotationTo, scaleRotateTo
          -- ** Reflection
        , reflectionX, reflectX
        , reflectionY, reflectY
diff --git a/src/Diagrams/TwoD/Polygons.hs b/src/Diagrams/TwoD/Polygons.hs
--- a/src/Diagrams/TwoD/Polygons.hs
+++ b/src/Diagrams/TwoD/Polygons.hs
@@ -126,10 +126,10 @@
 -- | Determine how a polygon should be oriented.
 data PolyOrientation n = NoOrient        -- ^ No special orientation; the first
                                          --   vertex will be at (1,0).
-                                         --   This is the default.
                        | OrientH         -- ^ Orient /horizontally/, so the
                                          --   bottommost edge is parallel to
                                          --   the x-axis.
+                                         --   This is the default.
                        | OrientV         -- ^ Orient /vertically/, so the
                                          --   leftmost edge is parallel to the
                                          --   y-axis.
diff --git a/src/Diagrams/TwoD/Transform.hs b/src/Diagrams/TwoD/Transform.hs
--- a/src/Diagrams/TwoD/Transform.hs
+++ b/src/Diagrams/TwoD/Transform.hs
@@ -39,6 +39,9 @@
        , translationY, translateY
        , translation, translate
 
+         -- * Conformal affine maps
+       , scalingRotationTo, scaleRotateTo
+
          -- * Reflection
        , reflectionX, reflectX
        , reflectionY, reflectY
@@ -56,6 +59,7 @@
 import           Diagrams.Core.Transform
 import           Diagrams.Direction
 import           Diagrams.Transform
+import           Diagrams.Transform.Matrix
 import           Diagrams.TwoD.Types
 import           Diagrams.TwoD.Vector
 
@@ -65,6 +69,7 @@
 import           Linear.Affine
 import           Linear.V2
 import           Linear.Vector
+import           Linear.Metric
 
 -- Rotation ------------------------------------------------
 
@@ -183,7 +188,28 @@
   => n -> t -> t
 translateY = transform . translationY
 
+-- Conformal affine maps -----------------------------------
 
+-- | The angle-preserving linear map that aligns the x-axis unit vector
+--   with the given vector.  See also 'scaleRotateTo'.
+scalingRotationTo :: (Floating n) => V2 n -> T2 n
+scalingRotationTo v = fromMatWithInv (conf v) (conf w) zero
+  where
+    w = reflectY (v ^/ quadrance v)
+    conf (V2 a b) = (V2 (V2 a (-b)) (V2 b a))
+
+-- | Rotate and uniformly scale around the local origin such that the
+--   x-axis aligns with the given vector.  This satisfies the equation
+--
+-- @
+-- scaleRotateTo v = rotateTo (dir v) . scale (norm v)
+-- @
+--
+-- up to floating point rounding errors, but is more accurate and
+-- performant since it avoids cancellable uses of trigonometric functions.
+scaleRotateTo :: (InSpace V2 n t, Transformable t, Floating n)
+              => V2 n -> t -> t
+scaleRotateTo = transform . scalingRotationTo
 
 -- Reflection ----------------------------------------------
 
