Заливка области, ограниченной некоторыми линиями - 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
}