public void Perform(FullLine[] data)
        {
            float n = data.Length;
            float Sx = data.Sum(x => x.m);
            float Sy = data.Sum(x => x.c);
            float Sxx = data.Sum(x => x.m * x.m);
            float Syy = data.Sum(x => x.c * x.c);
            float Sxy = data.Sum(x => x.m * x.c);

            B = ((n * Sxy) - (Sx * Sy)) /
                ((n * Sxx) - (Sx * Sx));
            A = (Sy / n) - (B * Sx / n);
        }
        internal OLSRegression GetBoardRegression()
        {
            List<FullLine> fullLines = new List<FullLine>();

            foreach (LineSegment2D lineSegment in VertLines)
            {
                // Set lowest point as p1
                var p1 = lineSegment.P1;
                var p2 = lineSegment.P2;
                if (p1.Y > p2.Y)
                {
                    p2 = lineSegment.P1;
                    p1 = lineSegment.P2;
                }

                // Calculate crossing of x-axis (call it c)
                float m = (float)(p2.X - p1.X) / (float)(p2.Y - p1.Y);
                float c = (float)p1.X - ((float)p1.Y * m);

                FullLine fullLine = new FullLine(m, c);
                fullLines.Add(fullLine);
            }

            OLSRegression olsRegression = new OLSRegression();
            olsRegression.Perform(fullLines.ToArray());

            return olsRegression;
        }