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); } }
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); }