zoomForScale static method

KLineZoomResult zoomForScale({
  1. required double startBeginIndex,
  2. required double startItemCount,
  3. required double scale,
  4. required double startFocalDx,
  5. required double currentFocalDx,
  6. required double viewportWidth,
  7. required int dataLength,
  8. required double minItemCount,
  9. required double maxItemCount,
})

Implementation

static KLineZoomResult zoomForScale({
  required double startBeginIndex,
  required double startItemCount,
  required double scale,
  required double startFocalDx,
  required double currentFocalDx,
  required double viewportWidth,
  required int dataLength,
  required double minItemCount,
  required double maxItemCount,
}) {
  if (dataLength <= 0 || startItemCount <= 0 || viewportWidth <= 0) {
    return const KLineZoomResult(beginIndex: 0.0, itemCount: 0.0);
  }

  final safeScale = scale > 0 ? scale : 1.0;
  final maxVisibleCount = min(maxItemCount, dataLength.toDouble());
  final minVisibleCount = min(minItemCount, maxVisibleCount);
  final nextItemCount = (startItemCount / safeScale)
      .clamp(minVisibleCount, maxVisibleCount)
      .toDouble();

  final startFocalRatio = (startFocalDx / viewportWidth).clamp(0.0, 1.0);
  final currentFocalRatio = (currentFocalDx / viewportWidth).clamp(0.0, 1.0);
  final focalDataIndex = startBeginIndex + startItemCount * startFocalRatio;
  final rawBeginIndex = focalDataIndex - nextItemCount * currentFocalRatio;
  final maxBeginIndex = max(0.0, dataLength - nextItemCount);

  return KLineZoomResult(
    beginIndex: rawBeginIndex.clamp(0.0, maxBeginIndex).toDouble(),
    itemCount: nextItemCount,
  );
}