/// <summary> /// Копировать <see cref="IMonomap"/>. /// </summary> /// <param name="monomap">Ссылка на <see cref="IMonomap"/>.</param> /// <returns>Ссылка на скопированный <see cref="IMonomap"/>.</returns> // TODO Пока не хочется <see cref="ICloneable"/> обязывать реализовывать. public static IMonomap Clone(this IMonomap monomap) { bool[,] newMonomap = new bool[monomap.Width, monomap.Height]; for (int x = 0; x < monomap.Width; x++) { for (int y = 0; y < monomap.Height; y++) { newMonomap[x, y] = monomap[x, y]; } } return(new BitMonomap(newMonomap)); }
/// <summary> /// Создание экземпляра класса <see cref="EditMonomap"/>. /// </summary> public EditMonomap(IMonomap monomap) { // Вокруг изображения добавил рамку в 1 пиксель _bitmap = new bool[monomap.Width + BorderThickness, monomap.Height + BorderThickness]; for (int x = 0; x < monomap.Width; x++) { for (int y = 0; y < monomap.Height; y++) { _bitmap[x + Thickness, y + Thickness] = monomap[x, y]; } } }
/// <summary> /// Создание экземпляра класса <see cref="StretchPad"/>. /// </summary> public StretchPad(IMonomap monomap, int left = 1, int top = 1, int right = 1, int bottom = 1) { if (monomap == null) { throw new ArgumentNullException(nameof(monomap)); } _monomap = monomap; _left = left; _top = top; _right = right; _bottom = bottom; }
/// <summary> /// Преобразовать <see cref="IMonomap"/> в <see cref="Bitmap"/>. /// </summary> /// <param name="monomap">Ссылка на <see cref="IMonomap"/>.</param> /// <returns>Ссылка на <see cref="Bitmap"/>.</returns> public static Bitmap ToBitmap(this IMonomap monomap) { var bitmap = new Bitmap(monomap.Width, monomap.Height); for (var y = 0; y < monomap.Height; y++) { for (var x = 0; x < monomap.Width; x++) { bitmap.SetPixel(x, y, monomap[x, y] ? Color.Black : Color.White); } } return(bitmap); }
private void InternalGenerateEulerValue( char[] sourceChars, Font font, int minSize, int maxSize, List <Symbol> symbols) { foreach (char chr in sourceChars) { for (int size = minSize; size < maxSize + 1; size++) { // TODO Что бы красиво выводить побуквенно идут по размерам каждой буквы, иначе тут лучше не вертикально а горизонтально по слою проходить using (var newFont = new Font(font.FontFamily, size, font.Style, GraphicsUnit.Pixel)) { IMonomap monomap = PrintChar(chr, newFont); int height = GetFontHeight(monomap); if (height < minSize) { continue; } var euler = EulerCharacteristicComputer.Compute2D(monomap); var chr1 = chr; Symbol symbol = symbols.First(s => s.Chr == chr1); SymbolCode symbolCode = new SymbolCode(height, euler); lock (_syncObject) { symbol.Codes.Add(symbolCode); } BitmapCreated?.Invoke(this, new BitmapEventArgs(monomap.ToBitmap(), newFont, chr)); } } } }
/// <summary> /// Создание экземпляра класса <see cref="QSymbol"/>. /// </summary> public QSymbol(IMonomap monomap, Point startPoint, EulerMonomap2D euler) { Euler = euler; Monomap = monomap; StartPoint = startPoint; }