public void Run()
        {
            while (Layers.Count > 0)
            {
                RecursiveSubdivisionParameter Par = Layers.Pop();
                if (Par.ColumnDiff < Par.RowDiff)
                {
                    int rowSeparator = (int)(Par.RowStart + Par.RowEnd) / 2;
                    int entrance     = Random.Next(Par.ColumnStart, Par.ColumnEnd - 1);
                    if (entrance == (int)(Par.ColumnStart + Par.ColumnEnd) / 2)
                    {
                        entrance++;
                    }                                                                         //shift entrance so its not in middle

                    for (int col = Par.ColumnStart; col < Par.ColumnEnd; col++)
                    {
                        if (col == entrance)
                        {
                            continue;
                        }
                        NodesToChange.Enqueue(Env.Nodes[Env.CoordsToIndex(col, rowSeparator)]);
                    }
                    var first  = new RecursiveSubdivisionParameter(false, Par.ColumnStart, Par.ColumnEnd, Par.RowStart, rowSeparator);
                    var second = new RecursiveSubdivisionParameter(false, Par.ColumnStart, Par.ColumnEnd, rowSeparator + 1, Par.RowEnd);
                    if (IsEnoughSpace(first))
                    {
                        Layers.Push(first);
                    }
                    if (IsEnoughSpace(second))
                    {
                        Layers.Push(second);
                    }
                }
                else
                {
                    int colSeparator = (int)(Par.ColumnStart + Par.ColumnEnd) / 2;
                    int entrance     = Random.Next(Par.RowStart, Par.RowEnd - 1);
                    if (entrance == (int)(Par.ColumnStart + Par.ColumnEnd) / 2)
                    {
                        entrance++;
                    }                                                                           //shift entrance so its not in middle

                    for (int row = Par.RowStart; row < Par.RowEnd; row++)
                    {
                        if (row == entrance)
                        {
                            continue;
                        }
                        NodesToChange.Enqueue(Env.Nodes[Env.CoordsToIndex(colSeparator, row)]);
                    }
                    var first  = new RecursiveSubdivisionParameter(true, Par.ColumnStart, colSeparator, Par.RowStart, Par.RowEnd);
                    var second = new RecursiveSubdivisionParameter(true, colSeparator + 1, Par.ColumnEnd, Par.RowStart, Par.RowEnd);
                    if (IsEnoughSpace(first))
                    {
                        Layers.Push(first);
                    }
                    if (IsEnoughSpace(second))
                    {
                        Layers.Push(second);
                    }
                }
            }
        }
 private bool IsEnoughSpace(RecursiveSubdivisionParameter Par)
 {
     return(Par.RowDiff > MinGap && Par.ColumnDiff > MinGap);
 }