Given a list of polygonal lines, compute the offset region (guard region, buffer region, morphological dilation) formed by shifting the boundary outwards by a specified distance.
1 2 3 4 5 6 7 8  polylineoffset(A, delta,
...,
eps, x0, y0,
miterlim=2, arctol=abs(delta)/100,
jointype=c("square", "round", "miter"),
endtype = c("closedpolygon", "closedline",
"openbutt", "opensquare", "openround",
"closed", "butt", "square", "round"))

A 
Data specifying polygons. See Details. 
delta 
Distance over which the boundary should be shifted. 
... 
Ignored. 
eps 
Spatial resolution for coordinates. 
x0,y0 
Spatial origin for coordinates. 
miterlim,arctol 
Tolerance parameters: see Details. 
jointype 
Type of join operation to be performed at each vertex. See Details. 
endtype 
Type of geometrical operation to be performed at the start and end of each line. See Details. 
This is part of an interface to the polygonclipping library
Clipper
written by Angus Johnson.
Given a list of polygonal lines A
,
the function polylineoffset
computes the offset region
(also known as the morphological dilation, guard region,
buffer region, etc) obtained by shifting the boundary of A
outward by the distance delta
.
The argument A
represents a polygonal line (broken line)
or a list of broken lines. The format is either
a list containing two components x
and y
giving the coordinates of successive vertices of the broken line.
a list
of list(x,y)
structures giving
the coordinates of the vertices of several broken lines.
Lines may be selfintersecting and different lines may intersect each other. Note that calculations are performed in integer arithmetic: see below.
The argument jointype
determines what happens at the vertices
of each line. See the Examples for illustrations.
jointype="round"
: a circular arc is generated.
jointype="square"
: the circular arc is
replaced by a single straight line.
jointype="miter"
: the circular arc is
omitted entirely, or replaced by a single straight line.
The argument endtype
determines what happens at the beginning
and end of each line. See the Examples for illustrations.
endtype="closedpolygon"
: ends are joined together (using the
jointype
value) and the path filled as a polygon.
endtype="closedline"
: ends are joined together (using the
jointype
value) and the path is filled as a polyline.
endtype="openbutt"
: ends are squared off abruptly.
endtype="opensquare"
:
ends are squared off at distance delta
.
endtype="openround"
: ends are replaced by a semicircular arc.
The values endtype="closed"
, "butt"
, "square"
and "round"
are deprecated; they are
equivalent to endtype="closedpolygon"
,
"openbutt"
, "opensquare"
and "openround"
respectively.
The arguments miterlim
and arctol
are tolerances.
if jointype="round"
, then arctol
is the maximum
permissible distance between the true circular arc and its
discretised approximation.
if jointype="miter"
, then miterlimit * delta
is the maximum permissible displacement between the original vertex and the
corresponding offset vertex if the circular arc were to be
omitted entirely. The default is miterlimit=2
which is also the minimum value.
Calculations are performed in integer arithmetic
after subtracting x0,y0
from the coordinates,
dividing by eps
, and rounding to the nearest integer.
Thus, eps
is the effective spatial resolution.
The default values ensure reasonable accuracy.
Data specifying polygons, in the same format as A
.
Angus Johnson. Ported to R by Adrian Baddeley Adrian.Baddeley@curtin.edu.au.
Clipper Website: http://www.angusj.com
Vatti, B. (1992) A generic solution to polygon clipping. Communications of the ACM 35 (7) 56–63. http://portal.acm.org/citation.cfm?id=129906
Agoston, M.K. (2005) Computer graphics and geometric modeling: implementation and algorithms. SpringerVerlag. http://books.google.com/books?q=vatti+clipping+agoston
Chen, X. and McMains, S. (2005) Polygon Offsetting by Computing Winding Numbers. Paper no. DETC200585513 in Proceedings of IDETC/CIE 2005 (ASME 2005 International Design Engineering Technical Conferences and Computers and Information in Engineering Conference), pp. 565–575 http://www.me.berkeley.edu/~mcmains/pubs/DAC05OffsetPolygon.pdf
polyoffset
,
polysimplify
,
polyclip
,
polyminkowski
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  A < list(list(x=c(4,8,8,2,6), y=c(3,3,8,8,6)))
plot(c(0,10),c(0,10), type="n",
main="jointype=square, endtype=opensquare",
axes=FALSE, xlab="", ylab="")
lines(A[[1]], col="grey", lwd=3)
C < polylineoffset(A, 0.5, jointype="square", endtype="opensquare")
polygon(C[[1]], lwd=3, border="blue")
plot(c(0,10),c(0,10), type="n",
main="jointype=round, endtype=openround",
axes=FALSE, xlab="", ylab="")
lines(A[[1]], col="grey", lwd=3)
C < polylineoffset(A, 0.5, jointype="round", endtype="openround")
polygon(C[[1]], lwd=3, border="blue")

Questions? Problems? Suggestions? Tweet to @rdrrHQ or email at ian@mutexlabs.com.
All documentation is copyright its authors; we didn't write any of that.