# LineSegment

A linear segment of a path.

## Constructors

LineSegment(s,e)→[LineSegment](https://cuttle.xyz/learn/reference/LineSegment)

Constructs a line segment.

`s`

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

`e`

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

LineSegment.fromAnchors(startAnchor,endAnchor)→[LineSegment](https://cuttle.xyz/learn/reference/LineSegment)

Constructs a line segment from two anchors.

Since this constructs a line segment, anchor handles will be ignored.

`startAnchor`

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

`endAnchor`

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

## Properties

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

The start position

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

The end position

## Methods

.isLinear()→boolean

For interface compatibility with CubicSegment.

Returns `true` since line segments are always linear.

.equals(segment)→boolean

`segment`

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

Another line segment

Returns `true` if the segment is exactly equal to `segment`.

.copy(segment)→[LineSegment](https://cuttle.xyz/learn/reference/LineSegment)chainable

Sets the positions of this segment so that it equals `segment`.

`segment`

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

.mix(segment,t)→[LineSegment](https://cuttle.xyz/learn/reference/LineSegment)chainable

Linearly interpolates this segment's control points to `segment`'s control points by the mixing factor `t`.

`segment`

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

The line segment to interpolate to.

`t`

`number`

The mixing factor between 0 and 1.

.setFromAnchors(startAnchor,endAnchor)→[LineSegment](https://cuttle.xyz/learn/reference/LineSegment)chainable

Sets the positions of this segment from two anchors.

`startAnchor`

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

The first anchor

`endAnchor`

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

The second anchor

.length()→number

Returns the distance from the start to the end of the segment.

.timeAtDistance(distance)→number

`distance`

`number`

Returns the time at `distance` along the along the segment.

.distanceAtTime(time)→number

`time`

`number`

A segment time between 0 and 1

Returns the distance along the segment at `time`.

.positionAtTime(time)→[Vec](https://cuttle.xyz/learn/reference/Vec)

`time`

`number`

A segment time between 0 and 1

Returns the position on the segment at `time`.

.derivativeAtTime(time)→[Vec](https://cuttle.xyz/learn/reference/Vec)

`time`

`number`

A segment time between 0 and 1

Returns the first derivative of the segment at `time`.

Line segments have a constant derivative, so this method will return the same value regardless of the specified `time`. This function takes `time` to keep segment and path interfaces consistent.

.secondDerivativeAtTime(time)→[Vec](https://cuttle.xyz/learn/reference/Vec)

`time`

`number`

A segment time between 0 and 1

Returns the second derivative of the segment at `time`.

The second derivative of a line segment is zero since its velocity is constant.

.curvatureAtTime(time)→number

`time`

`number`

A segment time between 0 and 1

Returns the curvature of the segment at `time`.

The curvature of a line segment is always zero, since it isn't curved!

.tangentAtTime(time)→[Vec](https://cuttle.xyz/learn/reference/Vec)

`time`

`number`

A segment time between 0 and 1

Returns a unit-length vector tangent to the segment at `time`.

.normalAtTime(time)→[Vec](https://cuttle.xyz/learn/reference/Vec)

`time`

`number`

A segment time between 0 and 1

Returns a unit-length vector perpendicular to the segment at `time`.

.slice(startTime,endTime)→[LineSegment](https://cuttle.xyz/learn/reference/LineSegment)

`startTime`

`number`

A segment time between 0 and 1

`endTime`

`number`

A segment time between 0 and 1

Returns a new line segment between `startTime` and `endTime`.

## Methods inherited from [Geometry](https://cuttle.xyz/learn/reference/Geometry)

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

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

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

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

.isValid()→boolean

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

.affineTransform(affineMatrix)→[LineSegment](https://cuttle.xyz/learn/reference/LineSegment)chainable

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)→[LineSegment](https://cuttle.xyz/learn/reference/LineSegment)chainable

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

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

Reverses this line segment by swapping the start and end points.

.closestPoint(point,areaOfInterest)→([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.

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

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

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

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

.isValid(a)→

`a`

`unknown`

Returns `true` if `geom` is valid geometry