void CreateNodes(BSPTree bsp, IntGrid2 grid, int i)
{
int middle;
bool horiz;
if (grid.Columns <= 4 && grid.Rows <= 4)
{
Debugger.Break();
throw new Exception();
}
else if (grid.Columns <= 4)
{
horiz = true;
}
else if (grid.Rows <= 4)
{
horiz = false;
}
else
{
horiz = grid.Columns < grid.Rows;
}
double m = GetRandomDouble(0.4, 0.6);
if (horiz)
middle = (int)(grid.Rows * m);
else
middle = (int)(grid.Columns * m);
bsp[i] = new BSPNode(grid, horiz);
if (bsp.IsLeaf(i))
return;
int left = bsp.GetLeft(i);
int right = bsp.GetRight(i);
if (horiz)
{
// up
var g1 = new IntGrid2(grid.X, grid.Y, grid.Columns, middle);
CreateNodes(bsp, g1, left);
// down
var g2 = new IntGrid2(grid.X, grid.Y + middle + 1, grid.Columns, grid.Rows - middle - 1);
CreateNodes(bsp, g2, right);
}
else
{
// left
var g1 = new IntGrid2(grid.X, grid.Y, middle, grid.Rows);
CreateNodes(bsp, g1, left);
// right
var g2 = new IntGrid2(grid.X + middle + 1, grid.Y, grid.Columns - middle - 1, grid.Rows);
CreateNodes(bsp, g2, right);
}
}