/// <summary>
 /// Creates a new Gray-Scott Diffusion Reaction with the given parameters
 /// </summary>
 public GrayScottDiffusionReaction(Grid grid, double feedA, double killB, LaplacianFunction lap)
 {
     Grid = grid;
     FeedA = feedA;
     KillB = killB;
     Lap = lap;
     iterations = 0;
 }
        public Form1()
        {
            InitializeComponent();

            Cell prefabCell = new Cell
            {
                { GrayScottDiffusionReaction.CHEMICAL_A, 0 },
                { GrayScottDiffusionReaction.CHEMICAL_B, 0 }
            };

            Grid grid = new Grid(GRID_SIZE, prefabCell);
            grid.Seed(grid.Size / 2, grid.Size / 2, 2, 2, GrayScottDiffusionReaction.CHEMICAL_B, 1);    // Seed central area with B = 1

            reaction = new GrayScottDiffusionReaction(grid, FEED_A, KILL_B, new PerpendicularNeighboursLaplacianFunction());

            renderer = new NETGridRenderer(grid, new GreyscaleShader())
            {
                CellWidth = 4,
                CellHeight = 4
            };
        }
 /// <summary>
 /// A grid renderer that draws each cell in the grid with the given dimensions
 /// </summary>
 public GridRenderer(Grid grid, IShader shader)
 {
     Grid = grid;
     Shader = shader;
 }
 /// <summary>
 /// Creates a renderer object that uses the .NET graphics library to renderer the given grid. A graphics object must be passed to 
 /// this renderer prior to any draw calls or a null reference exception will be raised.
 /// </summary>
 public NETGridRenderer(Grid grid, IShader shader)
     : base(grid, shader)
 {
     /* Nothing */
 }
        public void Update()
        {
            // Create new array of cells so as to not overwrite old values while still performing calculations
            Grid grid = new Grid(Grid.Size);

            // Iterate through entire grid of cells
            for (int column = 0; column < Grid.Size; column++)
            {
                for (int row = 0; row < Grid.Size; row++)
                {
                    // Calculate next iteration of A and B
                    double A = NextA(column, row);
                    double B = NextB(column, row);

                    // Create new cell containing new A and B concentrations
                    grid[column, row] = new Cell
                    {
                        { CHEMICAL_A, A },
                        { CHEMICAL_B, B }
                    };
                }
            }

            // Assign new array of cells to grid object, overwritting old array
            Grid.Overwrite(grid);

            // Keep track of the number of iterations this reaction has been running for
            iterations++;
        }
 /// <summary>
 /// Overwrites the concentrations stored in this grid's cells with the concentrations from the cells in the given grid.
 /// </summary>
 public void Overwrite(Grid grid)
 {
     Cells = grid.Cells;
 }
 public void GrayScottDiffusionReactionTest()
 {
     // New grid with concentrations set to 0
     Grid grid = new Grid(3);
 }