Curves.Spline.Type.Hermite (curves v1.0.1)

Copy Markdown View Source

A cubic Hermite spline: a smooth curve through every knot, leaving each knot in the direction (and with the speed) of the tangent you give it.

Each point is a list of its knot and its tangent, [{x, y}, {tx, ty}]. The tangent is the curve's velocity at that knot per unit of u: a longer tangent makes the curve leave the knot more steeply and bend later. A spline with n points has n - 1 segments.

curve = Curves.define_hermite([
  [{0, 0}, {10, 0}],
  [{10, 5}, {0, 10}],
  [{20, 10}, {10, 0}]
])

# Find any point along the curve (u goes from 0.0 to Curves.max_u(curve))...
Curves.solve!(curve, 1.5)

# ...or draw the whole curve as an SVG image
Curves.Svg.save!(curve, "hermite.svg")

Hermite Spline

How it is built

A Hermite segment from knot p0 (tangent m0) to knot p1 (tangent m1) is exactly the cubic Bezier curve [p0, p0 + m0 / 3, p1 - m1 / 3, p1]. So each segment is stored and solved as that Bezier curve: the curve stores those Bezier points (the knots plus the two points beside each), and Curves.Svg draws them as its dots.