# polyclip: Polygon Clipping In polyclip: Polygon Clipping

## Description

Find intersection, union or set difference of two polygonal regions.

## Usage

 ```1 2 3 4 5``` ``` polyclip(A, B, op=c("intersection", "union", "minus", "xor"), ..., eps, x0, y0, fillA=c("evenodd", "nonzero", "positive", "negative"), fillB=c("evenodd", "nonzero", "positive", "negative")) ```

## Arguments

 `A,B` Data specifying polygons. See Details. `op` Set operation to be performed to combine `A` and `B`. `...` Ignored. `eps` Spatial resolution for coordinates. `x0,y0` Spatial origin for coordinates. `fillA,fillB` Polygon-filling rule for `A` and `B`.

## Details

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

Given two polygonal regions `A` and `B` the function `polyclip` performs one of the following geometrical operations:

• `op="intersection"`: set intersection of `A` and `B`.

• `op="union"`: set union of `A` and `B`.

• `op="minus"`: set subtraction (sometimes called set difference): the region covered by `A` that is not covered by `B`.

• `op="xor"`: exclusive set difference (sometimes called exclusive-or): the region covered by exactly one of the sets `A` and `B`.

Each of the arguments `A` and `B` represents a region in the Euclidean plane bounded by closed polygons. The format of these arguments 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 interpretation of the polygons depends on the polygon-filling rule for `A` and `B` that is specified by the arguments `fillA` and `fillB` respectively.

Even-Odd:

The default rule is even-odd filling, in which every polygon edge demarcates a boundary between the inside and outside of the region. It does not matter whether a polygon is traversed in clockwise or anticlockwise order. Holes are determined simply by their locations relative to other polygons such that outers contain holes and holes contain outers.

Non-Zero:

Under the nonzero filling rule, an outer boundary must be traversed in clockwise order, while a hole must be traversed in anticlockwise order.

Positive:

Under the `positive` filling rule, the filled region consists of all points with positive winding number.

Negative:

Under the `negative` filling rule, the filled region consists of all points with negative winding number.

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.

## Value

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

## 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

`polysimplify`, `polyoffset`, `polylineoffset`, `polyminkowski`

## Examples

 ```1 2 3 4 5 6 7``` ``` A <- list(list(x=1:10, y=c(1:5,5:1))) B <- list(list(x=c(2,8,8,2),y=c(0,0,10,10))) plot(c(0,10),c(0,10), type="n", axes=FALSE, xlab="", ylab="") polygon(A[[1]]) polygon(B[[1]]) C <- polyclip(A, B) polygon(C[[1]], lwd=3, col=3) ```

### Example output

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

polyclip documentation built on May 16, 2018, 9:04 a.m.