Заливка области, ограниченной некоторыми линиями - C#

Узнай цену своей работы

Формулировка задачи:

Привет, помогите новичку... Никак не пойму как сделать заливку на рисунке. Нужно закрасить определенным цветом область внутри прямоугольника (определяется четырьмя точками, а потом DrawLine'ом проводятся линии), но вне эпициклоиды (определяется как односвязный список List, все точки соединены опять же DrawLine'ами).

Решение задачи: «Заливка области, ограниченной некоторыми линиями»

textual
Листинг программы
 public class LowLevelImageHandler : IDisposable //класс для низкоуровневой обработки изображений
    {
        private Bitmap img; //рисунок
        private BitmapData bmpData; //объект BitmapData, нужный для блокировки изображения в памяти
        private int byteLen = 4;
        private byte[] bitmapBuffer; //буфер, с которым работаем
        private Rectangle imageRect;
        public int ImageWidth{ get{return img.Width;} }
        public int ImageHeigth{ get{return img.Height;} }
        public Rectangle ImageRectangle { get { return imageRect; } }
        public LowLevelImageHandler(Bitmap img) { this.img = img; imageRect = new Rectangle(0, 0, img.Width, img.Height); }
 
        /// <summary>
        /// Блокирует изображение в памяти и копирует байты, из которых оно состоит, в массив
        /// </summary>
        public void LockImage()
        {
            bmpData = img.LockBits(new Rectangle(0, 0, img.Width, img.Height), ImageLockMode.ReadWrite, img.PixelFormat);
            bitmapBuffer = new byte[bmpData.Stride * bmpData.Height];
            Marshal.Copy(bmpData.Scan0, bitmapBuffer, 0, bitmapBuffer.Length);
            byteLen = bmpData.Stride / bmpData.Width;
        }
 
        /// <summary>
        /// Блокирует изображение в памяти и копирует байты, из которых оно состоит, в массив
        /// </summary>
        public bool ContainsPoint(Point pnt)
        {
            return imageRect.Contains(pnt);
        }
 
        /// <summary>
        /// Получает цвет пикселя с заблокированного в памяти изображения.
        /// </summary>
        /// <param name="location">Координаты запрашиваемого пикселя</param>
        public Color GetLockedPixel(Point location)
        {
            Color col;
            try
            {
                int index = bmpData.Stride * location.Y + location.X * byteLen;
                col = Color.FromArgb(bitmapBuffer[index + 2], bitmapBuffer[index + 1], bitmapBuffer[index + 0]);
            }
            catch (IndexOutOfRangeException) { throw new ArgumentException("Запрашеваемый находится за границами рисунка"); }
            catch (NullReferenceException) { throw new ArgumentException("В памяти не заблокировано изображение"); }
            return col;
        }
        /// <summary>
        /// Получает цвет пикселя с заблокированного в памяти изображения.
        /// </summary>
        /// <param name="x">Координата x запрашиваемого пикселя</param>
        /// <param name="y">Координата y запрашиваемого пикселя</param>
        public Color GetLockedPixel(int x, int y)
        {
            return GetLockedPixel(new Point(x, y));
        }
 
        /// <summary>
        /// Задает цвет пикселя заблокированного в памяти изображения.
        /// </summary>
        /// <param name="x">Координаты задаваемого пикселя</param>
        public void SetLockedPixel(Point location, Color col)
        {
            try
            {
                int index = bmpData.Stride * location.Y + location.X * byteLen;
                bitmapBuffer[index + 2] = col.R;
                bitmapBuffer[index + 1] = col.G;
                bitmapBuffer[index + 0] = col.B;
            }
            catch (IndexOutOfRangeException) { throw new ArgumentException("Запрашеваемый находится за границами рисунка"); }
            catch (NullReferenceException) { throw new ArgumentException("В памяти не заблокировано изображение"); }
        }
 
        /// <summary>
        /// Задает цвет пикселя заблокированного в памяти изображения.
        /// </summary>
        /// <param name="x">Координата x задаваемого пикселя</param>
        /// <param name="y">Координата y задаваемого пикселя</param>
        public void SetLockedPixel(int x, int y, Color col)
        {
            SetLockedPixel(new Point(x, y), col);
        }
 
        /// <summary>
        /// Сохраняет изменения и разблокирует изображение.
        /// </summary>
        public void SaveAndUnlock()
        {
            try
            {
                Marshal.Copy(bitmapBuffer, 0, bmpData.Scan0, bitmapBuffer.Length);
                img.UnlockBits(bmpData);
            }
            catch (NullReferenceException) { throw new InvalidOperationException("Изображение не заблокированно в памяти"); }
            catch (ArgumentException) { throw new InvalidOperationException("Изображение не заблокированно в памяти"); }
        }
 
        /// <summary>
        ///  Разблокирует изображение без сохранения изменений.
        /// </summary>
        public void UnlockWInthoutSaving()
        {
            try
            {
                img.UnlockBits(bmpData);
            }
            catch (NullReferenceException) { throw new InvalidOperationException("Изображение не заблокированно в памяти"); }
            catch (ArgumentException) { throw new InvalidOperationException("Изображение не заблокированно в памяти"); }
        }
 
        #region Члены IDisposable
        void IDisposable.Dispose()
        {
            try { UnlockWInthoutSaving(); }
            catch { }
        }
 
        #endregion
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.1 из 5
Похожие ответы