public void Draw(GridWithGeometry <bool> grid, Graphics graphics, Size clientSize) { for (var iy = 0; iy < grid.JCount; ++iy) { var y = iy * grid.JStepSize; graphics.DrawLine(this.Pen, 0f, (float)y, clientSize.Width, (float)y); } for (var ix = 0; ix < grid.ICount; ++ix) { var x = ix * grid.IStepSize; graphics.DrawLine(this.Pen, (float)x, 0, (float)x, clientSize.Height); } for (var ix = 0; ix < grid.ICount; ++ix) { var x = ix * grid.IStepSize; for (var iy = 0; iy < grid.JCount; ++iy) { var y = iy * grid.JStepSize; if (grid[ix, iy]) { graphics.FillRectangle(this.Brush, (float)x, (float)y, (float)(grid.IStepSize), (float)(grid.JStepSize)); } } } }
public static void Border(this GridWithGeometry <bool> grid, List <List <Vector3d> > region) { foreach (var part in region) { for (var i = 0; i < part.Count - 1; ++i) { grid.Border(part[i], part[i + 1]); } grid.Border(part[0], part[part.Count - 1]); } }
private static void Border(this GridWithGeometry <bool> grid, Vector3d point0, Vector3d point1) { if (point0.Y > point1.Y) { Utils.Swap(ref point0, ref point1); } var ix0 = grid.GetCellIndexByX(point0.X); var iy0 = grid.GetCellIndexByY(point0.Y); var ix1 = grid.GetCellIndexByX(point1.X); var iy1 = grid.GetCellIndexByY(point1.Y); if (iy0 == iy1) { grid.SetValue(true, ix0, ix1, iy0, iy1); return; } var k = (point1.X - point0.X) / (point1.Y - point0.Y); // x = f(y) = x0 + k * (y - y0) var ixPrev = ix0; int ixNext; for (var iy = iy0 + 1; iy <= iy1; ++iy) { var y = iy * grid.JStepSize; var x = point0.X + k * (y - point0.Y); ixNext = grid.GetCellIndexByX(x); grid.SetValue(true, ixPrev, ixNext, iy - 1, iy - 1); ixPrev = ixNext; } ixNext = ix1; grid.SetValue(true, ixPrev, ixNext, iy1, iy1); }