# HermiteSpline

#### new Cesium.HermiteSpline(options)
Core/HermiteSpline.js 167

A Hermite spline is a cubic interpolating spline. Points, incoming tangents, outgoing tangents, and times must be defined for each control point. The outgoing tangents are defined for points [0, n - 2] and the incoming tangents are defined for points [1, n - 1]. For example, when interpolating a segment of the curve between `points[i]` and `points[i + 1]`, the tangents at the points will be `outTangents[i]` and `inTangents[i]`, respectively.

Name | Type | Description
--- | --- | ---
`options` | Object | Object with the following properties:
Name | Type | Description
--- | --- | ---
`times` | Array.<Number> | An array of strictly increasing, unit-less, floating-point times at each point. The values are in no way connected to the clock time. They are the parameterization for the curve.
`points` | Array.<Cartesian3> | The array of `Cartesian3` control points.
`inTangents` | Array.<Cartesian3> | The array of `Cartesian3` incoming tangents at each control point.
`outTangents` | Array.<Cartesian3> | The array of `Cartesian3` outgoing tangents at each control point.

##### Throws:

- DeveloperError : points.length must be greater than or equal to 2.
- DeveloperError : times.length must be equal to points.length.
- DeveloperError : inTangents and outTangents must have a length equal to points.length - 1.

##### Example:

    // Create a G<sup>1</sup> continuous Hermite spline
    var times = [ 0.0, 1.5, 3.0, 4.5, 6.0 ];
    var spline = new Cesium.HermiteSpline({
        times : times,
        points : [
            new Cesium.Cartesian3(1235398.0, -4810983.0, 4146266.0),
            new Cesium.Cartesian3(1372574.0, -5345182.0, 4606657.0),
            new Cesium.Cartesian3(-757983.0, -5542796.0, 4514323.0),
            new Cesium.Cartesian3(-2821260.0, -5248423.0, 4021290.0),
            new Cesium.Cartesian3(-2539788.0, -4724797.0, 3620093.0)
        ],
        outTangents : [
            new Cesium.Cartesian3(1125196, -161816, 270551),
            new Cesium.Cartesian3(-996690.5, -365906.5, 184028.5),
            new Cesium.Cartesian3(-2096917, 48379.5, -292683.5),
            new Cesium.Cartesian3(-890902.5, 408999.5, -447115)
        ],
        inTangents : [
            new Cesium.Cartesian3(-1993381, -731813, 368057),
            new Cesium.Cartesian3(-4193834, 96759, -585367),
            new Cesium.Cartesian3(-1781805, 817999, -894230),
            new Cesium.Cartesian3(1165345, 112641, 47281)
        ]
    });

    var p0 = spline.evaluate(times[0]);

##### See:

- CatmullRomSpline
- LinearSpline
- QuaternionSpline
- WeightSpline

### Members

#### readonly inTangents : Array.<Cartesian3>
Core/HermiteSpline.js 249

An array of `Cartesian3` incoming tangents at each control point.

#### readonly outTangents : Array.<Cartesian3>
Core/HermiteSpline.js 263

An array of `Cartesian3` outgoing tangents at each control point.

#### readonly points : Array.<Cartesian3>
Core/HermiteSpline.js 235

An array of `Cartesian3` control points.

#### readonly times : Array.<Number>
Core/HermiteSpline.js 221

An array of times for the control points.

### Methods

#### static Cesium.HermiteSpline.createC1(options) → HermiteSpline
Core/HermiteSpline.js 308

Creates a spline where the tangents at each control point are the same. The curves are guaranteed to be at least in the class C1.

Name | Type | Description
--- | --- | ---
`options` | Object | Object with the following properties:
Name | Type | Description
--- | --- | ---
`times` | Array.<Number> | The array of control point times.
`points` | Array.<Cartesian3> | The array of control points.
`tangents` | Array.<Cartesian3> | The array of tangents at the control points.

##### Returns:

A hermite spline.

##### Throws:

- DeveloperError : points, times and tangents are required.
- DeveloperError : points.length must be greater than or equal to 2.
- DeveloperError : times, points and tangents must have the same length.

##### Example:

    var points = [
        new Cesium.Cartesian3(1235398.0, -4810983.0, 4146266.0),
        new Cesium.Cartesian3(1372574.0, -5345182.0, 4606657.0),
        new Cesium.Cartesian3(-757983.0, -5542796.0, 4514323.0),
        new Cesium.Cartesian3(-2821260.0, -5248423.0, 4021290.0),
        new Cesium.Cartesian3(-2539788.0, -4724797.0, 3620093.0)
    ];

    // Add tangents
    var tangents = new Array(points.length);
    tangents[0] = new Cesium.Cartesian3(1125196, -161816, 270551);
    var temp = new Cesium.Cartesian3();
    for (var i = 1; i < tangents.length - 1; ++i) {
        tangents[i] = Cesium.Cartesian3.multiplyByScalar(Cesium.Cartesian3.subtract(points[i + 1], points[i - 1], temp), 0.5, new Cesium.Cartesian3());
    }
    tangents[tangents.length - 1] = new Cesium.Cartesian3(1165345, 112641, 47281);

    var spline = Cesium.HermiteSpline.createC1({
        times : times,
        points : points,
        tangents : tangents
    });

#### static Cesium.HermiteSpline.createClampedCubic(options) → HermiteSpline|LinearSpline
Core/HermiteSpline.js 437

Creates a clamped cubic spline. The tangents at the interior control points are generated to create a curve in the class C2.

Name | Type | Description
--- | --- | ---
`options` | Object | Object with the following properties:
Name | Type | Description
--- | --- | ---
`times` | Array.<Number> | The array of control point times.
`points` | Array.<Cartesian3> | The array of control points.
`firstTangent` | Cartesian3 | The outgoing tangent of the first control point.
`lastTangent` | Cartesian3 | The incoming tangent of the last control point.

##### Returns:

A hermite spline or a linear spline if less than 3 control points were given.

##### Throws:

- DeveloperError : points, times, firstTangent and lastTangent are required.
- DeveloperError : points.length must be greater than or equal to 2.
- DeveloperError : times.length must be equal to points.length.

##### Example:

    // Create a clamped cubic spline above the earth from Philadelphia to Los Angeles.
    var spline = Cesium.HermiteSpline.createClampedCubic({
        times : [ 0.0, 1.5, 3.0, 4.5, 6.0 ],
        points : [
            new Cesium.Cartesian3(1235398.0, -4810983.0, 4146266.0),
            new Cesium.Cartesian3(1372574.0, -5345182.0, 4606657.0),
            new Cesium.Cartesian3(-757983.0, -5542796.0, 4514323.0),
            new Cesium.Cartesian3(-2821260.0, -5248423.0, 4021290.0),
            new Cesium.Cartesian3(-2539788.0, -4724797.0, 3620093.0)
        ],
        firstTangent : new Cesium.Cartesian3(1125196, -161816, 270551),
        lastTangent : new Cesium.Cartesian3(1165345, 112641, 47281)
    });

#### static Cesium.HermiteSpline.createNaturalCubic(options) → HermiteSpline|LinearSpline
Core/HermiteSpline.js 368

Creates a natural cubic spline. The tangents at the control points are generated to create a curve in the class C2.

Name | Type | Description
--- | --- | ---
`options` | Object | Object with the following properties:
Name | Type | Description
--- | --- | ---
`times` | Array.<Number> | The array of control point times.
`points` | Array.<Cartesian3> | The array of control points.

##### Returns:

A hermite spline or a linear spline if less than 3 control points were given.

##### Throws:

- DeveloperError : points and times are required.
- DeveloperError : points.length must be greater than or equal to 2.
- DeveloperError : times.length must be equal to points.length.

##### Example:

    // Create a natural cubic spline above the earth from Philadelphia to Los Angeles.
    var spline = Cesium.HermiteSpline.createNaturalCubic({
        times : [ 0.0, 1.5, 3.0, 4.5, 6.0 ],
        points : [
            new Cesium.Cartesian3(1235398.0, -4810983.0, 4146266.0),
            new Cesium.Cartesian3(1372574.0, -5345182.0, 4606657.0),
            new Cesium.Cartesian3(-757983.0, -5542796.0, 4514323.0),
            new Cesium.Cartesian3(-2821260.0, -5248423.0, 4021290.0),
            new Cesium.Cartesian3(-2539788.0, -4724797.0, 3620093.0)
        ]
    });

#### clampTime(time) → Number
Core/HermiteSpline.js 537

Clamps the given time to the period covered by the spline.

Name | Type | Description
--- | --- | ---
`time` | Number | The time.

##### Returns:

The time, clamped to the animation period.

#### evaluate(time, result) → Cartesian3
Core/HermiteSpline.js 550

Evaluates the curve at a given time.

Name | Type | Description
--- | --- | ---
`time` | Number | The time at which to evaluate the curve.
`result` | Cartesian3 | optional The object onto which to store the result.

##### Returns:

The modified result parameter or a new instance of the point on the curve at the given time.

##### Throws:

- DeveloperError : time must be in the range `[t0, tn]`, where `t0` is the first element in the array `times` and `tn` is the last element in the array `times`.

#### findTimeInterval(time) → Number
Core/HermiteSpline.js 516

Finds an index `i` in `times` such that the parameter `time` is in the interval `[times[i], times[i + 1]]`.

Name | Type | Description
--- | --- | ---
`time` | Number | The time.

##### Returns:

The index for the element at the start of the interval.

##### Throws:

- DeveloperError : time must be in the range `[t0, tn]`, where `t0` is the first element in the array `times` and `tn` is the last element in the array `times`.

#### wrapTime(time) → Number
Core/HermiteSpline.js 528

Wraps the given time to the period covered by the spline.

Name | Type | Description
--- | --- | ---
`time` | Number | The time.

##### Returns:

The time, wrapped around to the updated animation.