Example #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();
        }
Example #2
0
        //TODO: траектория для предварительного просмотра смещения контура
        //public bool TempTraectory { get; set; }

        // Создание отдельной копии
        public GroupPoint Clone()
        {
            GroupPoint segReturn = new GroupPoint();

            segReturn.Selected = Selected;
            //segReturn.TempTraectory = TempTraectory;
            segReturn.Dirrect          = Dirrect;
            segReturn.IndividualPoints = IndividualPoints;

            segReturn.Points = new List <cncPoint>();

            foreach (cncPoint VARIABLE in Points)
            {
                segReturn.Points.Add(VARIABLE.Clone());
            }

            return(segReturn);
        }
Example #3
0
        public void GetAfterSegment(ref StringBuilder _sb, GroupPoint groupPoint, ref List <VariableValue> _variableDataValues)
        {
            foreach (string str in _afterSegment)
            {
                string ss = str.Replace('\t', ' ').Trim();

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

                FillStringLine(ss, ref _sb, ref _variableDataValues, groupPoint);
            }

            foreach (string str in _afterSegmentL)
            {
                string ss = str.Replace('\t', ' ').Trim();

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

                FillStringLine(ss, ref _sb, ref _variableDataValues, groupPoint);
            }

            foreach (string str in _afterSegmentR)
            {
                string ss = str.Replace('\t', ' ').Trim();

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

                FillStringLine(ss, ref _sb, ref _variableDataValues, groupPoint);
            }
        }
Example #4
0
        private void buttonSelectedDown_Click(object sender, EventArgs e)
        {
            int level     = -1; //расположение 0-выбран узел линии, 1-точка линии
            int pos       = -1; // если это линия то её индекс, если точка то её индекс
            int posParent = -1; //если выбрана точка, то тут индекс линии

            if (treeViewVectors.SelectedNode == null)
            {
                return;
            }

            level = treeViewVectors.SelectedNode.Level;
            pos   = treeViewVectors.SelectedNode.Index;


            if (level != 0)
            {
                return;
            }

            if (pos == pageVectorNOW.Count - 1)
            {
                return;
            }

            GroupPoint ggp = pageVectorNOW[pos].Clone();

            pageVectorNOW.RemoveAt(pos);
            pageVectorNOW.Insert(pos + 1, ggp.Clone());


            UserActions();


            treeViewVectors.SelectedNode           = treeViewVectors.Nodes[pos + 1];
            treeViewVectors.SelectedNode.ForeColor = Color.Blue;
            //treeViewVectors.SelectedNode.NodeFont = new Font(this.Font, FontStyle.Bold);
        }
Example #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();
        }
Example #6
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.###"));
        }
        //
        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);
                    }
                }
            }
        }
        // тут зигзагом будем идти по файлу, и получать цвет
        private void GenVar3()
        {
            // работа заточена только под 24-х битный пиксель
            if (pageImageNOW.PixelFormat != PixelFormat.Format24bppRgb)
            {
                //throw new UnsupportedImageFormatException("Оппа! Не поддерживаемый формат изображения!!!");
                MessageBox.Show(
                    "Для генерации данных, требуется изображение имеющее 24 бита на пиксель, а получилось иначе, очень подозрительно....!!");
                return;
            }

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

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

            pageVectorNOW = new List <GroupPoint>();



            double sizeOnePoint = (double)numSizePoint.Value;

            bool isFirst = true;
            bool isLast  = false;

            unsafe
            {
                byte *imagePointer1 = (byte *)bitmapData1.Scan0;
                for (int i = 0; i < bitmapData1.Height; i++)
                {
                    //TODO: Доделать............
                    isFirst = true;
                    isLast  = false;

                    GroupPoint tmpGroup = new GroupPoint();

                    for (int j = 0; j < bitmapData1.Width; j++)
                    {
                        // дошли до последней строки в текущей линии
                        if (j == (bitmapData1.Width - 1))
                        {
                            isLast = true;
                        }

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

                        if (isFirst || isLast)
                        {
                            lastColor = currColor;
                            tmpGroup.Points.Add(new cncPoint((j * sizeOnePoint) + (double)deltaX.Value, (i * sizeOnePoint) + (double)deltaY.Value, 0, 0, 0, false, currColor));

                            if (isLast)
                            {
                                pageVectorNOW.Add(tmpGroup.Clone());
                            }

                            isFirst = false;
                        }
                        else
                        {
                            if (lastColor != currColor)
                            {
                                tmpGroup.Points.Add(new cncPoint((j * sizeOnePoint) + (double)deltaX.Value, (i * sizeOnePoint) + (double)deltaY.Value, 0, 0, 0, false, lastColor));
                                lastColor = currColor;
                                tmpGroup.Points.Add(new cncPoint((j * sizeOnePoint) + (double)deltaX.Value, (i * sizeOnePoint) + (double)deltaY.Value, 0, 0, 0, false, currColor));
                            }
                        }

                        imagePointer1 += 3;
                    } //end for j
                    imagePointer1 += bitmapData1.Stride - (bitmapData1.Width * 3);
                }     //end for i
            }         //end unsafe
            pageImageNOW.UnlockBits(bitmapData1);

            //теперь у нечентных линий нужно сменить направление
            bool needRevers = false;

            foreach (GroupPoint gpGroupPoint in pageVectorNOW)
            {
                if (needRevers)
                {
                    gpGroupPoint.Points.Reverse();
                }

                needRevers = !needRevers;
            }

            pageVectorNOW.Reverse();


            ////******************************

            ////направление движения
            ////DirrectionGroupPoint dir = DirrectionGroupPoint.Right;

            //        //if (dir == DirrectionGroupPoint.Left) dir = DirrectionGroupPoint.Right;
            //        //else dir = DirrectionGroupPoint.Left;


            //Bitmap bb = pageImageNOW;
            //BitmapData data = bb.LockBits(new Rectangle(0, 0, bb.Width, bb.Height), ImageLockMode.ReadOnly, bb.PixelFormat);  // make sure you check the pixel format as you will be looking directly at memory

            ////направление движения
            ////DirrectionGroupPoint dir = DirrectionGroupPoint.Right;

            //unsafe
            //{
            //    byte* ptrSrc = (byte*)data.Scan0;

            //    int diff = data.Stride - data.Width;

            //    pageVectorNOW = new List<GroupPoint>();

            //    for (int y = 0; y < data.Height; ++y) //проход по линии
            //    {
            //        List<cncPoint> tmp = new List<cncPoint>();

            //        byte lastValueColor = 0;
            //        bool firstPoint = true;
            //        bool lastPoint = false;


            //        for (int x = 0; x < data.Width; ++x)//проход по точкам
            //        {
            //            lastPoint = (x == data.Width - 1); //будем знать последняя ли это точка линии по которой идем

            //            // windows stores images in BGR pixel order
            //            byte r = ptrSrc[0]; //тут получили нужный цвет

            //            if (firstPoint || lastPoint) //первую и последнюю точку добавим в любом случае
            //            {
            //                firstPoint = false;

            //                cncPoint lk = new cncPoint((x * sizeOnePoint) + (double)deltaX.Value, (y * sizeOnePoint) + (double)deltaY.Value,0,0,0,false,(int)r);

            //                tmp.Add(lk);

            //                lastValueColor = r;
            //            }
            //            else
            //            {
            //                if (lastValueColor != r)
            //                {
            //                    cncPoint lk = new cncPoint((x * sizeOnePoint) + (double)deltaX.Value, (y * sizeOnePoint) + (double)deltaY.Value, 0, 0, 0, false, (int)r);

            //                    tmp.Add(lk);

            //                    lastValueColor = r;
            //                }
            //            }
            //            ptrSrc += 1;
            //        }


            //        // а теперь временный массив скопируем в основной, но с определенным направлением
            //        if (dir == DirrectionGroupPoint.Right)
            //        {
            //            dir = DirrectionGroupPoint.Left;
            //        }
            //        else
            //        {
            //            tmp.Reverse();
            //            dir = DirrectionGroupPoint.Right;
            //        }

            //        pageVectorNOW.Add(new GroupPoint(tmp, false, dir, true));

            //        // ReSharper disable once RedundantAssignment
            //        tmp = new List<cncPoint>();

            //        ptrSrc += diff;
            //    }
            //}

            //bb.UnlockBits(data);

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

            //а тут применим график
            List <myPoint> Points = new List <myPoint>();


            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);

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

            if (Points.Count == 0)
            {
                return;
            }

            //если есть данные вычислим S
            foreach (GroupPoint gg in pageVectorNOW)
            {
                foreach (cncPoint pp in gg.Points)
                {
                    //исходное значение
                    int sourceBright = pp.Bright;

                    //если значение меньше начальной точки
                    if (sourceBright < Points[0].X)
                    {
                        pp.Svalue = Points[0].Y;
                        continue;
                    }

                    if (sourceBright > Points[Points.Count - 1].X)
                    {
                        pp.Svalue = Points[Points.Count - 1].Y;
                        continue;
                    }

                    // а тут пройдемся по диапазону точек
                    int indx = 0;

                    foreach (myPoint Vmp in Points)
                    {
                        if (sourceBright == Vmp.X)
                        {
                            pp.Svalue = Vmp.Y;
                            break;
                        }

                        if (sourceBright < Vmp.X)
                        {
                            //тут нужно рассчитать пропорцию

                            double Bmin = Points[indx - 1].X;
                            double Bmax = Points[indx].X;

                            double Smin = Points[indx - 1].Y;
                            double Smax = Points[indx].Y;

                            double result = 0;

                            if (sourceBright == 0)
                            {
                                pp.Svalue = 0;
                            }
                            else
                            {
                                result    = ((Smax - Smin) / ((Bmax - Bmin) / sourceBright)) + Smin;
                                pp.Svalue = (int)result;
                            }


                            break;
                        }

                        indx++;
                    }



                    //подберем подходящее значение
                    //myPoint pStart = null;
                    //myPoint pStop = null;

                    ////int ind = -1;

                    ////foreach (myPoint VARIABLE in Points)
                    ////{

                    ////    if (sourceValue >= VARIABLE.X)
                    ////    {

                    ////    }
                    ////    else
                    ////    {
                    ////        break;
                    ////    }
                    ////    ind++;
                    ////}

                    ////if (ind == -1) pp.Svalue = 0;

                    ////if (ind > 0)
                    ////{
                    ////    myPoint pstart = Points[ind-1];
                    ////    myPoint pend = Points[ind];

                    ////    pp.Svalue = 100;
                    ////}
                }
            }
        }
Example #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();
        }
Example #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();
        }