generatePositions method

  1. @override
List<HexCoordinate> generatePositions({
  1. required int columns,
  2. required int rows,
  3. required HexOrientation orientation,
  4. int? count,
})
override

根据策略生成坐标序列

columns 网格列数 rows 网格行数 orientation 六边形方向 count 需要的坐标数量(如果为null,返回所有可用坐标)

Implementation

@override
List<HexCoordinate> generatePositions({
  required int columns,
  required int rows,
  required HexOrientation orientation,
  int? count,
}) {
  final isPointy = orientation == HexOrientation.pointy;

  // 确定起始位置(网格中心)
  final centerCol = columns ~/ 2;
  final centerRow = rows ~/ 2;
  final center =
      startPosition ??
      (isPointy
          ? HexCoordinate.fromOffsetPointy(centerCol, centerRow)
          : HexCoordinate.fromOffsetFlat(centerCol, centerRow));

  final positions = <HexCoordinate>[];
  final maxRadius = (columns > rows ? columns : rows) + 1;

  // 从中心开始螺旋向外
  for (var radius = 0; radius <= maxRadius; radius++) {
    final ring = center.spiral(radius);

    for (final coord in ring) {
      // 检查坐标是否在网格范围内
      final (col, row) = isPointy
          ? coord.toOffsetPointy()
          : coord.toOffsetFlat();

      if (col >= 0 && col < columns && row >= 0 && row < rows) {
        if (!positions.contains(coord)) {
          positions.add(coord);

          if (count != null && positions.length >= count) {
            return positions;
          }
        }
      }
    }
  }

  return positions;
}