# Geometry

The base class for anything that is representable on the canvas. Geometry types must support any affine transformation.

## Constructors

Geometry is an abstract type and cannot be instantiated its own.

## Methods

Geometry.intersectionsBetweenAll(geometries,areaOfInterest)→[IntersectionResult](https://cuttle.xyz/learn/reference/interfaces#IntersectionResult)\[\]

Finds intersections between all geometries in the array, including self-intersections.

`geometries`

`[Geometry](https://cuttle.xyz/learn/reference/Geometry)[]`

An array of geometries to intersect

`areaOfInterest`

`[BoundingBox](https://cuttle.xyz/learn/reference/BoundingBox)`

optional

If supplied, only intersection results inside this bounding box will be returned. This can save a lot of computation if you only need to find intersections within a small area.

Returns An array of intersections

Geometry.intersectionsBetweenSets(geometries1,geometries2,areaOfInterest)→[IntersectionResult](https://cuttle.xyz/learn/reference/interfaces#IntersectionResult)\[\]

Finds intersections between two sets of geometries. This won't find self-intersections or intersections within the two sets.

`geometries1`

`[Geometry](https://cuttle.xyz/learn/reference/Geometry)[]`

The first geometry array to intersect

`geometries2`

`[Geometry](https://cuttle.xyz/learn/reference/Geometry)[]`

The second geometry array to intersect

`areaOfInterest`

`[BoundingBox](https://cuttle.xyz/learn/reference/BoundingBox)`

optional

If supplied, only intersection results inside this bounding box will be returned. This can save a lot of computation if you only need to find intersections within a small area.

Returns An array of intersections

Geometry.overlapsBetweenAll(geometries,areaOfInterest,tolerance)→[OverlapResult](https://cuttle.xyz/learn/reference/OverlapResult)\[\]

Finds overlaps between all geometries in the array.

`geometries`

`[Geometry](https://cuttle.xyz/learn/reference/Geometry)[]`

An array of geometries to find overlaps between.

`areaOfInterest`

`[BoundingBox](https://cuttle.xyz/learn/reference/BoundingBox)`

optional

If supplied, input geometry will be filtered so that only parts that intersect this bounding box will be tested. This can save a lot of time if only need to find overlaps within a small area.

`tolerance`

`number`

optional

The maximum distance apart two segments can be to be considered overlapping.

Returns An array of overlaps

Geometry.overlapsBetweenSets(geometries1,geometries2,areaOfInterest,tolerance)→[OverlapResult](https://cuttle.xyz/learn/reference/OverlapResult)\[\]

Finds overlaps between two sets of geometry. This won't find overlaps within the two sets.

`geometries1`

`[Geometry](https://cuttle.xyz/learn/reference/Geometry)[]`

The first set of geometries

`geometries2`

`[Geometry](https://cuttle.xyz/learn/reference/Geometry)[]`

The second set of geometries

`areaOfInterest`

`[BoundingBox](https://cuttle.xyz/learn/reference/BoundingBox)`

optional

If supplied, input geometry will be filtered so that only parts that intersect this bounding box will be tested. This can save a lot of time if only need to find overlaps within a small area.

`tolerance`

`number`

optional

The maximum distance apart two segments can be to be considered overlapping.

Returns As array of overlaps between the two sets of geometry

Geometry.isValid(geom)→

`geom`

`unknown`

Returns `true` if `geom` is valid geometry

.isValid()→boolean

Returns `true` if this geometry is valid, or `false` otherwise.

.clone()→[Geometry](https://cuttle.xyz/learn/reference/Geometry)

Clone is useful when you need to make a change to geometry without changing the original.

```
const transformedPath = path.clone().transform({ rotation: 45 });
```

Returns A deep copy of this geometry

.closestPoint(point,areaOfInterest)→([ClosestPointResult](https://cuttle.xyz/learn/reference/interfaces#ClosestPointResult) | [ClosestPointResultWithTime](https://cuttle.xyz/learn/reference/interfaces#ClosestPointResultWithTime) | undefined)

`point`

`[Vec](https://cuttle.xyz/learn/reference/Vec)`

The target point

`areaOfInterest`

`[BoundingBox](https://cuttle.xyz/learn/reference/BoundingBox)`

optional

If supplied, only results inside this bounding box will be returned. This can save a lot of computation if you only need to find closest points within a small area. Typically `areaOfInterest` is centered on `point`, but this isn't required.

Returns The closest point to `point` that lies on this geometry, or `undefined` if no point is found.

.affineTransform(affineMatrix)→thischainable

Spatially transforms this geometry by an affine transformation matrix.

Affine matrices can represent any 2-dimensional transformation that keeps lines parallel.

`affineMatrix`

`[AffineMatrix](https://cuttle.xyz/learn/reference/AffineMatrix)`

.affineTransformWithoutTranslation(affineMatrix)→thischainable

Spatially transforms this geometry by an affine transformation matrix, excluding translation. Only rotation, scale, and skew transformations will be applied.

`affineMatrix`

`[AffineMatrix](https://cuttle.xyz/learn/reference/AffineMatrix)`

.transform(transform)→thischainable

Transforms this geometry.

A transform can optionally specify any of `position`, `rotation`, `scale`, `skew` and `origin`.

`origin` defines the center (in pre-transform coordinates) of the transformation for `rotation`, `scale` and `skew`.

```
// Simple translation
geometry.translate({
  position: Vec(1, 0),
});

// Rotation and scale
geometry.transform({
  rotation: 45,
  scale: 2,
});

// Complicated transform
geometry.transform({
  position: Vec(1, 1),
  rotation: 180,
  scale: Vec(2, 1),
  skew: 45,
  origin: Vec(-0.5, 0.5),
};
```

`transform`

`[TransformArgs](https://cuttle.xyz/learn/reference/interfaces#TransformArgs)`

.reverse()→[Geometry](https://cuttle.xyz/learn/reference/Geometry)chainable

Reverses this geometry.

.boundingBox()→([BoundingBox](https://cuttle.xyz/learn/reference/BoundingBox) | undefined)

Returns the smallest axis-aligned bounding box that contains this geometry.

.looseBoundingBox()→([BoundingBox](https://cuttle.xyz/learn/reference/BoundingBox) | undefined)

The loose bounding box may not be the smallest possible, but it's usually cheaper to compute. Use this when the exact bounding box isn't required.

Returns an axis-aligned bounding box that contains this geometry.

.isContainedByBoundingBox(box)→boolean

Geometry is contained by a bounding box if no part of it lies beyond it's minimum and maximum.

`box`

`[BoundingBox](https://cuttle.xyz/learn/reference/BoundingBox)`

.isIntersectedByBoundingBox(box)→boolean

Geometry intersects a bounding box if part of the geometry crosses the boundary between the inside and outside of the box.

`box`

`[BoundingBox](https://cuttle.xyz/learn/reference/BoundingBox)`

.isOverlappedByBoundingBox(box)→boolean

Geometry is overlapped by a bounding box if a point can be chosen that is indside both the geometry and the box.

Geometry is overlapped by a bounding box if it's contained inside, or intersected by it.

`box`

`[BoundingBox](https://cuttle.xyz/learn/reference/BoundingBox)`

.intersectionsWith(geometries,areaOfInterest)→[IntersectionResult](https://cuttle.xyz/learn/reference/interfaces#IntersectionResult)\[\]

`geometries`

`[Geometry](https://cuttle.xyz/learn/reference/Geometry)[]`

An array of geometries to intersect with.

`areaOfInterest`

`[BoundingBox](https://cuttle.xyz/learn/reference/BoundingBox)`

optional

If supplied, only intersection results inside this bounding box will be returned. This can save a lot of computation if you only need to find intersections within a small area.

Returns An array of intersections between this geometry and `geometries`

.overlapsWith(geometries,areaOfInterest,tolerance)→[OverlapResult](https://cuttle.xyz/learn/reference/OverlapResult)\[\]

`geometries`

`[Geometry](https://cuttle.xyz/learn/reference/Geometry)[]`

An array of geometries to find overlaps with.

`areaOfInterest`

`[BoundingBox](https://cuttle.xyz/learn/reference/BoundingBox)`

optional

If supplied, input geometry will be filtered so that only parts that intersect this bounding box will be tested. This can save a lot of time if only need to find overlaps within a small area.

`tolerance`

`number`

optional

The maximum distance apart two segments can be to be considered overlapping.

Returns An array of overlaps between this geometry and `geometries`

.distanceToIntersect(targetGeometry,direction,options)→(number | undefined)

`targetGeometry`

`[Geometry](https://cuttle.xyz/learn/reference/Geometry)`

The geometry to move toward.

`direction`

`[Vec](https://cuttle.xyz/learn/reference/Vec)`

The direction to move in. This should point towards the target geometry, otherwise no intersection may be found.

`options`

`[DistanceToIntersectOptions](https://cuttle.xyz/learn/reference/interfaces#DistanceToIntersectOptions)`

optional

Returns approximately the smallest distance to move until this geometry intersects the target geometry.

If `minOverlap` is specified, the distance to move until the geometry overlaps by some minimum width will be returned instead.

Returns `undefined` if no intersection is found.