Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/29: Рейтинг темы: голосов - 29, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 23.02.2016
Сообщений: 2

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

23.02.2016, 03:46. Показов 6126. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет, помогите новичку... Никак не пойму как сделать заливку на рисунке. Нужно закрасить определенным цветом область внутри прямоугольника (определяется четырьмя точками, а потом DrawLine'ом проводятся линии), но вне эпициклоиды (определяется как односвязный список List, все точки соединены опять же DrawLine'ами).
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.02.2016, 03:46
Ответы с готовыми решениями:

Заливка области
У меня на форме рисуется прямоугольник мышью. Так вот хотелось бы узнать как сделать, чтобы во время движения мыши я видел пунктирную...

Заливка области, ограниченной линиями
Создаю редактор-блок схем. В нем учел возможность создания пользовательского блока: вылетает диалог с таблицей из 4 столбцов(1 и 2 столбы -...

Заливка ограниченной области с затравкой
Здравствуйте, с у меня замечательно работает программа с одним цветом, все прекрасно. Заливает фигуры так, как надо. Но как только я меняю...

3
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
23.02.2016, 08:06
mich082, если я правильно понял задачу, то можно просто использовать рекурсивную заливку. Вот пример, как ее можно сделать:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
 class Drawer
    {
        /// <summary>
        /// Выполняется заливку одноцветных областей
        /// </summary>
        /// <param name="img">Изображение, на котором будет выполнена заливка</param>
        /// <param name="col">Цвет заливки</param>
        /// <param name="startpoint">Изначальная точка, из которой происходит заливка</param>
            public static void Fill(Bitmap img, Color col, Point startpoint)
        {
            using (LowLevelImageHandler llih = new LowLevelImageHandler(img))
            {
                llih.LockImage();
                var oldcolor = llih.GetLockedPixel(startpoint);
                if (oldcolor.ToArgb() == col.ToArgb()) { return; }
                LinkedList<Point> check = new LinkedList<Point>();
                check.AddLast(startpoint);
                while (check.Count > 0)
                {
                    Point cur = check.First.Value;
                    check.RemoveFirst();
                    foreach (Point off in pattern)
                    {
                        Point next = new Point(cur.X + off.X, cur.Y + off.Y);
                        if (llih.ContainsPoint(next))
                        {
                            if (llih.GetLockedPixel(next).ToArgb() == oldcolor.ToArgb())
                            {
                                check.AddLast(next);
                                llih.SetLockedPixel(next, col);
                            }
                        }
                    }
                }
                llih.SaveAndUnlock();
            }
        }
 
        private static Point[] pattern = new Point[] {
                new Point(0, -1), new Point(0, 1), 
                new Point(-1, 0), new Point(1, 0)};
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
 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
    }
4
0 / 0 / 0
Регистрация: 23.02.2016
Сообщений: 2
24.02.2016, 22:29  [ТС]
А я смогу применить этот способ для изображения в PictureBox'е?
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
25.02.2016, 02:45
mich082, там же все видно-для любого объекта класса Bitmap.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.02.2016, 02:45
Помогаю со студенческими работами здесь

Найти площадь области,ограниченной линиями

Найти площадь области, ограниченной линиями
Можете посмотреть теперь другую задачу: Мне опять нужно начало решения,чтобы решить задачу. &quot;Найти площадь области,ограниченной...

Найти площадь области, ограниченной линиями
Найти площадь области, ограниченной линиями: {({x}^{2}+\frac{{y}^{2}}{9})}^{2}={x}^{2}+{y}^{2}

Вычислить площадь области, ограниченной линиями
Добрый вечер! Пожалуйста помогите найти решение задачи: Вычислить площадь области, ограниченной линиями:y=2-{x}^{2}; y=x; y=-x.

Найти площадь области, ограниченной линиями
Найти площадь области D, ограниченной линиями D: (x^2)+(y^2)-4x=0, (x^2)+(Y^2)-4y=0, y=0.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru