# polyoffset: Polygon Offset In polyclip: Polygon Clipping

## Description

Given a polygonal region, compute the offset region (aka: guard region, buffer region, morphological dilation) formed by shifting the boundary outwards by a specified distance.

## Usage

 ```1 2 3 4 5``` ``` polyoffset(A, delta, ..., eps, x0, y0, miterlim=2, arctol=abs(delta)/100, jointype=c("square", "round", "miter")) ```

## Arguments

 `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.

## Details

This is part of an interface to the polygon-clipping library `Clipper` written by Angus Johnson.

Given a polygonal region `A`, the function `polyoffset` 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 region in the Euclidean plane bounded by closed polygons. The format is either

• a list containing two components `x` and `y` giving the coordinates of the vertices of a single polygon. The last vertex should not repeat the first vertex.

• a `list` of `list(x,y)` structures giving the coordinates of the vertices of several polygons.

Note that calculations are performed in integer arithmetic: see below.

The argument `jointype` determines what happens at the convex vertices of `A`. 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 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 64-bit integer. Thus, `eps` is the effective spatial resolution. The default values ensure reasonable accuracy.

## Value

Data specifying polygons, in the same format as `A`.

## References

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. Springer-Verlag. http://books.google.com/books?q=vatti+clipping+agoston

Chen, X. and McMains, S. (2005) Polygon Offsetting by Computing Winding Numbers. Paper no. DETC2005-85513 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

`polylineoffset`, `polyclip`, `polysimplify`, `polyminkowski`

## Examples

 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13``` ``` 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", axes=FALSE, xlab="", ylab="") polygon(A[[1]], col="grey") C <- polyoffset(A, 1, jointype="square") polygon(C[[1]], lwd=3, border="blue") plot(c(0,10),c(0,10), type="n", main="jointype=round", axes=FALSE, xlab="", ylab="") polygon(A[[1]], col="grey") C <- polyoffset(A, 1, jointype="round") polygon(C[[1]], lwd=3, border="blue") plot(c(0,10),c(0,10), type="n", main="jointype=miter", axes=FALSE, xlab="", ylab="") polygon(A[[1]], col="grey") C <- polyoffset(A, 1, jointype="miter") polygon(C[[1]], lwd=3, border="blue") ```

### Example output

```polyclip 1.6-1 built from Clipper C++ version 6.4.0
```

polyclip documentation built on June 14, 2018, 9:04 a.m.