public void UpdateHexDirection(int r, double lambda, ushort direction, ushort[] coordinates, float[] instance)
        {
            if (
                coordinates[0] >= 0 && coordinates[1] >= 0 &&
                coordinates[0] < _gridDimensions[0] && coordinates[1] < _gridDimensions[1]
                )
            {
                var bmuIndex = coordinates[0] * (_gridDimensions[1] - 1) + coordinates[1];
                var h        = NeighbourhoodFunction(r, lambda, coordinates);

                for (var i = 0; i < FeaturesCount; i++)
                {
                    _weights[bmuIndex, i] += (float)(lambda * h * (instance[i] - _weights[bmuIndex, i]));
                }
            }

            r--;

            if (r >= 0)
            {
                var nextCoordinates = HexagonalNeighbourhood.GetNeighbour(direction, coordinates);
                UpdateHexDirection(r, lambda, direction, nextCoordinates, instance);
            }
        }
Exemple #2
0
    public static List <Grain> HexagonalGrains(Grain[,] grains, int x, int y)
    {
        List <Grain> _Neighbours = new List <Grain>();

        HexagonalNeighbourhood hexagonalNeighbourhood = HEXAGONAL_NEIGHBOURHOOD;

        if (hexagonalNeighbourhood == HexagonalNeighbourhood.Random)
        {
            hexagonalNeighbourhood = (HexagonalNeighbourhood)hexagonalNeighbourhoods.GetValue(SIMULATION_RANDOM.Next(hexagonalNeighbourhoods.Length));
        }

        if (BOUNDARY_CONDITION == BoundaryCondition.Periodic)
        {
            int x_l = x - 1 < 0 ? SIZE_X - 1 : x - 1;
            int x_p = x + 1 >= SIZE_X ? 0 : x + 1;
            int y_d = y + 1 >= SIZE_Y ? 0 : y + 1;
            int y_g = y - 1 < 0 ? SIZE_Y - 1 : y - 1;

            switch (hexagonalNeighbourhood)
            {
            case HexagonalNeighbourhood.Left:
                _Neighbours.Add(grains[y, x_l]);     // s_l
                _Neighbours.Add(grains[y, x_p]);     // s_p
                _Neighbours.Add(grains[y_d, x]);     // s_d
                _Neighbours.Add(grains[y_g, x]);     // s_g

                _Neighbours.Add(grains[y_d, x_p]);   // s_d_p

                _Neighbours.Add(grains[y_g, x_l]);   // s_g_l
                break;

            case HexagonalNeighbourhood.Right:
                _Neighbours.Add(grains[y, x_l]);     // s_l
                _Neighbours.Add(grains[y, x_p]);     // s_p
                _Neighbours.Add(grains[y_d, x]);     // s_d
                _Neighbours.Add(grains[y_g, x]);     // s_g

                _Neighbours.Add(grains[y_d, x_l]);   // s_d_l

                _Neighbours.Add(grains[y_g, x_p]);   // s_g_p
                break;
            }
        }
        else
        {
            int x_l = x - 1 < 0 ? x : x - 1;
            int x_p = x + 1 >= SIZE_X ? x : x + 1;
            int y_d = y + 1 >= SIZE_Y ? y : y + 1;
            int y_g = y - 1 < 0 ? y : y - 1;

            switch (hexagonalNeighbourhood)
            {
            case HexagonalNeighbourhood.Left:
                _Neighbours.Add(grains[y, x_l]);     // s_l
                _Neighbours.Add(grains[y, x_p]);     // s_p
                _Neighbours.Add(grains[y_d, x]);     // s_d
                _Neighbours.Add(grains[y_g, x]);     // s_g

                _Neighbours.Add(grains[y_d, x_p]);   // s_d_p

                _Neighbours.Add(grains[y_g, x_l]);   // s_g_l
                break;

            case HexagonalNeighbourhood.Right:
                _Neighbours.Add(grains[y, x_l]);     // s_l
                _Neighbours.Add(grains[y, x_p]);     // s_p
                _Neighbours.Add(grains[y_d, x]);     // s_d
                _Neighbours.Add(grains[y_g, x]);     // s_g

                _Neighbours.Add(grains[y_d, x_l]);   // s_d_l

                _Neighbours.Add(grains[y_g, x_p]);   // s_g_p
                break;
            }
        }

        return(_Neighbours);
    }