private static int FindLargestRadiusIn(ShapeSignature signature)
        {
            int[][] signaturePoints = signature.Get();
            int     largestRadius   = 0;

            for (int i = 0; i < signature.NumberOfSamplingPoints; i++)
            {
                int[] signaturePointsAtPosition = signaturePoints[i];
                int   largestRadiusAtIndex      = signaturePointsAtPosition.Any() ? signaturePointsAtPosition.Max() : 0;
                if (largestRadiusAtIndex > largestRadius)
                {
                    largestRadius = largestRadiusAtIndex;
                }
            }

            return(largestRadius);
        }
        /// <summary>
        /// Gets the signature of an object in <paramref name="image"/> by using a variable number of sampling lines.
        /// </summary>
        /// <returns>
        /// The coordinates of the signature points in an ordered list.
        /// The key of the dictionary represents the index of the sampling point.
        /// The value represents the radius from the center of all pixels found.
        /// </returns>
        internal static ShapeSignature GetSignature(BinaryImage image, int numberOfSamplingLines)
        {
            CheckNumberOfSamplingLinesIsInRange(numberOfSamplingLines);

            var signature     = new ShapeSignature(numberOfSamplingLines);
            int samplingIndex = 0;

            var samplingLines = GetSamplingLines(image, numberOfSamplingLines);

            foreach (var samplingLine in samplingLines)
            {
                int[] pointsInAngle = FindAllBlackPixelsOnSamplingLine(image, samplingLine).ToArray();
                signature.Add(samplingIndex, pointsInAngle);
                samplingIndex++;
            }

            return(signature);
        }
        internal static BinaryImage Plot(ShapeSignature signature)
        {
            int[][] signaturePoints = signature.Get();
            int     largestRadius   = FindLargestRadiusIn(signature);

            var image = new BinaryImage(signature.NumberOfSamplingPoints, largestRadius + 3);

            for (int i = 0; i < signature.NumberOfSamplingPoints; i++)
            {
                int[] pointInAngle = signaturePoints[i];
                for (int j = 0; j < pointInAngle.Length; j++)
                {
                    int radius = pointInAngle[j];
                    image[radius, i] = BinaryImage.Black;
                }
            }

            return(image);
        }