Заливка области, ограниченной некоторыми линиями - 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 }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д