public static void AssertEquals(this TriStateMatrix expected, TriStateMatrix actual)
        {
            if (expected == null) throw new ArgumentNullException("expected");
            if (actual == null) throw new ArgumentNullException("actual");

            if (expected.Width != actual.Width)
            {
                Assert.Fail("Mtrix must have same size. Expected {0}, Actual {1}", expected.Width, actual.Width);
            }

            
            for (int i = 0; i < expected.Width; i++)
                for (int j = 0; j < expected.Width; j++)
                {
                    if (expected.MStatus(i, j) != MatrixStatus.None && actual.MStatus(i, j) != MatrixStatus.None && expected[i, j] != actual[i, j])
                    {
                        Assert.Fail("Matrces are different.\nExpected:{0}Actual:{1}.", TriStateMatrixToGraphicExtensions.ToGraphicString(expected), TriStateMatrixToGraphicExtensions.ToGraphicString(actual));
                    }

                    if (expected.MStatus(i, j) == MatrixStatus.None && actual.MStatus(i, j) != MatrixStatus.None)
                    {
                        Assert.Fail("Matrces are different.\nExpected:{0}Actual:{1}.", TriStateMatrixToGraphicExtensions.ToGraphicString(expected), TriStateMatrixToGraphicExtensions.ToGraphicString(actual));
                    }
                    if (expected.MStatus(i, j) != MatrixStatus.None && actual.MStatus(i, j) == MatrixStatus.None)
                    {
                        Assert.Fail("Matrces are different.\nExpected:{0}Actual:{1}.", TriStateMatrixToGraphicExtensions.ToGraphicString(expected), TriStateMatrixToGraphicExtensions.ToGraphicString(actual));
                    }
                }
        }
Beispiel #2
0
        private static TriStateMatrix XorMatrix(TriStateMatrix first, BitMatrix second)
        {
            int            width        = first.Width;
            TriStateMatrix maskedMatrix = new TriStateMatrix(width);

            for (int x = 0; x < width; x++)
            {
                for (int y = 0; y < width; y++)
                {
                    MatrixStatus states = first.MStatus(x, y);
                    switch (states)
                    {
                    case MatrixStatus.NoMask:
                        maskedMatrix[x, y, MatrixStatus.NoMask] = first[x, y];
                        break;

                    case MatrixStatus.Data:
                        maskedMatrix[x, y, MatrixStatus.Data] = first[x, y] ^ second[x, y];
                        break;

                    default:
                        throw new ArgumentException($"{nameof(TriStateMatrix)} has None value cell.", nameof(first));
                    }
                }
            }

            return(maskedMatrix);
        }
        /// <summary>
        /// Xors the matrix.
        /// </summary>
        /// <param name="first">The first.</param>
        /// <param name="second">The second.</param>
        /// <returns></returns>
        /// <remarks></remarks>
        private static TriStateMatrix XorMatrix(TriStateMatrix first, BitMatrix second)
        {
            int width = first.Width;
            var maskedMatrix = new TriStateMatrix(width);
            for (int x = 0; x < width; x++)
            {
                for (int y = 0; y < width; y++)
                {
                    MatrixStatus states = first.MStatus(x, y);
                    switch (states)
                    {
                        case MatrixStatus.NoMask:
                            maskedMatrix[x, y, MatrixStatus.NoMask] = first[x, y];
                            break;
                        case MatrixStatus.Data:
                            maskedMatrix[x, y, MatrixStatus.Data] = first[x, y] ^ second[x, y];
                            break;
                        default:
                            throw new ArgumentException("TristateMatrix has None value cell.", "first");
                    }
                }
            }

            return maskedMatrix;
        }
Beispiel #4
0
        internal static void TryEmbedCodewords(this TriStateMatrix tsMatrix, BitList codewords)
        {
            int sWidth        = tsMatrix.Width;
            int codewordsSize = codewords.Count;

            int bitIndex    = 0;
            int directionUp = -1;

            int x = sWidth - 1;
            int y = sWidth - 1;

            while (x > 0)
            {
                //Skip vertical timing pattern
                if (x == 6)
                {
                    x -= 1;
                }

                while (y >= 0 && y < sWidth)
                {
                    for (int xOffset = 0; xOffset < 2; xOffset++)
                    {
                        int xPos = x - xOffset;
                        if (tsMatrix.MStatus(xPos, y) != MatrixStatus.None)
                        {
                            continue;
                        }
                        else
                        {
                            bool bit;
                            if (bitIndex < codewordsSize)
                            {
                                bit = codewords[bitIndex];
                                bitIndex++;
                            }
                            else
                            {
                                bit = false;
                            }

                            tsMatrix[xPos, y, MatrixStatus.Data] = bit;
                        }
                    }
                    y = NextY(y, directionUp);
                }
                directionUp = ChangeDirection(directionUp);
                y           = NextY(y, directionUp);
                x          -= 2;
            }

            if (bitIndex != codewordsSize)
            {
                throw new Exception($"Not all bits from codewords consumed by matrix: {bitIndex} / {codewordsSize}");
            }
        }
Beispiel #5
0
        public override void ApplyTo(TriStateMatrix matrix)
        {
            // -8 is for skipping position detection patterns (size 7), and two horizontal/vertical
            // separation patterns (size 1). Thus, 8 = 7 + 1.
            for (int i = 8; i < matrix.Width - 8; ++i)
            {
                bool value = (sbyte)((i + 1) % 2) == 1;
                // Horizontal line.

                if (matrix.MStatus(6, i) == MatrixStatus.None)
                {
                    matrix[6, i, MatrixStatus.NoMask] = value;
                }

                // Vertical line.
                if (matrix.MStatus(i, 6) == MatrixStatus.None)
                {
                    matrix[i, 6, MatrixStatus.NoMask] = value;
                }
            }
        }
Beispiel #6
0
        public override void ApplyTo(TriStateMatrix matrix)
        {
            // -8 is for skipping position detection patterns (size 7), and two horizontal/vertical
            // separation patterns (size 1). Thus, 8 = 7 + 1.
            for (int i = 8; i < matrix.Width - 8; ++i)
            {
                bool value = (sbyte)((i + 1) % 2) == 1;
                // Horizontal line.

                if (matrix.MStatus(6, i) == MatrixStatus.None)
                {
                    matrix[6, i, MatrixStatus.NoMask] = value;
                }

                // Vertical line.
                if (matrix.MStatus(i, 6) == MatrixStatus.None)
                {
                    matrix[i, 6, MatrixStatus.NoMask] = value;
                }
            }
        }
        public static void AssertEquals(this TriStateMatrix expected, TriStateMatrix actual)
        {
            if (expected == null)
            {
                throw new ArgumentNullException("expected");
            }
            if (actual == null)
            {
                throw new ArgumentNullException("actual");
            }

            if (expected.Width != actual.Width)
            {
                Assert.Fail("Mtrix must have same size. Expected {0}, Actual {1}", expected.Width, actual.Width);
            }


            for (int i = 0; i < expected.Width; i++)
            {
                for (int j = 0; j < expected.Width; j++)
                {
                    if (expected.MStatus(i, j) != MatrixStatus.None && actual.MStatus(i, j) != MatrixStatus.None && expected[i, j] != actual[i, j])
                    {
                        Assert.Fail("Matrces are different.\nExpected:{0}Actual:{1}.", TriStateMatrixToGraphicExtensions.ToGraphicString(expected), TriStateMatrixToGraphicExtensions.ToGraphicString(actual));
                    }

                    if (expected.MStatus(i, j) == MatrixStatus.None && actual.MStatus(i, j) != MatrixStatus.None)
                    {
                        Assert.Fail("Matrces are different.\nExpected:{0}Actual:{1}.", TriStateMatrixToGraphicExtensions.ToGraphicString(expected), TriStateMatrixToGraphicExtensions.ToGraphicString(actual));
                    }
                    if (expected.MStatus(i, j) != MatrixStatus.None && actual.MStatus(i, j) == MatrixStatus.None)
                    {
                        Assert.Fail("Matrces are different.\nExpected:{0}Actual:{1}.", TriStateMatrixToGraphicExtensions.ToGraphicString(expected), TriStateMatrixToGraphicExtensions.ToGraphicString(actual));
                    }
                }
            }
        }
Beispiel #8
0
 public static void ToGraphic(this TriStateMatrix matrix, TextWriter output)
 {
     output.WriteLine(matrix.Width.ToString());
     for (int j = 0; j < matrix.Width; j++)
     {
         for (int i = 0; i < matrix.Width; i++)
         {
             char charToPrint;
             if (matrix.MStatus(i, j) == MatrixStatus.None)
             {
                 charToPrint = s_EmptyChar;
             }
             else
             {
                 charToPrint = matrix[i, j] ? s_1Char : s_0Char;
             }
             output.Write(charToPrint);
         }
         output.WriteLine();
     }
 }
 public IEnumerable <MatrixPoint> GetNonColidingCoordinatePairs(TriStateMatrix matrix)
 {
     return
         (GetAllCoordinatePairs()
          .Where(point => matrix.MStatus(point.Offset(2, 2)) == MatrixStatus.None));
 }
Beispiel #10
0
 public IEnumerable<MatrixPoint> GetNonColidingCoordinatePairs(TriStateMatrix matrix)
 {
     return
         GetAllCoordinatePairs()
             .Where(point => matrix.MStatus(point.Offset(2, 2)) == MatrixStatus.None);
 }