triangulate static method

List<num> triangulate(
  1. List<double> data,
  2. List<int>? holeIndices, [
  3. int? dim
])

Implementation

static List<num> triangulate(List<double> data, List<int>? holeIndices, [int? dim]) {
  dim = dim ?? 2;

  final hasHoles = holeIndices != null && holeIndices.isNotEmpty;
  final outerLen = hasHoles ? holeIndices[0] * dim : data.length;

  var outerNode = linkedList(data, 0, outerLen, dim, true);
  final List<num> triangles = [];

  if (outerNode == null || outerNode.next == outerNode.prev) return triangles;

  double minX = 0;
  double minY = 0;
  double maxX;
  double maxY;
  double x;
  double y;
  double invSize = 0;

  if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);

  // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox
  if (data.length > 80 * dim) {
    minX = maxX = data[0];
    minY = maxY = data[1];

    for (int i = dim; i < outerLen; i += dim) {
      x = data[i];
      y = data[i + 1];
      if (x < minX) minX = x;
      if (y < minY) minY = y;
      if (x > maxX) maxX = x;
      if (y > maxY) maxY = y;
    }

    // minX, minY and invSize are later used to transform coords into integers for z-order calculation
    invSize = math.max<double>(maxX - minX, maxY - minY);
    invSize = invSize != 0 ? 1 / invSize : 0;
  }

  earcutLinked(outerNode, triangles, dim, minX, minY, invSize, null);

  return triangles;
}