lineclip function

List<List<Position>> lineclip(
  1. List<Position> points,
  2. BBox bbox, [
  3. List<List<Position>>? result
])

Implementation

List<List<Position>> lineclip(
  List<Position> points,
  BBox bbox, [
  List<List<Position>>? result,
]) {
  final int len = points.length;
  int codeA = bitCode(points[0], bbox);
  List<Position> part = [];
  result ??= [];

  for (int i = 1; i < len; i++) {
    Position a = points[i - 1];
    Position b = points[i];
    int codeB = bitCode(b, bbox);
    final int lastCode = codeB;

    while (true) {
      if ((codeA | codeB) == 0) {
        part.add(a);
        if (codeB != lastCode) {
          part.add(b);
          if (i < len - 1) {
            result.add(List<Position>.from(part));
            part = [];
          }
        } else if (i == len - 1) {
          part.add(b);
        }
        break;
      } else if ((codeA & codeB) != 0) {
        break;
      } else if (codeA != 0) {
        a = intersect(a, b, codeA, bbox);
        codeA = bitCode(a, bbox);
      } else {
        b = intersect(a, b, codeB, bbox);
        codeB = bitCode(b, bbox);
      }
    }
    codeA = lastCode;
  }

  if (part.isNotEmpty) result.add(List<Position>.from(part));
  return result;
}