createSpiralSnake static method

List<FreeHexagon> createSpiralSnake({
  1. required FreeHexagon center,
  2. required int count,
  3. double? size,
  4. double gap = 0.0,
  5. double tightness = 0.5,
})

创建蛇形螺旋(从中心向外)

center 中心六边形 count 六边形总数 size 六边形大小 gap 间隙 tightness 螺旋紧密度(0.0-1.0)

Implementation

static List<FreeHexagon> createSpiralSnake({
  required FreeHexagon center,
  required int count,
  double? size,
  double gap = 0.0,
  double tightness = 0.5,
}) {
  if (count <= 0) return [];

  final hexSize = size ?? center.size;
  final result = <FreeHexagon>[];

  var currentHex = center;
  var currentDirection = 0;
  var segmentLength = 1;
  var segmentProgress = 0;
  var segmentCount = 0;

  for (var i = 0; i < count; i++) {
    final nextCenter = HexagonLayoutHelper.calculateAdjacentCenter(
      sourceHex: currentHex,
      sourceEdge: currentDirection,
      targetSize: hexSize,
      gap: gap,
    );

    final nextHex = FreeHexagon(
      id: '${center.id}_spiral_$i',
      center: nextCenter,
      size: hexSize,
      orientation: center.orientation,
    );

    result.add(nextHex);
    currentHex = nextHex;
    segmentProgress++;

    // 螺旋逻辑:每完成一个段,转向并增加段长度
    if (segmentProgress >= segmentLength) {
      currentDirection = (currentDirection + 1) % 6;
      segmentProgress = 0;
      segmentCount++;

      // 每两个段增加一次长度
      if (segmentCount % 2 == 0) {
        segmentLength = (segmentLength + tightness).round().clamp(1, 10);
      }
    }
  }

  return result;
}