Загрузка данных


    private List<Vector2> FindVerticalPocketPositions(List<Vector2> hexPositions)
    {
        const float tolerance = 0.01f;

        var pockets = new List<Vector2>();
        Vector2[] verticalOffsets = GetVerticalNeighborOffsets(1f);
        Vector2[] neighborOffsets = GetAllNeighborOffsets(1f);

        for (int i = 0; i < hexPositions.Count; i++)
        {
            Vector2 position = hexPositions[i];
            for (int offsetIndex = 0; offsetIndex < verticalOffsets.Length; offsetIndex++)
            {
                Vector2 candidate = position + verticalOffsets[offsetIndex];
                if (HasPosition(hexPositions, candidate, tolerance) || HasPosition(pockets, candidate, tolerance))
                {
                    continue;
                }

                if (CountNeighboringHexes(hexPositions, candidate, neighborOffsets, tolerance) >= 2)
                {
                    pockets.Add(candidate);
                }
            }
        }

        return pockets;
    }

    private List<Vector2> ToCenteredPlanePositions(List<Vector2> positions, Vector2 center, float radius)
    {
        var centeredPositions = new List<Vector2>(positions.Count);
        for (int i = 0; i < positions.Count; i++)
        {
            centeredPositions.Add((positions[i] - center) * radius);
        }

        return centeredPositions;
    }

    private Vector2[] GetVerticalNeighborOffsets(float radius)
    {
        float xStep = GetColumnStep(radius);
        float rowStep = GetRowStep(radius);
        return new[]
        {
            new Vector2(-xStep * 0.5f, rowStep),
            new Vector2(xStep * 0.5f, rowStep),
            new Vector2(-xStep * 0.5f, -rowStep),
            new Vector2(xStep * 0.5f, -rowStep),
        };
    }

    private Vector2[] GetAllNeighborOffsets(float radius)
    {
        float xStep = GetColumnStep(radius);
        float rowStep = GetRowStep(radius);
        return new[]
        {
            new Vector2(-xStep, 0f),
            new Vector2(xStep, 0f),
            new Vector2(-xStep * 0.5f, rowStep),
            new Vector2(xStep * 0.5f, rowStep),
            new Vector2(-xStep * 0.5f, -rowStep),
            new Vector2(xStep * 0.5f, -rowStep),
        };
    }

    private int CountNeighboringHexes(List<Vector2> hexPositions, Vector2 candidate, Vector2[] neighborOffsets, float tolerance)
    {
        int count = 0;
        for (int i = 0; i < neighborOffsets.Length; i++)
        {
            if (HasPosition(hexPositions, candidate + neighborOffsets[i], tolerance))
            {
                count++;
            }
        }

        return count;
    }

    private bool HasPosition(List<Vector2> positions, Vector2 target, float tolerance)
    {
        float sqrTolerance = tolerance * tolerance;
        for (int i = 0; i < positions.Count; i++)
        {
            if ((positions[i] - target).sqrMagnitude <= sqrTolerance)
            {
                return true;
            }
        }

        return false;
    }