private bool UpdateTriangles(Triangle tRight, Triangle tLeft, Section commonSection, List <Triangle> tmpResult, Graphics g = null, Pen linePen = null, Pen pointPen = null, Pen newLinePen = null, int formHeight = 0, int delay = 0)
        {
            //меняем общее ребро у двух треугольников
            Point leftExcessPoint  = TriangulationBuilder.GetExcessPoint(tLeft, commonSection);
            Point rightExcessPoint = TriangulationBuilder.GetExcessPoint(tRight, commonSection);

            if (commonSection.CountAnglesSum(leftExcessPoint) + commonSection.CountAnglesSum(rightExcessPoint) < 180)
            {
                Point up   = commonSection.A;
                Point down = commonSection.B;
                if (new Vector(down, rightExcessPoint).GetVectorMultiplication(new Vector(down, leftExcessPoint)) < 0)
                {
                    up   = commonSection.B;
                    down = commonSection.A;
                }

                tmpResult.Remove(tLeft);
                tmpResult.Remove(tRight);
                Triangle toAddFirst  = new Triangle(leftExcessPoint, down, rightExcessPoint);
                Triangle toAddSecond = new Triangle(rightExcessPoint, up, leftExcessPoint);
                tmpResult.Add(toAddFirst);
                tmpResult.Add(toAddSecond);

                if (g != null && linePen != null && newLinePen != null && formHeight != -1 && delay != -1)
                {
                    g.DrawLine(new Pen(Color.White, 2), (int)commonSection.A.X, formHeight - (int)commonSection.A.Y,
                               (int)commonSection.B.X, formHeight - (int)commonSection.B.Y);
                    g.DrawLine(newLinePen, (int)leftExcessPoint.X, formHeight - (int)leftExcessPoint.Y, (int)rightExcessPoint.X, formHeight - (int)rightExcessPoint.Y);

                    Thread.Sleep(delay);

                    g.DrawLine(new Pen(Color.White, 2), (int)leftExcessPoint.X, formHeight - (int)leftExcessPoint.Y, (int)rightExcessPoint.X, formHeight - (int)rightExcessPoint.Y);
                    g.DrawLine(linePen, (int)leftExcessPoint.X, formHeight - (int)leftExcessPoint.Y, (int)rightExcessPoint.X, formHeight - (int)rightExcessPoint.Y);

                    toAddFirst.Paint(g, linePen, pointPen, formHeight);
                    toAddSecond.Paint(g, linePen, pointPen, formHeight);
                }
                return(true);
            }
            return(false);
        }
        private void MatchButtonClick(object sender, EventArgs e)
        {
            List <Minutia> minutiasFrom = GetMinutiasFrom(ImageFrom);

            MessageBox.Show("Found " + minutiasFrom.Count + " minutias in left picture.");

            List <Classes.Point> pointsFrom        = new List <Classes.Point>();
            Graphics             ImageFromGraphics = ImageFrom.CreateGraphics();

            foreach (Minutia m in minutiasFrom)
            {
                Classes.Point p = new Classes.Point(m.X, ImageFrom.Height - m.Y + 1);
                p.Paint(ImageFromGraphics, defPointPen, ImageFrom.Height);
                pointsFrom.Add(p);
            }

            if (minutiasFrom.Count > 500)
            {
                string            messageBoxText = "Do you really want to continue?\n You'll just waste your time...";
                string            caption        = "Too many minutuias";
                MessageBoxButtons mb             = MessageBoxButtons.OKCancel;
                if (MessageBox.Show(messageBoxText, caption, mb) == System.Windows.Forms.DialogResult.Cancel)
                {
                    return;
                }
            }

            Classes.TriangulationBuilder tb = new Classes.TriangulationBuilder(pointsFrom);
            MessageBox.Show("Triangulation built! It has: " + tb.triangles.Count + " triangles.");

            List <Classes.Triangle> triangulationFrom = tb.triangles;

            foreach (Classes.Triangle t in tb.triangles)
            {
                t.Paint(ImageFromGraphics, defLinePen, defPointPen, ImageFrom.Height);
            }

            List <Minutia> minutiasTo = GetMinutiasFrom(ImageTo);

            MessageBox.Show("Found " + minutiasTo.Count + " minutias in right picture");

            List <Classes.Point> pointsTo = new List <Classes.Point>();


            Graphics ImageToGraphics = ImageTo.CreateGraphics();

            foreach (Minutia m in minutiasTo)
            {
                Classes.Point p = new Classes.Point(m.X, ImageTo.Height - m.Y + 1);
                p.Paint(ImageToGraphics, defPointPen, ImageTo.Height);
                pointsTo.Add(p);
            }

            if (minutiasTo.Count > 500)
            {
                string            messageBoxText = "Do you really want to continue?\n You'll just waste your time...";
                string            caption        = "Too many minutuias";
                MessageBoxButtons mb             = MessageBoxButtons.OKCancel;
                if (MessageBox.Show(messageBoxText, caption, mb) == System.Windows.Forms.DialogResult.Cancel)
                {
                    return;
                }
            }

            Classes.TriangulationBuilder tbTo;
            if (minutiasTo.Count < 500)
            {
                tbTo = new Classes.TriangulationBuilder(pointsTo);
            }
            else
            {
                tbTo = new Classes.TriangulationBuilder(pointsTo, ImageToGraphics, defLinePen, defPointPen, new Pen(Color.Gold, 1), ImageTo.Height, 0);
            }

            MessageBox.Show("Triangulation built! It has: " + tbTo.triangles.Count + " triangles.");

            List <Classes.Triangle> triangulationTo = tbTo.triangles;

            foreach (Classes.Triangle t in tbTo.triangles)
            {
                t.Paint(ImageToGraphics, defLinePen, defPointPen, ImageFrom.Height);
            }

            Classes.TriangulationsMatcher tm = new Classes.TriangulationsMatcher(triangulationFrom, triangulationTo);
            double[] result = tm.Match(0.001, 90);
            MessageBox.Show("Equals: " + result[0] + ", very close:" + result[1]);
        }
        private void MatchButtonClick(object sender, EventArgs e)
        {
            List<Minutia> minutiasFrom = GetMinutiasFrom(ImageFrom);

            MessageBox.Show("Found " + minutiasFrom.Count + " minutias in left picture.");

            List<Classes.Point> pointsFrom = new List<Classes.Point>();
            Graphics ImageFromGraphics = ImageFrom.CreateGraphics();
            foreach (Minutia m in minutiasFrom)
            {
                Classes.Point p = new Classes.Point(m.X, ImageFrom.Height - m.Y+1);
                p.Paint(ImageFromGraphics, defPointPen, ImageFrom.Height);
                pointsFrom.Add(p);
            }

            if (minutiasFrom.Count > 500)
            {
                string messageBoxText = "Do you really want to continue?\n You'll just waste your time...";
                string caption = "Too many minutuias";
                MessageBoxButtons mb = MessageBoxButtons.OKCancel;
                if (MessageBox.Show(messageBoxText, caption, mb) == System.Windows.Forms.DialogResult.Cancel)
                    return;
            }

            Classes.TriangulationBuilder tb = new Classes.TriangulationBuilder(pointsFrom);
            MessageBox.Show("Triangulation built! It has: "+tb.triangles.Count+" triangles.");

            List<Classes.Triangle> triangulationFrom = tb.triangles;
            foreach (Classes.Triangle t in tb.triangles) {
                t.Paint(ImageFromGraphics, defLinePen, defPointPen, ImageFrom.Height);
            }

            List<Minutia> minutiasTo = GetMinutiasFrom(ImageTo);

            MessageBox.Show("Found " + minutiasTo.Count + " minutias in right picture");

            List<Classes.Point> pointsTo = new List<Classes.Point>();

            Graphics ImageToGraphics = ImageTo.CreateGraphics();
            foreach (Minutia m in minutiasTo)
            {
                Classes.Point p = new Classes.Point(m.X, ImageTo.Height - m.Y+1);
                p.Paint(ImageToGraphics, defPointPen, ImageTo.Height);
                pointsTo.Add(p);
            }

            if (minutiasTo.Count > 500)
            {
                string messageBoxText = "Do you really want to continue?\n You'll just waste your time...";
                string caption = "Too many minutuias";
                MessageBoxButtons mb = MessageBoxButtons.OKCancel;
                if (MessageBox.Show(messageBoxText, caption, mb) == System.Windows.Forms.DialogResult.Cancel)
                    return;
            }

            Classes.TriangulationBuilder tbTo;
            if (minutiasTo.Count < 500)
                tbTo = new Classes.TriangulationBuilder(pointsTo);
            else
                tbTo = new Classes.TriangulationBuilder(pointsTo, ImageToGraphics, defLinePen, defPointPen, new Pen(Color.Gold, 1), ImageTo.Height, 0);

            MessageBox.Show("Triangulation built! It has: " + tbTo.triangles.Count + " triangles.");

            List<Classes.Triangle> triangulationTo = tbTo.triangles;
            foreach (Classes.Triangle t in tbTo.triangles)
            {
                t.Paint(ImageToGraphics, defLinePen, defPointPen, ImageFrom.Height);
            }

            Classes.TriangulationsMatcher tm = new Classes.TriangulationsMatcher(triangulationFrom, triangulationTo);
            double[] result = tm.Match(0.001,90);
            MessageBox.Show("Equals: " + result[0] + ", very close:" + result[1]);
        }