public static Processor RenameProcessor(Processor processor, string newTag) { if (processor == null) { throw new ArgumentNullException(nameof(processor)); } if (processor.Tag == newTag) { return(processor); } if (string.IsNullOrWhiteSpace(newTag)) { throw new ArgumentException($"\"{nameof(newTag)}\" не может быть пустым или содержать только пробел.", nameof(newTag)); } SignValue[,] sv = new SignValue[processor.Width, processor.Height]; for (int i = 0; i < processor.Width; i++) { for (int j = 0; j < processor.Height; j++) { sv[i, j] = processor[i, j]; } } return(new Processor(sv, newTag)); }
/// <summary> /// Получает заданную часть указанной карты. /// Часть эта по размерам соответствует полям <see cref="MapWidth" /> и <see cref="MapHeight" />. /// </summary> /// <param name="processor">Карта, часть которой необходимо получить.</param> /// <param name="x">Координата X необходимой части карты.</param> /// <param name="y">Координата Y необходимой части карты.</param> /// <returns>Возвращает указанную часть карты в виде массива <see cref="SignValue" />.</returns> protected SignValue[,] GetMapPiece(Processor processor, int x, int y) { SignValue[,] sv = new SignValue[MapWidth, MapHeight]; for (int cy = y, y1 = 0, my = y + MapHeight; cy < my; cy++, y1++) { for (int cx = x, x1 = 0, mx = x + MapWidth; cx < mx; cx++, x1++) { sv[x1, y1] = processor[cx, cy]; } } return(sv); }
/// <summary> /// Определяет, содержит ли текущий экземпляр <see cref="DynamicReflex" /> карту с подобным содержимым или нет. /// В случае нахождения карты с совпадающим содержимым, метод возвращает значение <see langword="null" />, в противном /// случае - /// массив данных, сведения о котором указаны в параметре <see cref="Registered" />. /// </summary> /// <param name="processor">Карта, из которой необходимо получить целевую карту.</param> /// <param name="registered">Сведения о получаемой карте.</param> /// <returns> /// В случае нахождения карты с совпадающим содержимым, метод возвращает значение <see langword="null" />, в противном /// случае - /// массив данных, сведения о котором указаны в параметре <see cref="Registered" />. /// </returns> static Processor GetProcessorFromField(Processor processor, Registered registered) { SignValue[,] values = new SignValue[registered.Region.Width, registered.Region.Height]; for (int y = registered.Y, y1 = 0; y < registered.Bottom; y++, y1++) { for (int x = registered.X, x1 = 0; x < registered.Right; x++, x1++) { values[x1, y1] = processor[x, y]; } } return(new Processor(values, registered.Register.SelectedProcessor.Tag)); }
/// <summary> /// Находит наиболее подходящие друг к другу изображения, сравнивая знаки, содержащиеся в списках, и вычисляя, какое изображение соответствует более всего, /// т.е. имеет наименьшую разницу в знаках и встречающееся более всего раз. Его номер возвращается. Количество раз, которое оно встретилось, /// возвращается в переменную "count". /// </summary> /// <param name="lst1">Знаки первого искомого изображения.</param> /// <param name="lst2">Знаки второго искомого изображения.</param> /// <param name="lst3">Знаки третьего искомого изображения.</param> /// <param name="count">Степень соответствия. Чем больше, тем лучше.</param> /// <returns>Возвращает номер наиболее подходящего изображения.</returns> public byte GetBySign(List <SignValue> lst1, List <SignValue> lst2, List <SignValue> lst3, out int count) { count = 0; if (Img1 == null && Img2 == null && Img3 == null) { return(0); } int i1 = 0, i2 = 0, i3 = 0; for (int k = 0; k < Map.AllMax; k++) { SignValue sv1 = SignValue.MaxValue, sv2 = SignValue.MaxValue, sv3 = SignValue.MaxValue; if (Img1 != null) { sv1 = Img1[k] - lst1[k]; } if (Img2 != null) { sv2 = Img2[k] - lst2[k]; } if (Img3 != null) { sv3 = Img3[k] - lst3[3]; } if (sv1 < sv2 && sv1 < sv3) { i1++; continue; } if (sv2 < sv1 && sv2 < sv3) { i2++; continue; } i3++; } if (i1 > i2 && i1 > i3) { count = i1; return(1); } if (i2 > i1 && i2 > i3) { count = i2; return(2); } count = i3; return(3); }
/// <summary> /// Сжимает указанный список знаков по две позиции за каждый раз. /// </summary> /// <param name="target">Преобразуемый список.</param> /// <param name="k">Стартовая позиция для преобразования.</param> /// <param name="sv">Знак для преобразования.</param> /// <returns>Возвращает знак после преобразования или null в случае окончания операции.</returns> static SignValue?Parse(List <SignValue> target, ref int k, SignValue sv) { Map map = new Map(); int mx = (target.Count % 2 != 0) ? target.Count - 1 : target.Count; for (int x = 0; x < 2 && k < mx; x++, k++) { map.Add(new MapObject { Sign = target[k] }); } Processor ce = new Processor(map); return(ce.Run(sv)); }
/// <summary> /// Преобразует изображение в список знаков, размера, меньшего или равного Map.AllMax, чтобы уместить их на карту. /// При этом, каждый знак, добавляемый в список, проходит прогон по определённому знаку. /// Количество знаков для прогонов зависит от размера изображения. /// </summary> /// <param name="target">Преобразуемое изображение.</param> /// <returns>Возвращает список знаков, размера, меньшего или равного Map.AllMax.</returns> static List <SignValue> GetSign(Bitmap target) { List <SignValue> lst = BitmapToList(target); int plus = SignValue.MaxValue.Value / Map.AllMax; SignValue sv = SignValue.MinValue; while (lst.Count > Map.AllMax) { List <SignValue> nlst = new List <SignValue>(); int k = 0; SignValue?val = null; while ((val = Parse(lst, ref k, sv)) != null) { nlst.Add(val.Value); } sv = new SignValue(sv + plus); lst = nlst; } return(lst); }
/// <summary> /// Объединяет указанные карты в единую карту в соответствии с расположением карт в указанном массиве. /// При этом важно, чтобы все указанные карты были одного размера. /// Карты со значением <see langword="null" /> должны отсутствовать. /// </summary> /// <param name="processors">Карты, которые необходимо объединить.</param> /// <returns>Возвращает итоговую карту в виде массива <see cref="SignValue" />.</returns> protected SignValue[,] MapCreator(Processor[,] processors) { int mx = ProcessorWidth, my = ProcessorHeight; SignValue[,] sv = new SignValue[mx, my]; for (int y = 0, pry = 0; y < my; y += MapHeight, pry++) { for (int x = 0, prx = 0; x < mx; x += MapWidth, prx++) { Processor p = processors[prx, pry]; for (int cy = y, pryy = 0, py = y + MapHeight; cy < py; cy++, pryy++) { for (int cx = x, prxx = 0, px = x + MapWidth; cx < px; cx++, prxx++) { sv[cx, cy] = p[prxx, pryy]; } } } } return(sv); }
/// <summary> /// Вызывается при отладочной остановке. /// </summary> /// <param name="objNew">Порождаемый объект.</param> /// <param name="objStart">Стартовый объект.</param> /// <param name="objFind">Найденный объект.</param> /// <param name="count">Количество пройденных объектов.</param> /// <returns>Возвращает определённое пользователем состояние отладчика.</returns> bool DebugObject(SignValue objNew, SignValue objStart, MapObject objFind, int count) { try { Invoke((Action)(() => { try { _currentPainter.DrawDebugNew = objNew; _currentPainter.DrawDebugStart = objStart; _currentPainter.DrawDebugFind = objFind; _btnSave.Enabled = false; _btnLoad.Enabled = false; _lblDiscountTotal.Text = string.Format(CultureInfo.CurrentCulture, "{0}/{1}", count, _currentMap.Count); _txtSign.Text = objStart.ToString(); _currentPainter.Paint(); } catch (Exception ex) { MessageBox.Show(this, ex.Message); } })); _currentDebuggerWait = false; while (!_currentDebuggerWait) { Thread.Sleep(50); } _currentDebuggerWait = false; return(_currentDebuggerState); } catch (Exception ex) { _currentDebuggerState = false; _currentDebuggerWait = false; MessageBox.Show(this, ex.Message); return(false); } }
/// <summary> /// Осуществляет вставку объекта карты из буфера обмена. /// </summary> void MapObjectPaste() { try { SignValue curSign = new SignValue(Convert.ToInt32(Clipboard.GetText())); MapObject obj = _currentMap.GetObjectByXY(_currentPainter.ObjectScrX, _currentPainter.ObjectScrY); if (obj == null) { _currentMap.Add(new MapObject { Sign = curSign, ObjectX = _currentPainter.ObjectScrX, ObjectY = _currentPainter.ObjectScrY }); return; } obj.Sign = curSign; } catch (Exception ex) { MessageBox.Show(this, ex.Message); } finally { MapCount(); } }
public void PHTest() { ProcessorHandler ph = new ProcessorHandler(); Assert.AreEqual(string.Empty, ph.ToString()); Assert.AreEqual(0, ph.Processors.ToArray().Length); ph.Add(new Processor(new[] { new SignValue(2) }, "A")); List <Processor> procs = CheckProcessorHandler1(ph); procs.Add(new Processor(new[] { new SignValue(2000) }, "w")); CheckProcessorHandler1(ph); ph.Add(new Processor(new[] { new SignValue(3) }, "b")); procs = ph.Processors.ToList(); Assert.AreNotEqual(null, procs); CheckSize(procs); Assert.AreEqual(2, procs.Count); Assert.AreEqual(new SignValue(2), procs[0][0, 0]); Assert.AreEqual("A", procs[0].Tag); Assert.AreEqual(new SignValue(3), procs[1][0, 0]); Assert.AreEqual("b", procs[1].Tag); Assert.AreEqual("AB", ph.ToString()); ph.Add(new Processor(new[] { new SignValue(4) }, "C")); CheckProcessorHandler2(ph); ph.Add(new Processor(new[] { new SignValue(2) }, "A")); CheckProcessorHandler2(ph); ph.Add(new Processor(new[] { new SignValue(3) }, "b")); CheckProcessorHandler2(ph); ph.Add(new Processor(new[] { new SignValue(4) }, "C")); CheckProcessorHandler2(ph); ph.Add(new Processor(new[] { new SignValue(2) }, "A1")); CheckProcessorHandler2(ph); ph.Add(new Processor(new[] { new SignValue(3) }, "b1")); CheckProcessorHandler2(ph); ph.Add(new Processor(new[] { new SignValue(4) }, "C1")); CheckProcessorHandler2(ph); ph.Add(new Processor(new[] { new SignValue(2) }, "a1")); CheckProcessorHandler2(ph); ph.Add(new Processor(new[] { new SignValue(3) }, "B1")); CheckProcessorHandler2(ph); ph.Add(new Processor(new[] { new SignValue(4) }, "c1")); CheckProcessorHandler2(ph); ph.Add(new Processor(new[] { new SignValue(13) }, "b1")); procs = ph.Processors.ToList(); Assert.AreNotEqual(null, procs); CheckSize(procs); Assert.AreEqual(4, procs.Count); Assert.AreEqual(new SignValue(2), procs[0][0, 0]); Assert.AreEqual("A", procs[0].Tag); Assert.AreEqual(new SignValue(3), procs[1][0, 0]); Assert.AreEqual("b", procs[1].Tag); Assert.AreEqual(new SignValue(4), procs[2][0, 0]); Assert.AreEqual("C", procs[2].Tag); Assert.AreEqual(new SignValue(13), procs[3][0, 0]); Assert.AreEqual("b1", procs[3].Tag); Assert.AreEqual("ABCB", ph.ToString()); ph.Add(new Processor(new[] { new SignValue(14) }, "B1")); procs = ph.Processors.ToList(); Assert.AreNotEqual(null, procs); CheckSize(procs); Assert.AreEqual(5, procs.Count); Assert.AreEqual(new SignValue(2), procs[0][0, 0]); Assert.AreEqual("A", procs[0].Tag); Assert.AreEqual(new SignValue(3), procs[1][0, 0]); Assert.AreEqual("b", procs[1].Tag); Assert.AreEqual(new SignValue(4), procs[2][0, 0]); Assert.AreEqual("C", procs[2].Tag); Assert.AreEqual(new SignValue(13), procs[3][0, 0]); Assert.AreEqual("b1", procs[3].Tag); Assert.AreEqual(new SignValue(14), procs[4][0, 0]); Assert.AreEqual("B10", procs[4].Tag); Assert.AreEqual("ABCBB", ph.ToString()); ph.Add(new Processor(new[] { new SignValue(15) }, "B")); procs = ph.Processors.ToList(); Assert.AreNotEqual(null, procs); CheckSize(procs); Assert.AreEqual(6, procs.Count); Assert.AreEqual(new SignValue(2), procs[0][0, 0]); Assert.AreEqual("A", procs[0].Tag); Assert.AreEqual(new SignValue(3), procs[1][0, 0]); Assert.AreEqual("b", procs[1].Tag); Assert.AreEqual(new SignValue(4), procs[2][0, 0]); Assert.AreEqual("C", procs[2].Tag); Assert.AreEqual(new SignValue(13), procs[3][0, 0]); Assert.AreEqual("b1", procs[3].Tag); Assert.AreEqual(new SignValue(14), procs[4][0, 0]); Assert.AreEqual("B10", procs[4].Tag); Assert.AreEqual(new SignValue(15), procs[5][0, 0]); Assert.AreEqual("B0", procs[5].Tag); Assert.AreEqual("ABCBBB", ph.ToString()); ph.Add(new Processor(new[] { new SignValue(16) }, "b")); procs = ph.Processors.ToList(); Assert.AreNotEqual(null, procs); CheckSize(procs); Assert.AreEqual(7, procs.Count); Assert.AreEqual(new SignValue(2), procs[0][0, 0]); Assert.AreEqual("A", procs[0].Tag); Assert.AreEqual(new SignValue(3), procs[1][0, 0]); Assert.AreEqual("b", procs[1].Tag); Assert.AreEqual(new SignValue(4), procs[2][0, 0]); Assert.AreEqual("C", procs[2].Tag); Assert.AreEqual(new SignValue(13), procs[3][0, 0]); Assert.AreEqual("b1", procs[3].Tag); Assert.AreEqual(new SignValue(14), procs[4][0, 0]); Assert.AreEqual("B10", procs[4].Tag); Assert.AreEqual(new SignValue(15), procs[5][0, 0]); Assert.AreEqual("B0", procs[5].Tag); Assert.AreEqual(new SignValue(16), procs[6][0, 0]); Assert.AreEqual("b00", procs[6].Tag); Assert.AreEqual("ABCBBBB", ph.ToString()); bool bex = false; try { SignValue[,] prc = new SignValue[2, 1]; prc[0, 0] = new SignValue(16); prc[1, 0] = new SignValue(100); ph.Add(new Processor(prc, "b")); } catch (Exception ex) { Assert.AreEqual(typeof(ArgumentException), ex.GetType()); Assert.AreEqual("Добавляемая карта отличается по размерам от первой карты, добавленной в коллекцию. Требуется: 1, 1. Фактически: 2, 1.", ex.Message); bex = true; } Assert.AreEqual(true, bex); bex = false; try { SignValue[,] prc = new SignValue[1, 2]; prc[0, 0] = new SignValue(16); prc[0, 1] = new SignValue(100); ph.Add(new Processor(prc, "b")); } catch (Exception ex) { Assert.AreEqual(typeof(ArgumentException), ex.GetType()); Assert.AreEqual("Добавляемая карта отличается по размерам от первой карты, добавленной в коллекцию. Требуется: 1, 1. Фактически: 1, 2.", ex.Message); bex = true; } Assert.AreEqual(true, bex); ph.Add(new Processor(new[] { new SignValue(3) }, "r")); procs = ph.Processors.ToList(); Assert.AreNotEqual(null, procs); CheckSize(procs); Assert.AreEqual(8, procs.Count); Assert.AreEqual(new SignValue(2), procs[0][0, 0]); Assert.AreEqual("A", procs[0].Tag); Assert.AreEqual(new SignValue(3), procs[1][0, 0]); Assert.AreEqual("b", procs[1].Tag); Assert.AreEqual(new SignValue(4), procs[2][0, 0]); Assert.AreEqual("C", procs[2].Tag); Assert.AreEqual(new SignValue(13), procs[3][0, 0]); Assert.AreEqual("b1", procs[3].Tag); Assert.AreEqual(new SignValue(14), procs[4][0, 0]); Assert.AreEqual("B10", procs[4].Tag); Assert.AreEqual(new SignValue(15), procs[5][0, 0]); Assert.AreEqual("B0", procs[5].Tag); Assert.AreEqual(new SignValue(16), procs[6][0, 0]); Assert.AreEqual("b00", procs[6].Tag); Assert.AreEqual(new SignValue(3), procs[7][0, 0]); Assert.AreEqual("r", procs[7].Tag); Assert.AreEqual("ABCBBBBR", ph.ToString()); ph.Add(new Processor(new[] { new SignValue(2) }, "v1")); procs = ph.Processors.ToList(); Assert.AreNotEqual(null, procs); CheckSize(procs); Assert.AreEqual(9, procs.Count); Assert.AreEqual(new SignValue(2), procs[0][0, 0]); Assert.AreEqual("A", procs[0].Tag); Assert.AreEqual(new SignValue(3), procs[1][0, 0]); Assert.AreEqual("b", procs[1].Tag); Assert.AreEqual(new SignValue(4), procs[2][0, 0]); Assert.AreEqual("C", procs[2].Tag); Assert.AreEqual(new SignValue(13), procs[3][0, 0]); Assert.AreEqual("b1", procs[3].Tag); Assert.AreEqual(new SignValue(14), procs[4][0, 0]); Assert.AreEqual("B10", procs[4].Tag); Assert.AreEqual(new SignValue(15), procs[5][0, 0]); Assert.AreEqual("B0", procs[5].Tag); Assert.AreEqual(new SignValue(16), procs[6][0, 0]); Assert.AreEqual("b00", procs[6].Tag); Assert.AreEqual(new SignValue(3), procs[7][0, 0]); Assert.AreEqual("r", procs[7].Tag); Assert.AreEqual(new SignValue(2), procs[8][0, 0]); Assert.AreEqual("v1", procs[8].Tag); Assert.AreEqual("ABCBBBBRV", ph.ToString()); ph.Add(new Processor(new[] { new SignValue(8418982) }, "q")); procs = ph.Processors.ToList(); Assert.AreNotEqual(null, procs); CheckSize(procs); Assert.AreEqual(10, procs.Count); Assert.AreEqual(new SignValue(2), procs[0][0, 0]); Assert.AreEqual("A", procs[0].Tag); Assert.AreEqual(new SignValue(3), procs[1][0, 0]); Assert.AreEqual("b", procs[1].Tag); Assert.AreEqual(new SignValue(4), procs[2][0, 0]); Assert.AreEqual("C", procs[2].Tag); Assert.AreEqual(new SignValue(13), procs[3][0, 0]); Assert.AreEqual("b1", procs[3].Tag); Assert.AreEqual(new SignValue(14), procs[4][0, 0]); Assert.AreEqual("B10", procs[4].Tag); Assert.AreEqual(new SignValue(15), procs[5][0, 0]); Assert.AreEqual("B0", procs[5].Tag); Assert.AreEqual(new SignValue(16), procs[6][0, 0]); Assert.AreEqual("b00", procs[6].Tag); Assert.AreEqual(new SignValue(3), procs[7][0, 0]); Assert.AreEqual("r", procs[7].Tag); Assert.AreEqual(new SignValue(2), procs[8][0, 0]); Assert.AreEqual("v1", procs[8].Tag); Assert.AreEqual(new SignValue(8418982), procs[9][0, 0]); Assert.AreEqual("q", procs[9].Tag); Assert.AreEqual("ABCBBBBRVQ", ph.ToString()); ph.Add(new Processor(new[] { new SignValue(12451893) }, "q")); procs = ph.Processors.ToList(); Assert.AreNotEqual(null, procs); CheckSize(procs); Assert.AreEqual(11, procs.Count); Assert.AreEqual(new SignValue(2), procs[0][0, 0]); Assert.AreEqual("A", procs[0].Tag); Assert.AreEqual(new SignValue(3), procs[1][0, 0]); Assert.AreEqual("b", procs[1].Tag); Assert.AreEqual(new SignValue(4), procs[2][0, 0]); Assert.AreEqual("C", procs[2].Tag); Assert.AreEqual(new SignValue(13), procs[3][0, 0]); Assert.AreEqual("b1", procs[3].Tag); Assert.AreEqual(new SignValue(14), procs[4][0, 0]); Assert.AreEqual("B10", procs[4].Tag); Assert.AreEqual(new SignValue(15), procs[5][0, 0]); Assert.AreEqual("B0", procs[5].Tag); Assert.AreEqual(new SignValue(16), procs[6][0, 0]); Assert.AreEqual("b00", procs[6].Tag); Assert.AreEqual(new SignValue(3), procs[7][0, 0]); Assert.AreEqual("r", procs[7].Tag); Assert.AreEqual(new SignValue(2), procs[8][0, 0]); Assert.AreEqual("v1", procs[8].Tag); Assert.AreEqual(new SignValue(8418982), procs[9][0, 0]); Assert.AreEqual("q", procs[9].Tag); Assert.AreEqual(new SignValue(12451893), procs[10][0, 0]); Assert.AreEqual("q0", procs[10].Tag); Assert.AreEqual("ABCBBBBRVQQ", ph.ToString()); Processor renameProcessor2 = ProcessorHandler.ChangeProcessorTag(new Processor(new[] { SignValue.MaxValue }, "mmM"), "zZz"); Assert.AreNotEqual(null, renameProcessor2); Assert.AreEqual("zZz", renameProcessor2.Tag); Assert.AreEqual(SignValue.MaxValue, renameProcessor2[0, 0]); Assert.AreEqual(1, renameProcessor2.Width); Assert.AreEqual(1, renameProcessor2.Height); Processor renameProcessor3 = ProcessorHandler.ChangeProcessorTag(new Processor(new[] { SignValue.MaxValue }, "mmM"), "mmM"); Assert.AreNotEqual(null, renameProcessor3); Assert.AreEqual("mmM", renameProcessor3.Tag); Assert.AreEqual(SignValue.MaxValue, renameProcessor3[0, 0]); Assert.AreEqual(1, renameProcessor3.Width); Assert.AreEqual(1, renameProcessor3.Height); }