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(); }
/// <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; }
} // для визуального отображения 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); }
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); } }
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(); }
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(); }
// сюда передается с трока с тектом и параметрами 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 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(); }
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(); }