Пример #1
0
        private void btOptimize2_Click(object sender, EventArgs e)
        {
            if (pageVectorNOW.Count < 2)
            {
                return;                          //нет смысла сортировать
            }
            // создаем временный список отрезков
            List <GroupPoint> destCVectors = new List <GroupPoint>();

            bool firstLoop = true;

            //теперь зациклимся пока не проанализируем все доступные отрезки
            while (pageVectorNOW.Count > 0)
            {
                if (firstLoop)
                {
                    destCVectors.Add(pageVectorNOW[0]);
                    pageVectorNOW.RemoveAt(0);
                    firstLoop = false;
                    continue;
                }


                //со втого круга проверяем отрезки

                GroupPoint lastGroupPoint = destCVectors[destCVectors.Count - 1];

                cncPoint lastCncPoint = lastGroupPoint.Points[lastGroupPoint.Points.Count - 1];

                cncPoint currPoint = pageVectorNOW[0].Points[0];

                if (currPoint.X == lastCncPoint.X && currPoint.Y == lastCncPoint.Y)
                {
                    //скопируем точки, и удалим отрезок
                    foreach (cncPoint point in pageVectorNOW[0].Points)
                    {
                        lastGroupPoint.Points.Add(point);
                        //destCVectors[destCVectors.Count - 1].Points[
                        //    destCVectors[destCVectors.Count - 1].Points.Add(new cPoint(point.X,point.Y,point.Selected));
                    }
                    pageVectorNOW.RemoveAt(0);
                }
                else
                {
                    //создадим новый отрезок
                    destCVectors.Add(pageVectorNOW[0]);
                    pageVectorNOW.RemoveAt(0);
                }
            }

            pageVectorNOW = new List <GroupPoint>(destCVectors);
            destCVectors.Clear();

            UserActions();
        }
Пример #2
0
 /// <summary>
 /// Конструктор на основании себя
 /// </summary>
 /// <param name="_source"></param>
 public cncPoint(cncPoint _source)
 {
     X        = _source.X;
     Y        = _source.Y;
     Gvalue   = _source.Gvalue;
     Svalue   = _source.Svalue;
     Fvalue   = _source.Fvalue;
     Pvalue   = _source.Pvalue;
     Selected = _source.Selected;
     Bright   = _source.Bright;
 }
Пример #3
0
        }                                  // для визуального отображения

        public cncPoint Clone()
        {
            cncPoint locReturn = new cncPoint();

            locReturn.X        = X;
            locReturn.Y        = Y;
            locReturn.Gvalue   = Gvalue;
            locReturn.Svalue   = Svalue;
            locReturn.Fvalue   = Fvalue;
            locReturn.Pvalue   = Pvalue;
            locReturn.Selected = Selected;
            locReturn.Bright   = Bright;

            return(locReturn);
        }
Пример #4
0
        public void GetPoint(ref StringBuilder _sb, cncPoint _point, bool _firstPoint, ref List <VariableValue> _variableDataValues)
        {
            foreach (string str in _spoint)
            {
                string ss = str.Replace('\t', ' ').Trim();

                if (ss == "")
                {
                    continue;
                }

                //TODO: тут следим за [SKIP_FIRST_POINT]
                if (ss.IndexOf("[SKIP_FIRST_POINT]") != -1)
                {
                    if (_firstPoint)
                    {
                        return;
                    }
                    continue;
                }

                FillStringLine(ss, ref _sb, ref _variableDataValues, null, _point);
            }
        }
Пример #5
0
        private void btCloseTraectory_Click(object sender, EventArgs e)
        {
            List <GroupPoint> destCVectors = new List <GroupPoint>();

            foreach (GroupPoint vector in pageVectorNOW)
            {
                GroupPoint newGroupPoint = new GroupPoint();

                foreach (cncPoint pp in vector.Points)
                {
                    newGroupPoint.Points.Add(new cncPoint(pp.X, pp.Y));
                }

                if (newGroupPoint.Points.Count > 2)
                {
                    cncPoint p1 = newGroupPoint.Points[0];
                    cncPoint p2 = newGroupPoint.Points[newGroupPoint.Points.Count - 1];

                    if (p1.X == p2.X && p1.Y == p2.Y)
                    {
                        //not need
                    }
                    else
                    {
                        newGroupPoint.Points.Add(new cncPoint(p1.X, p1.Y));
                    }
                }

                destCVectors.Add(newGroupPoint);
                newGroupPoint = new GroupPoint();
            }

            pageVectorNOW = destCVectors;

            RefreshTree();
        }
Пример #6
0
        private void TestNewAlgoritm()
        {
            //все траектории у которых начальная и конечная точка совпадают, должны быть разъеденены
            foreach (GroupPoint vector in pageVectorNOW)
            {
                if (vector.Points.Count < 3)
                {
                    continue;
                }

                cncPoint startPoint = vector.Points[0];
                cncPoint endPoint   = vector.Points[vector.Points.Count - 1];

                if (startPoint.X == endPoint.X && startPoint.Y == endPoint.Y)
                {
                    endPoint.X += 0.01;
                }
            }



            List <GroupPoint> tmp = new List <GroupPoint>();

            foreach (GroupPoint vector in pageVectorNOW)
            {
                List <cncPoint> result = VectorProcessing.DouglasPeuckerReduction(vector.Points, (double)numericUpDown1.Value);

                if (result.Count > 2)
                {
                    tmp.Add(new GroupPoint(result));
                }
            }
            pageVectorNOW = tmp;

            UserActions();
        }
Пример #7
0
        // сюда передается с трока с тектом и параметрами
        private void FillStringLine(string INString, ref StringBuilder _sb, ref List <VariableValue> _variableDataValues, GroupPoint groupPoint = null, cncPoint _point = null)
        {
            //распарсим строку на части
            List <string> tst = ParseStringToSybString(INString);

            string buffStr = "";

            foreach (string ss in tst)
            {
                if (ss.Trim().IndexOf("\"") != -1)
                {
                    //string data
                    buffStr += " " + ss;

                    //парсим строку
                    FindAndFillData(ss, ref _variableDataValues);
                }


                if (ss.Trim().IndexOf("[") != -1)
                {
                    string newString = "";

                    //избавимся от скобок
                    string ttmString = ss.Trim().Replace("[", "").Replace("]", "");

                    //узнаем есть ли параметр означающий не выводить данные
                    //тоторые не изменились с помледнего раза
                    //bool NotChanged = false;
                    if (ttmString.IndexOf("!") != -1)
                    {
                        // NotChanged = true;
                        //удалим лишний символ
                        ttmString = ttmString.Replace("!", "");
                    }

                    //получим строку форматирования значения типа такой: (#0.###)

                    string strFormatValue = "";

                    if (ttmString.IndexOf("'") != -1)
                    {
                        int firstSymb  = ttmString.IndexOf("'");
                        int secondSymb = ttmString.IndexOf("'", firstSymb + 1);

                        strFormatValue = ttmString.Substring(firstSymb + 1, secondSymb - firstSymb - 1);
                        ttmString      = ttmString.Substring(0, firstSymb);
                    }


                    //обновим данные в переменных


                    if (groupPoint != null) //Если это сегмент из точек
                    {
                        if (groupPoint.Points.Count > 0)
                        {
                            foreach (VariableValue VARIABLE in _variableDataValues)
                            {
                                if (VARIABLE.VariableName == "X")
                                {
                                    _variableDataValues.Remove(VARIABLE);
                                    break;
                                }
                            }

                            _variableDataValues.Add(new VariableValue((double)groupPoint.Points[0].X, "X"));


                            foreach (VariableValue VARIABLE in _variableDataValues)
                            {
                                if (VARIABLE.VariableName == "Y")
                                {
                                    _variableDataValues.Remove(VARIABLE);
                                    break;
                                }
                            }

                            _variableDataValues.Add(new VariableValue((double)groupPoint.Points[0].Y, "Y"));
                        }
                    }

                    if (_point != null) // если это конкретная точка
                    {
                        foreach (VariableValue VARIABLE in _variableDataValues)
                        {
                            if (VARIABLE.VariableName == "X")
                            {
                                _variableDataValues.Remove(VARIABLE);
                                break;
                            }
                        }

                        _variableDataValues.Add(new VariableValue((double)_point.X, "X"));


                        foreach (VariableValue VARIABLE in _variableDataValues)
                        {
                            if (VARIABLE.VariableName == "Y")
                            {
                                _variableDataValues.Remove(VARIABLE);
                                break;
                            }
                        }

                        _variableDataValues.Add(new VariableValue((double)_point.Y, "Y"));
                    }



                    double resultic = MathEx.Calc(_variableDataValues, ttmString);

                    newString = resultic.ToString(strFormatValue);


                    //узнаем есть ли символ разделения дробной части

                    //string symbDiv = null;
                    //if (ttmString.IndexOf(".") != -1)
                    //{
                    //    symbDiv = ".";
                    //    //удалим лишний символ
                    //    ttmString = ttmString.Replace(".", "");
                    //}

                    //if (ttmString.IndexOf(",") != -1)
                    //{
                    //    symbDiv = ",";
                    //    //удалим лишний символ
                    //    ttmString = ttmString.Replace(",", "");
                    //}



                    //а вот уже имеем букву X Y Z S F P



                    //

                    //// скопируем переменные что сверху прилетели
                    //if (variables != null)
                    //{
                    //    foreach (VariableValue VARIABLE in variables)
                    //    {
                    //        tmpvar.Add(VARIABLE);
                    //    }
                    //}

                    ////добавим переменную свою
                    //



                    //if (ttmString == "X" || ttmString == "Y")
                    //{



                    //    if (symbDiv != null)
                    //    {
                    //        //установим нужный нам символ разделителя дробной, и целой части

                    //        //получим символ разделения дробной и целой части.
                    //        string symbSeparatorDec = CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator;

                    //        newString = newString.Replace(symbSeparatorDec, symbDiv);
                    //    }
                    //}

                    //if (ttmString == "Z")
                    //{
                    //    if (_segment != null)
                    //    {
                    //        if (_segment.Points.Count > 0)
                    //        {
                    //            newString = "Z" + _LVC.Zpos.ToString("#0.###");
                    //        }
                    //    }

                    //    if (_point != null)
                    //    {
                    //        newString = "Z" + _LVC.Ypos.ToString("#0.###");
                    //    }
                    //}



                    buffStr += newString;
                }
            }

            _sb.AppendLine(buffStr);



            //    forReturn += sHead.Replace('"', ' ').Trim() + Environment.NewLine;


            //decimal x = (vector.Points[0].X);
            //decimal y = (vector.Points[0].Y);

            //// подход к началу вектора, на безопастной высоте
            //sb.AppendLine("g0 x" + x.ToString("#0.###") + " y" + y.ToString("#0.###"));

            //if (TextVectorStart.Trim() != "") sb.AppendLine(TextVectorStart);

            //if (TextVectorEnds.Trim() != "") sb.AppendLine(TextVectorEnds);

            //x = (vector.Points[vector.Points.Count - 1].X);
            //y = (vector.Points[vector.Points.Count - 1].Y);


            //x = (point.X);
            //y = (point.Y);

            //sb.AppendLine("g1 x" + x.ToString("#0.###") + " y" + y.ToString("#0.###"));
        }
Пример #8
0
        //
        private void GenNewVar3()
        {
            // работа заточена только под 24-х битный пиксель
            if (pageImageNOW.PixelFormat != PixelFormat.Format24bppRgb)
            {
                //throw new UnsupportedImageFormatException("Оппа! Не поддерживаемый формат изображения!!!");
                MessageBox.Show(@"Для генерации данных, требуется изображение имеющее 24 бита на пиксель, а получилось иначе, очень подозрительно....!!");
                return;
            }

            #region Переменные для алгоритма

            BitmapData bitmapData1 = pageImageNOW.LockBits(new Rectangle(0, 0, pageImageNOW.Width, pageImageNOW.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);

            // для понимания того в какой точке изображения находимся
            int posX     = 0;
            int posY     = bitmapData1.Height - 1;
            int posYreal = 0;

            //узнаем объем анализируемого изображения
            int CountPoint = bitmapData1.Height * bitmapData1.Width;

            double sizeOnePoint = (double)numSizePoint.Value;

            #endregion

            // для хранения цвета текущей полученной точки
            int currColor = -1; // текущий цвет
            int lastColor = -1; // предыдущий цвет отрезка

            //bool StartCaptureLine = false;
            bool isFirstPoint = true;

            // очистим текущий набор
            pageVectorNOW = new List <GroupPoint>();
            unsafe
            {
                #region Начальное позиционирование в изображении
                // позиционируемся в начальной точке
                byte *imagePointer1 = (byte *)bitmapData1.Scan0;
                // и перемещаемся в левый нижний угол изображения
                imagePointer1 += bitmapData1.Stride * posY;
                //задаем направление сканирования изображения
                int dirrection = 1; //1 - to right, 2 - to left

                int deltaX = 0;

                #endregion

                //запуск цикла по изображению
                while (CountPoint > 0)
                {
                    if (dirrection == 1)
                    {
                        deltaX = 0;
                    }
                    else
                    {
                        deltaX = 1;
                    }

                    // получим текущий цвет
                    currColor = 255 - ((imagePointer1[0] + imagePointer1[1] + imagePointer1[2]) / 3);

                    if (isFirstPoint)
                    {
                        GroupPoint tmp = new GroupPoint();
                        tmp.Points.Add(new cncPoint((posX) * sizeOnePoint, posY * sizeOnePoint, 0, 0, 0, false, currColor));
                        pageVectorNOW.Add(tmp.Clone());
                        isFirstPoint = false;
                        lastColor    = currColor;
                    }

                    //тут алгорим работы с данными
                    if (currColor != lastColor)
                    {
                        if (!isFirstPoint)
                        {
                            // в существующий отрезок добавим точку
                            pageVectorNOW[pageVectorNOW.Count - 1].Points.Add(new cncPoint((posX + deltaX) * sizeOnePoint, posY * sizeOnePoint, 0, 0, 0, false, lastColor));

                            // и добавим новый отрезок
                            GroupPoint tmp = new GroupPoint();
                            tmp.Points.Add(new cncPoint((posX + deltaX) * sizeOnePoint, posY * sizeOnePoint, 0, 0, 0, false, currColor));
                            pageVectorNOW.Add(tmp.Clone());
                            lastColor = currColor;
                        }
                    }


                    #region Алгорим вычисления следующей точки в наборе байт изображения
                    //вычисление перехода на следующий блок данных
                    if (dirrection == 1 && posX == bitmapData1.Width - 1)
                    {
                        // в существующий отрезок добавим завершающую точку
                        pageVectorNOW[pageVectorNOW.Count - 1].Points.Add(new cncPoint((posX + 1) * sizeOnePoint, posY * sizeOnePoint, 0, 0, 0, false, lastColor));
                        if (posY != 0)
                        {
                            //TODO: придумать алгоритм
                            //pageVectorNOW[pageVectorNOW.Count - 1].Points.Add(new cncPoint((posX+1) * sizeOnePoint, (posY) * sizeOnePoint, 0, 0, 0, false, 0, 0));
                            //pageVectorNOW[pageVectorNOW.Count - 1].Points.Add(new cncPoint((posX + 1) * sizeOnePoint, (posY - 1) * sizeOnePoint, 0, 0, 0, false, 0, 0));
                            pageVectorNOW[pageVectorNOW.Count - 1].Points.Add(new cncPoint((posX + 1) * sizeOnePoint, (posY - 1) * sizeOnePoint, 0, 0, 0, false, 0, 0));
                        }

                        isFirstPoint = true;

                        dirrection = 2;
                        posY--;

                        posYreal++;



                        imagePointer1 -= bitmapData1.Stride;

                        //imagePointer1 -= (bitmapData1.Stride * posY) + (posX * 3);
                    }
                    else if (dirrection == 2 && posX == 0)
                    {
                        // в существующий отрезок добавим точку
                        pageVectorNOW[pageVectorNOW.Count - 1].Points.Add(new cncPoint(posX * sizeOnePoint, posY * sizeOnePoint, 0, 0, 0, false, lastColor));
                        if (posY != 0)
                        {
                            pageVectorNOW[pageVectorNOW.Count - 1].Points.Add(new cncPoint(posX * sizeOnePoint, (posY - 1) * sizeOnePoint, 0, 0, 0, false, 0, 0));                                  //
                        }
                        isFirstPoint = true;


                        dirrection = 1;
                        posY--;

                        posYreal++;

                        //pageVectorNOW[pageVectorNOW.Count - 1].Points.Add(new cncPoint(posX , posY, 0, 0, 0, false, lastColor));


                        imagePointer1 -= bitmapData1.Stride;

                        //imagePointer1 -= (bitmapData1.Stride * posY);
                    }
                    else if (dirrection == 1)
                    {
                        imagePointer1 += 3;
                        posX++;
                    }
                    else if (dirrection == 2)
                    {
                        imagePointer1 -= 3;
                        posX--;
                    }

                    CountPoint--;
                    #endregion

                    //если это последняя точка то завершим и отрезок
                    if (CountPoint == 0)
                    {
                        if (posY < 0)
                        {
                            posY = 0;
                        }


                        // в существующий отрезок добавим точку
                        //pageVectorNOW[pageVectorNOW.Count - 1].Points.Add(new cncPoint((posX + deltaX)* sizeOnePoint, posY* sizeOnePoint, 0, 0, 0, false, lastColor));
                    }
                } // while (CountPoint > 0)
            }     //unsafe
            pageImageNOW.UnlockBits(bitmapData1);


            //TODO: временный костыль
            //нужно удалить одинаковые точки
            GroupPoint gp = pageVectorNOW[pageVectorNOW.Count - 1];

            List <cncPoint> lpnt = gp.Points;

            if (lpnt.Count > 2)
            {
                cncPoint p1 = lpnt[lpnt.Count - 1];
                cncPoint p2 = lpnt[lpnt.Count - 2];

                if ((p1.X == p2.X && p1.Y == p2.Y && p1.Bright == p2.Bright))
                {
                    lpnt.RemoveAt(lpnt.Count - 1);
                }
            }

            // тут нужно сделать преворот согластно текущй ориентации осей
            pageVectorNOW = VectorProcessing.Rotate(pageVectorNOW);

            //а тут применим график, если есть конечно данные
            List <myPoint> PointsS = new List <myPoint>(); // вычисление значения S
            List <myPoint> PointsF = new List <myPoint>(); // вычисление значения F

            // попытка заполнения

            if (Settings.Default.filter3_mapS != null)
            {
                foreach (string VARIABLE in Settings.Default.filter3_mapS)
                {
                    string[] newSS = VARIABLE.Split(';');
                    if (newSS.Length != 2)
                    {
                        continue;
                    }

                    int p1 = 0;
                    int p2 = 0;

                    int.TryParse(newSS[0].Trim(), out p1);
                    int.TryParse(newSS[1].Trim(), out p2);

                    PointsS.Add(new myPoint(p1, p2));
                }
            }

            if (Settings.Default.filter3_mapF != null)
            {
                foreach (string VARIABLE in Settings.Default.filter3_mapF)
                {
                    string[] newSS = VARIABLE.Split(';');
                    if (newSS.Length != 2)
                    {
                        continue;
                    }

                    int p1 = 0;
                    int p2 = 0;

                    int.TryParse(newSS[0].Trim(), out p1);
                    int.TryParse(newSS[1].Trim(), out p2);

                    PointsF.Add(new myPoint(p1, p2));
                }
            }

            if (PointsS.Count > 0)  //если есть данные вычислим S
            {
                foreach (GroupPoint gg in pageVectorNOW)
                {
                    foreach (cncPoint pp in gg.Points)
                    {
                        pp.Svalue = (int)GetApromixValue(ref PointsS, pp.Bright);
                    }
                }
            }

            if (PointsF.Count > 0)  //если есть данные вычислим F
            {
                foreach (GroupPoint gg in pageVectorNOW)
                {
                    foreach (cncPoint pp in gg.Points)
                    {
                        pp.Fvalue = (int)GetApromixValue(ref PointsF, pp.Bright);
                    }
                }
            }
        }
Пример #9
0
        private void button2_Click(object sender, EventArgs e)
        {
            List <GroupPoint> destCVectors = new List <GroupPoint>();

            foreach (GroupPoint vector in pageVectorNOW)
            {
                double minX = 9999;
                double maxX = -9999;
                double minY = 9999;
                double maxY = -9999;


                //получим максимум и минимум точек отрезка
                foreach (cncPoint pp in vector.Points)
                {
                    if (minX > pp.X)
                    {
                        minX = pp.X;
                    }

                    if (minY > pp.Y)
                    {
                        minY = pp.Y;
                    }

                    if (maxX < pp.X)
                    {
                        maxX = pp.X;
                    }

                    if (maxY < pp.Y)
                    {
                        maxY = pp.Y;
                    }
                }

                double radius = (((maxX - minX) + (maxY - minY)) / 2) / 2;

                if (checkBoxGena.Checked)
                {
                    radius = (double)numericGena.Value;
                }

                double centrX = ((maxX - minX) / 2) + minX;
                double centrY = ((maxY - minY) / 2) + minY;

                cncPoint centrCircle = new cncPoint(centrX, centrY);

                GroupPoint newGroupPoint = new GroupPoint();



                int segmentsCount = (int)numericUpDown2.Value;


                for (int i = 0; i < segmentsCount; i++)
                {
                    float rx = (float)radius * (float)Math.Cos(2 * (float)Math.PI / segmentsCount * i);
                    float ry = (float)radius * (float)Math.Sin(2 * (float)Math.PI / segmentsCount * i);

                    newGroupPoint.Points.Add(new cncPoint(centrX + (double)rx, centrY + (double)ry));
                }

                newGroupPoint.Points.Add(new cncPoint(newGroupPoint.Points[0].X, newGroupPoint.Points[0].Y));



                //в цикле....
                //  newSegment.Points.Add(new Location(pp.X, pp.Y));

                //newSegment.Points.Add(new Location(centrX- radius, centrY- radius));
                //newSegment.Points.Add(new Location(centrX+ radius, centrY- radius));
                //newSegment.Points.Add(new Location(centrX+ radius, centrY+ radius));
                //newSegment.Points.Add(new Location(centrX- radius, centrY+ radius));
                //newSegment.Points.Add(new Location(centrX- radius, centrY- radius));

                //if (newSegment.Points.Count > 2)
                //{
                //    Location p1 = newSegment.Points[0];
                //    Location p2 = newSegment.Points[newSegment.Points.Count - 1];

                //    if (p1.X != p2.X && p1.Y != p2.Y)
                //    {
                //        newSegment.Points.Add(new Location(p1.X, p1.Y));
                //    }
                //}

                destCVectors.Add(newGroupPoint);
                newGroupPoint = new GroupPoint();
            }

            pageVectorNOW = destCVectors;

            RefreshTree();
        }
Пример #10
0
        private void btOptimize1_Click(object sender, EventArgs e)
        {
            // Нужно отсортировать отрезки, для минимизации холостого хода

            if (pageVectorNOW.Count < 2)
            {
                return;                       //нет смысла сортировать
            }
            // создаем временный список отрезков
            List <GroupPoint> destCVectors = new List <GroupPoint>();

            //начинаем поиск отрезка, который ближе всего к координатам 0,0

            GroupPoint tmpVector        = new GroupPoint();
            decimal    minDist          = 99999;
            bool       needReversVector = false;


            foreach (GroupPoint vector  in pageVectorNOW)
            {
                //узнаем расстояние
                decimal iS = (decimal)(Math.Sqrt(Math.Pow(Math.Abs((double)vector.Points[0].X), 2) + Math.Pow(Math.Abs((double)vector.Points[0].Y), 2)));
                //узнаем расстояние конечной точки этого-же отрезка
                decimal iE = (decimal)(Math.Sqrt(Math.Pow(Math.Abs((double)vector.Points[vector.Points.Count - 1].X), 2) + Math.Pow(Math.Abs((double)vector.Points[vector.Points.Count - 1].Y), 2)));

                if (iS < minDist || iE < minDist)
                {
                    //если оказались тут, осталось определить что ближе, начало отрезка или конец отрезка
                    if (iS < iE)
                    {
                        minDist          = iS;
                        needReversVector = false;
                    }
                    else
                    {
                        minDist          = iE;
                        needReversVector = true;
                    }
                    tmpVector = vector;
                }
            }

            //теперь самый ближний вектор, перенесем в новый список
            destCVectors.Add(tmpVector);
            // и данный вектор удалим из прежнего списка
            pageVectorNOW.Remove(tmpVector);

            if (needReversVector)  // нужно сменить порядок координат
            {
                destCVectors[destCVectors.Count - 1].Points.Reverse();
            }



            //теперь зациклимся пока не отсортируем
            while (pageVectorNOW.Count > 0)
            {
                // из временного вектора берем последний отрезок, и в нем последнюю точку, с которой дальше
                // будем искать самую короткую дистанцию
                cncPoint currPoint =
                    destCVectors[destCVectors.Count - 1].Points[destCVectors[destCVectors.Count - 1].Points.Count - 1];

                tmpVector        = new GroupPoint();
                minDist          = 99999;
                needReversVector = false;

                foreach (GroupPoint vector in pageVectorNOW)
                {
                    //узнаем расстояние начальной точки отрезка
                    decimal iS = (decimal)(Math.Sqrt(Math.Pow(Math.Abs((double)vector.Points[0].X - (double)currPoint.X), 2) + Math.Pow(Math.Abs((double)vector.Points[0].Y - (double)currPoint.Y), 2)));
                    //узнаем расстояние конечной точки этого-же отрезка
                    decimal iE = (decimal)(Math.Sqrt(Math.Pow(Math.Abs((double)vector.Points[vector.Points.Count - 1].X - (double)currPoint.X), 2) + Math.Pow(Math.Abs((double)vector.Points[vector.Points.Count - 1].Y - (double)currPoint.Y), 2)));


                    if (iS < minDist || iE < minDist)
                    {
                        //если оказались тут, осталось определить что ближе, начало отрезка или конец отрезка
                        if (iS < iE)
                        {
                            minDist          = iS;
                            needReversVector = false;
                        }
                        else
                        {
                            minDist          = iE;
                            needReversVector = true;
                        }
                        tmpVector = vector;
                    }
                }
                //теперь самый ближний вектор, перенесем в новый список
                destCVectors.Add(tmpVector);
                // и данный вектор удалим из прежнего списка
                pageVectorNOW.Remove(tmpVector);

                if (needReversVector)  // нужно сменить порядок координат
                {
                    destCVectors[destCVectors.Count - 1].Points.Reverse();
                }
            }

            pageVectorNOW = new List <GroupPoint>(destCVectors);
            destCVectors.Clear();

            UserActions();
        }