bezierSmooth method

List<Line3> bezierSmooth()

Smooths Line3 using bezier smoothing algorithm.

Implementation

List<Line3> bezierSmooth() {
  if (length <= 1) return this;
  const smooth = 0.1;
  final result = <Line3>[];

  result.add(this[0]);
  for (var i = 1; i < length - 1; i += 1) {
    final previous = this[i - 1].a;
    final next = this[i + 1].b;
    final currentA = this[i].a;
    final currentB = this[i].b;

    final controlA = Vector3(
      currentA.x - (previous.x - currentA.x) * smooth,
      currentA.y - (previous.y - currentA.y) * smooth,
      currentA.z - (previous.z - currentA.z) * smooth,
    );
    final controlB = Vector3(
      currentB.x - (next.x - currentB.x) * smooth,
      currentB.y - (next.y - currentB.y) * smooth,
      currentB.z - (next.z - currentB.z) * smooth,
    );

    final lines = [0.0, 0.3, 0.6, 1.0];
    lines
        .map((e) => _bezier4(currentA, controlA, controlB, currentB, e))
        .toList()
        .windowedWithStep(2, 1)
        .map((e) => Line3(e.elementAt(0), e.elementAt(1)))
        .forEach((element) => result.add(element));
  }
  result.add(this[length - 1]);
  return result;
}