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);
        }
Exemple #4
0
        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();
        }
Exemple #6
0
 public override bool IsDBNull(int index)
 {
     return(!InternalRow.HasValue(index));
 }
Exemple #7
0
 public DlxMatrixRow(int[] bits, InternalRow internalRow)
 {
     Bits        = bits;
     InternalRow = internalRow;
 }