Example #1
0
        /// <summary>
        /// Добавляет несколько несколько ячеек в ответ начиная с первой
        /// </summary>
        /// <param name="image">Ссылка ни изображение</param>
        /// <param name="CellsCount">Количество ячеек для добавления в ответ</param>
        /// <param name="FirstCellDistanses">Коллекция дистанций между первой ячейкой и маркерами</param>
        /// <param name="intercentresdistX">Расстояние между центрами ячеек</param>
        /// <param name="Width">Длина ячеек</param>
        /// <param name="Height">Высота ячеек</param>
        public void IntelligentAdd(Bitmap image, int CellsCount, Distances FirstCellDistanses, int intercentresdistX, int Width, int Height)
        {
            int maxslice = intercentresdistX/2;

            //находим первую доступную дистанцию
            Distance d = FirstCellDistanses.FindOneGood();
            int maxWidth = Width +  Convert.ToInt16(Width/2);
            int maxHeigth = Height + Convert.ToInt16(Height/2);
            //увеличиваем ячейки

            this.Add(image,CellsCount,FirstCellDistanses,intercentresdistX,maxWidth,maxHeigth);

            BitmapData data = image.LockBits(_cells[0].Rect, ImageLockMode.ReadWrite, image.PixelFormat);
            BlobCounter blobCounter = new BlobCounter();

            Invert invertfilter = new Invert();
            invertfilter.ApplyInPlace(data);
            blobCounter.ProcessImage(data);

            Blob[] blobs = blobCounter.GetObjectsInformation();
            if (blobs.Length != 0)
            {
                int maxar = 0;
                int b = 0;
                for (int i = 0; i < blobs.Count(); i++)
                {
                    if (blobs[i].Area > maxar) { maxar = blobs[i].Area; b = i; }
                }
                invertfilter.ApplyInPlace(data);

                System.Drawing.Point p = new System.Drawing.Point(_cells[0].CenterOfGravity.X - ((maxWidth / 2) - Convert.ToInt16(blobs[b].CenterOfGravity.X)), _cells[0].CenterOfGravity.Y - ((maxHeigth / 2) - Convert.ToInt16(blobs[b].CenterOfGravity.Y)));
                if (Math.Abs(_cells[0].CenterOfGravity.Y - p.Y) <= maxslice) { this.ReMeasure(p, intercentresdistX, Width, Height); }
                else { this.ReMeasure(_cells[0].CenterOfGravity, intercentresdistX, Width, Height); }
            }
            image.UnlockBits(data);
        }
Example #2
0
        /// <summary>
        /// Изменяет положение и размер ячейки
        /// </summary>
        /// <param name="FirstCellDistanses">Коллекция дистнаций до ячейки</param>
        /// <param name="intercentresdistX">Расстояние между центрами ячеек</param>
        /// <param name="Width">Длина ячейки</param>
        /// <param name="Height">Высота ячейки</param>
        public void ReMeasure(Distances FirstCellDistanses, int intercentresdistX, int Width, int Height)
        {
            //делаем первую ячейку
             Distance d= FirstCellDistanses.FindOneGood();
             Rectangle rect = new Rectangle(_cells[0].Rect.X, _cells[0].Rect.Y, Width, Height);
             _cells[0].Rect = rect;
             _cells[0].CenterOfGravity = d.GetsCenterOfGravity;

            //делаем остальные ячейки
            for (int i = 1; i <Count; i++)
            {
                Point p = new Point(_cells[i - 1].CenterOfGravity.X + intercentresdistX, _cells[i - 1].CenterOfGravity.Y);
                rect = new Rectangle(_cells[i].Rect.X, _cells[i].Rect.Y, Width, Height);
                _cells[i].Rect = rect;
                _cells[i].CenterOfGravity = p;

            }
        }
Example #3
0
 /// <summary>
 /// Добавляет несколько ячеек в коллекцию ячеек
 /// </summary>
 /// <param name="image">Ссылка на изображение</param>
 /// <param name="CellsCount">Число ячеек для добавления</param>
 /// <param name="FirstCellDistanses">Коллекция дистанций до первой ячейки коллекции</param>
 /// <param name="intercentresdistX">Расстояние в пикселях между сентрами ячеек</param>
 /// <param name="Width">Ширина ячеек</param>
 /// <param name="Height">Высота ячеек</param>
 /// <exception cref="Exception">Количество ячеек должно быть больше нуля</exception>
 public void Add(Bitmap image, int CellsCount, Distances FirstCellDistanses,int intercentresdistX, int Width, int Height)
 {
     if (CellsCount > 0)
     {
     //находим первую доступную дистанцию
        Distance d= FirstCellDistanses.FindOneGood();
     //делаем первую ячейку
        Cell c1 = new Cell(image, d.GetsCenterOfGravity, Width, Height);
        this.Add(c1);
     //делаем остальные ячейки
     for (int i = 1; i < CellsCount; i++)
     {
         Point p=new Point(_cells[i-1].CenterOfGravity.X+intercentresdistX,_cells[i-1].CenterOfGravity.Y);
         Cell c = new Cell(image, p, Width, Height);
         this.Add(c);
     }
     }
     else { throw new Exception("Количество ячеек доблжно быть больше нуля"); }
 }