## Operations

All shapes (primitives or the results of operations) can be passed to special functions to perform logical operations, e.g. removing a hole from a board. In all cases, the operation returns the results, and never changes the original shapes.

### Union

Several shapes can be combined (merged) into a single shape. The result is the logical union of the shapes. The combining of smaller obects together allows easier transformations, etc.

`let shape = union(sphere({r: 1, center: true}), cube({size: 1.5, center: true})`

The CSG library functions can also be used. NOTE: Deprecated in the V2 API

`sphere({r: 1, center: true}).union(cube({size: 1.5, center: true}))`

### Intersection

Several objects can be combined (overlapped) into a single shape. This result is the logical intersection of the shapes.

`let shape = intersection(sphere({r: 1, center: true}), cube({size: 1.5, center: true}))`

The CSG library functions can also be used. NOTE: Deprecated in the V2 API

`sphere({r: 1, center: true}). intersect(cube({size: 1.5, center: true}))`

### Difference

Several shapes can be removed (subtracted) from another. The result is the logical difference of shapes.

Note: The first shape given is the base shape for all subtractions.

`let shape = difference(sphere({r: 1, center: true}), cube({size: 1.5, center: true}))`

The CSG library functions can also be used. NOTE: Deprecated in the V2 API

`sphere({r: 1, center: true}). subtract(cube({size: 1.5, center: true}))`

### Hull

Several shapes can be combined together to form the convex hull, i.e. sum of the outside shells. This includes irregular shapes such as combining a circle with a square.

Note: Convex hulls can be viewed as elastic wrapping around several shapes.

EXAMPLE

`let h = hull(square(10), translate([5, 10, 15], circle(10)))`

### Chain Hull

Chain Hull is a variant of Hull across multiple 2D forms, essentially sequential hulling, then creating a union of the results.

```chain_hull(
circle(), circle().translate([2,0,0]), ... );   // list of CAG/2D forms

let a = [];
a.push(circle());
chain_hull( a );                       // array of CAG/2D forms

chain_hull({closed: true},             // default is false
circle(), circle().translate([2, 0, 0]), circle().translate([2, 2, 0]))```