dashedLines method

List<Op> dashedLines(
  1. List<Line> lines,
  2. FillerConfig config
)

Implementation

List<Op> dashedLines(List<Line> lines, FillerConfig config) {
  final double offset = config.dashOffset!;
  final double gap = config.dashGap!;
  final List<Op> ops = [];
  for (final Line line in lines) {
    final double length = line.length;
    final int count = (length / (offset + gap)).floor();
    final double lineOffset = (length + gap - (count * (offset + gap))) / 2;
    PointD lineStart = line.source;
    PointD lineEnd = line.target;
    if (lineStart.x > lineEnd.x) {
      lineStart = line.target;
      lineEnd = line.source;
    }
    final double alpha =
        atan((lineEnd.y - lineStart.y) / (lineEnd.x - lineStart.x));
    for (int i = 0; i < count; i++) {
      final double segmentStartOffset = i * (offset + gap);

      final double segmentStartX = lineStart.x +
          (segmentStartOffset * cos(alpha)) +
          (lineOffset * cos(alpha));
      final double segmentStartY = lineStart.y +
          segmentStartOffset * sin(alpha) +
          (lineOffset * sin(alpha));
      final PointD gapStart = PointD(segmentStartX, segmentStartY);

      final double segmentEndOffset = segmentStartOffset + offset;

      final double segmentEndX = lineStart.x +
          (segmentEndOffset * cos(alpha)) +
          (lineOffset * cos(alpha));
      final double segmentEndY = lineStart.y +
          (segmentEndOffset * sin(alpha)) +
          (lineOffset * sin(alpha));
      final PointD gapEnd = PointD(segmentEndX, segmentEndY);

      ops.addAll(OpsGenerator.doubleLine(
          gapStart.x, gapStart.y, gapEnd.x, gapEnd.y, config.drawConfig!));
    }
  }
  return ops;
}