using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ProjectAirbus.Drawnings; using ProjectAirbus.MovementStrategy; namespace ProjectAirbus.Generics { internal class AirbusGenericCollection where T : DrawningAirbus where U : IMoveableObject { private readonly int _pictureWidth; private readonly int _pictureHeight; // Размер занимаемого места private readonly int _placeSizeWidth = 89; private readonly int _placeSizeHeight = 34; // коллекция private readonly SetGeneric _collection; public AirbusGenericCollection(int picWidth, int picHeight) { int width = picWidth / _placeSizeWidth; int height = picHeight / _placeSizeHeight; _pictureWidth = picWidth; _pictureHeight = picHeight; _collection = new SetGeneric(width * height); } public static int operator +(AirbusGenericCollection collect, T? obj) { if (obj != null) { return collect._collection.Insert(obj); } return -1; } public static bool operator -(AirbusGenericCollection collect, int pos) { if (collect._collection.Get(pos) == null) { return false; } return collect?._collection.Remove(pos) ?? false; } // получение объекта IMoveableObjecr public U? GetU(int pos) { return (U?)_collection.Get(pos)?.GetMoveableObject; } // вывод всего набора public Bitmap ShowAirbus() { Bitmap bmp = new(_pictureWidth, _pictureHeight); Graphics gr = Graphics.FromImage(bmp); DrawBackground(gr); DrawObjects(gr); return bmp; } // прорисовка фона private void DrawBackground(Graphics gr) { Pen pen = new(Color.Black, 3); for (int i = 0; i < _pictureWidth / _placeSizeWidth; ++i) { for (int j = 0; j < _pictureHeight / _placeSizeHeight + 1; ++j) { // линия разметки gr.DrawLine(pen, i * _placeSizeWidth, j * _placeSizeHeight, i * _placeSizeWidth + _placeSizeWidth / 2, j * _placeSizeHeight); gr.DrawLine(pen, i * _placeSizeWidth, 0, i * _placeSizeWidth, _pictureHeight / _placeSizeHeight * _placeSizeHeight); } } } // прорисовка объекта private void DrawObjects(Graphics g) { // координаты int x = 0; int y = 0; for (int i = 0; i <= _collection.Count; ++i) { DrawningAirbus _airbus = _collection.Get(i); if (_airbus == null) { ++x; if (x >= _pictureWidth / _placeSizeWidth) { x = 0; ++y; } continue; } _airbus.SetPosition(_placeSizeWidth * x, _placeSizeHeight * y); _airbus.DrawTransport(g); ++x; // новая строка if (x >= _pictureWidth / _placeSizeWidth) { x = 0; ++y; } } } } }