using Liner.MovingStrategies; using Liner.Drawing; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Liner.Generics { /// /// Параметризованный класс для набора объектов DrawningCar /// /// /// public class LinerGenericCollection where T : DrawingLiner where U : IMoveableObject { /// /// Ширина окна прорисовки /// private readonly int _pictureWidth; /// /// Высота окна прорисовки /// private readonly int _pictureHeight; /// /// Размер занимаемого объектом места (ширина) /// private readonly int _placeSizeWidth = 100; /// /// Размер занимаемого объектом места (высота) /// private readonly int _placeSizeHeight = 80; /// /// Набор объектов /// private readonly SetGeneric _collection; /// /// Конструктор /// /// /// public LinerGenericCollection(int picWidth, int picHeight) { int width = picWidth / _placeSizeWidth; int height = picHeight / _placeSizeHeight; _pictureWidth = picWidth; _pictureHeight = picHeight; _collection = new SetGeneric(width * height); } /// /// Получение объектов коллекции /// public IEnumerable GetLiners => _collection.GetLiners(); /// Перегрузка оператора сложения /// /// /// /// public static int? operator +(LinerGenericCollection collect, T? obj) { if (obj == null) { return -1; } return collect?._collection.Insert(obj); } /// /// Перегрузка оператора вычитания /// /// /// /// public static bool operator -(LinerGenericCollection collect, int pos) { if (collect._collection[pos] != null) { collect._collection.Remove(pos); return true; } return false; } /// /// Получение объекта IMoveableObject /// /// /// public U? GetU(int pos) { return (U?)_collection[pos]?.GetMoveableObject; } /// /// Вывод всего набора объектов /// /// public Bitmap ShowLiners() { Bitmap bmp = new(_pictureWidth, _pictureHeight); Graphics gr = Graphics.FromImage(bmp); DrawBackground(gr); DrawObjects(gr); return bmp; } /// /// Метод отрисовки фона /// /// private void DrawBackground(Graphics g) { Pen pen = new(Color.Black, 3); for (int i = 0; i < _pictureWidth / _placeSizeWidth; i++) { for(int j = 0; j < _pictureHeight / _placeSizeHeight; j++) { g.DrawRectangle(pen, i * _placeSizeWidth, j * _placeSizeHeight, _placeSizeWidth, _placeSizeHeight); } } } /// /// Метод прорисовки объектов /// /// private void DrawObjects(Graphics g) { int iX = ((_pictureWidth / _placeSizeWidth) - 1) * _placeSizeWidth; int iY = 0; foreach (var liner in _collection.GetLiners()) { liner?.SetPosition(iX, iY); liner?.DrawTransport(g); iX -= _placeSizeWidth; if (iX < 0) { iX = ((_pictureWidth / _placeSizeWidth) - 1) * _placeSizeWidth; iY += _placeSizeHeight; } } } } }