// Copyright ©2024 The Gonum Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package curve defines space filling curves. A space filling curve is a curve // whose range contains the entirety of a finite k-dimensional space. Space // filling curves can be used to map between a linear space and a 2D, 3D, or 4D // space. // // # Hilbert Curves // // The Hilbert curve is a continuous, space filling curve first described by // David Hilbert. The implementation of Hilbert2D is based on example code from // the [Hilbert curve (Wikipedia)]. The implementation of Hilbert3D and // Hilbert4D are extrapolated from Hilbert2D. // // Technically, a Hilbert curve is a continuous, fractal, space-filling curve of // infinite length, constructed as the limit of a series of piecewise linear // curves. We refer to the kth piecewise linear curve as the k-order Hilbert // curve. The first-order 2D Hilbert curve looks like ⊐. The k-order // n-dimensional curve can be constructed from 2ⁿ copies of the (k-1) order // curve. These (finite) Hilbert curves are iterative/recursive, and the order // refers to the iteration number. // // The runtime of Space and Curve scales as O(n∙k) where n is the dimension and // k is the order. The length of the curve is 2^(n∙k). // // # Limitations // // An n-dimensional, k-order Hilbert curve will not be fully usable if 2ⁿᵏ // overflows int (which is dependent on architecture). Len will overflow if n∙k // ≥ bits.UintSize-1. Curve will overflow if n∙k > bits.UintSize-1 for some // values of v. Space will not overflow, but it cannot be called with values // that do not fit in a signed integer, thus only a subset of the curve can be // utilized. // // [Hilbert curve (Wikipedia)]: https://en.wikipedia.org/w/index.php?title=Hilbert_curve&oldid=1011599190 package curve