private void AddModelGroupForInternalRow(InternalRow internalRow) { var modelGroup = CreateModelGroupForInternalRow(internalRow); CubeGroup.Children.Add(modelGroup); _dictionary[internalRow.Name] = Tuple.Create(internalRow, modelGroup); }
private GeometryModel3D CreateUnitCubeGeometryModel(InternalRow internalRow, Coords coords) { var positions = new Point3DCollection(); var triangleIndices = new Int32Collection(); AddFace(positions, triangleIndices, Face.Front, coords); AddFace(positions, triangleIndices, Face.Back, coords); AddFace(positions, triangleIndices, Face.Left, coords); AddFace(positions, triangleIndices, Face.Right, coords); AddFace(positions, triangleIndices, Face.Top, coords); AddFace(positions, triangleIndices, Face.Bottom, coords); return(new GeometryModel3D { Geometry = new MeshGeometry3D { Positions = positions, TriangleIndices = triangleIndices }, Material = new MaterialGroup { Children = new MaterialCollection { new DiffuseMaterial(new SolidColorBrush(_colourLookup[internalRow.Colour])) } } }); }
private Model3DGroup CreateModelGroupForInternalRow(InternalRow internalRow) { var modelGroup = new Model3DGroup(); foreach (var coords in internalRow.OccupiedSquares) { var geometryModel = CreateUnitCubeGeometryModel(internalRow, coords); modelGroup.Children.Add(geometryModel); } return(modelGroup); }
public override long GetBytes(int index, long sourceOffset, byte[] target, int targetOffset, int count) { Stream stream = InternalRow.GetValue(index).OpenStream(); try { stream.Position = sourceOffset; return(stream.Read(target, targetOffset, count)); } finally { stream.Close(); } }
private static IImmutableList<int> BuildDlxRow( IReadOnlyCollection<Room> rooms, int numRows, int numCols, int maxValue, InternalRow internalRow) { Func<Coords, bool> isValidRowCol = coords => coords.Col >= 0 && coords.Col < numCols && coords.Row >= 0 && coords.Row < numRows; var localIsValidRowCol = isValidRowCol; var row = internalRow.Item1.Row; var col = internalRow.Item1.Col; var value = internalRow.Item2; var roomIndex = internalRow.Item3; Func<IEnumerable<int[]>> buildSecondaryColumns = () => { var allRippleSecondaryColumns = Enumerable.Range(0, maxValue * 4).Select(_ => new int[numRows * numCols]).ToList(); var rippleUpCoords = Enumerable.Range(row, value + 1) .Select(r => new Coords(r, col)) .Where(localIsValidRowCol) .ToList(); var rippleDownCoords = Enumerable.Range(row - value, value + 1) .Select(r => new Coords(r, col)) .Where(localIsValidRowCol) .ToList(); var rippleLeftCoords = Enumerable.Range(col - value, value + 1) .Select(c => new Coords(row, c)) .Where(localIsValidRowCol) .ToList(); var rippleRightCoords = Enumerable.Range(col, value + 1) .Select(c => new Coords(row, c)) .Where(localIsValidRowCol) .ToList(); var baseIndex = (value - 1) * 4; var rippleUpSecondaryColumns = allRippleSecondaryColumns[baseIndex]; rippleUpCoords.ForEach(coords => rippleUpSecondaryColumns[coords.Row * numCols + coords.Col] = 1); var rippleDownSecondaryColumns = allRippleSecondaryColumns[baseIndex + 1]; rippleDownCoords.ForEach(coords => rippleDownSecondaryColumns[coords.Row * numCols + coords.Col] = 1); var rippleLeftSecondaryColumns = allRippleSecondaryColumns[baseIndex + 2]; rippleLeftCoords.ForEach(coords => rippleLeftSecondaryColumns[coords.Row * numCols + coords.Col] = 1); var rippleRightSecondaryColumns = allRippleSecondaryColumns[baseIndex + 3]; rippleRightCoords.ForEach(coords => rippleRightSecondaryColumns[coords.Row * numCols + coords.Col] = 1); return allRippleSecondaryColumns; }; var numRowColPrimaryColumns = numRows * numCols; var rowColPrimaryColumns = new int[numRowColPrimaryColumns]; var rowColPrimaryColumnsIndex = row * numCols + col; rowColPrimaryColumns[rowColPrimaryColumnsIndex] = 1; var numCellWithinRoomPrimaryColumns = rooms.Sum(r => r.Cells.Count); var cellWithinRoomPrimaryColumns = new int[numCellWithinRoomPrimaryColumns]; var cellWithinRoomPrimaryColumnsIndex = rooms.Take(roomIndex).Sum(r => r.Cells.Count) + value - 1; cellWithinRoomPrimaryColumns[cellWithinRoomPrimaryColumnsIndex] = 1; var secondaryColumns = buildSecondaryColumns(); var allColumns = new[] { rowColPrimaryColumns, cellWithinRoomPrimaryColumns }.Concat(secondaryColumns); return allColumns .SelectMany(columns => columns) .ToImmutableList(); }
public override bool IsDBNull(int index) { return(!InternalRow.HasValue(index)); }
public DlxMatrixRow(int[] bits, InternalRow internalRow) { Bits = bits; InternalRow = internalRow; }