The ClipperOffset class encapsulates the process of offsetting (inflating/deflating) both open and closed paths using a number of different join types and end types.
(This class replaces the now deprecated OffsetPaths function which was less flexible.)
Preconditions for offsetting: 1. The orientations of closed paths must be consistent such that outer polygons share the same orientation, and any holes have the opposite orientation (ie non-zero filling). Open paths must be oriented with closed outer polygons. 2. Polygons must not self-intersect.
Limitations: When offsetting, small artefacts may appear where polygons overlap. To avoid these artefacts, offset overlapping polygons separately.