hilbert3D static method

dynamic hilbert3D(
  1. dynamic center,
  2. dynamic size,
  3. dynamic iterations,
  4. dynamic v0,
  5. dynamic v1,
  6. dynamic v2,
  7. dynamic v3,
  8. dynamic v4,
  9. dynamic v5,
  10. dynamic v6,
  11. dynamic v7,
)

Generates 3D-Coordinates in a very fast way.

Based on work by: @link http://www.openprocessing.org/visuals/?visualID=15599

@param center Center of Hilbert curve. @param size Total width of Hilbert curve. @param iterations Number of subdivisions. @param v0 Corner index -X, +Y, -Z. @param v1 Corner index -X, +Y, +Z. @param v2 Corner index -X, -Y, +Z. @param v3 Corner index -X, -Y, -Z. @param v4 Corner index +X, -Y, -Z. @param v5 Corner index +X, -Y, +Z. @param v6 Corner index +X, +Y, +Z. @param v7 Corner index +X, +Y, -Z.

Implementation

static hilbert3D(center, size, iterations, v0, v1, v2, v3, v4, v5, v6, v7) {
  // Default Vars
  center = center ?? Vector3(0, 0, 0);
  size = size ?? 10;

  var half = size / 2;
  iterations = iterations ?? 1;
  v0 = v0 ?? 0;
  v1 = v1 ?? 1;
  v2 = v2 ?? 2;
  v3 = v3 ?? 3;
  v4 = v4 ?? 4;
  v5 = v5 ?? 5;
  v6 = v6 ?? 6;
  v7 = v7 ?? 7;

  var vecS = [
    Vector3(center.x - half, center.y + half, center.z - half),
    Vector3(center.x - half, center.y + half, center.z + half),
    Vector3(center.x - half, center.y - half, center.z + half),
    Vector3(center.x - half, center.y - half, center.z - half),
    Vector3(center.x + half, center.y - half, center.z - half),
    Vector3(center.x + half, center.y - half, center.z + half),
    Vector3(center.x + half, center.y + half, center.z + half),
    Vector3(center.x + half, center.y + half, center.z - half)
  ];

  var vec = [vecS[v0], vecS[v1], vecS[v2], vecS[v3], vecS[v4], vecS[v5], vecS[v6], vecS[v7]];

  // Recurse iterations
  if (--iterations >= 0) {
    var tmp = [];

    tmp.addAll(GeometryUtils.hilbert3D(vec[0], half, iterations, v0, v3, v4, v7, v6, v5, v2, v1));
    tmp.addAll(GeometryUtils.hilbert3D(vec[1], half, iterations, v0, v7, v6, v1, v2, v5, v4, v3));
    tmp.addAll(GeometryUtils.hilbert3D(vec[2], half, iterations, v0, v7, v6, v1, v2, v5, v4, v3));
    tmp.addAll(GeometryUtils.hilbert3D(vec[3], half, iterations, v2, v3, v0, v1, v6, v7, v4, v5));
    tmp.addAll(GeometryUtils.hilbert3D(vec[4], half, iterations, v2, v3, v0, v1, v6, v7, v4, v5));
    tmp.addAll(GeometryUtils.hilbert3D(vec[5], half, iterations, v4, v3, v2, v5, v6, v1, v0, v7));
    tmp.addAll(GeometryUtils.hilbert3D(vec[6], half, iterations, v4, v3, v2, v5, v6, v1, v0, v7));
    tmp.addAll(GeometryUtils.hilbert3D(vec[7], half, iterations, v6, v5, v2, v1, v0, v3, v4, v7));

    // Return recursive call
    return tmp;
  }

  // Return complete Hilbert Curve.
  return vec;
}