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(); }
//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); }
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); } }
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); }
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 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; ////} } } }
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(); }