Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/34: Рейтинг темы: голосов - 34, средняя оценка - 4.79
1 / 1 / 1
Регистрация: 08.06.2013
Сообщений: 70

Заливка произвольных фигур

09.05.2016, 14:02. Показов 6736. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем здравствуйте.

Возникла проблема с заливкой в OpenGL. Использую C#, WF, Tao.OpenGL.
Есть сетка, на которой строятся сплайны (BSpline), надо залить цветом промежуток между двумя соседними сплайнами. Ничего кроме как по-пиксельной заливки мне не пришло в голову, но, мне кажется, этот вариант не есть самый оптимальный. Может кто подсказать как правильно такое делать или где поискать информацию, или вообще куда копать?

Так же вопрос номер 2: Как залить замкнутый сплайн (BSpline)?

П.С. построение BSpline взято с https://en.wikipedia.org/wiki/B-spline
Приложение: На рисунке два сплайна, надо залить промежуток между ними.
Миниатюры
Заливка произвольных фигур  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.05.2016, 14:02
Ответы с готовыми решениями:

Заливка фигур
Помогите, как залить эту фигуру. Заливает весь фон. uses graphABC; var x0,y0:integer; begin SetWindowSize(800, 800); ...

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

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

7
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
09.05.2016, 17:33
Промотайте до “Рис. 2. 8. Невыпуклый многоугольник”
http://bourabai.kz/graphics/OpenGL/2.htm
GL_POLYGON это Выпуклые многоугольники значит нельзя впадины в текущем заливаемом контуре. Наверно нужно разбить на куски пространство между кривыми и заливать каждый выпуклый кусок через GL_POLYGON.

Если все ломанные от b –spline будут иметь постоянно возрастающие координаты X то можно попробовать брать просто 2 точки на b –spline 2 точки на кривой снизу. Создать цикл в котором окрашивать кусками. А если нет, то нужно продумать алгоритм как разбивать на выпуклые области сложный многоугольник.

Добавлено через 24 минуты
Похоже нужно брать тесселятор.
http://www.songho.ca/opengl/gl_tessellation.html
0
9036 / 2937 / 493
Регистрация: 05.10.2013
Сообщений: 7,960
Записей в блоге: 216
10.05.2016, 00:14
Мне кажется, что самый простой способ заливки (и единственный, который я применял) это использовать алгоритм: https://ru.wikipedia.org/wiki/Заливка

Добавлено через 5 минут
Этот алгоритм ещё применяется не только для заливки, но и в игре Сапёр. Я с ним познакомился, когда делал этот тутор

Там этот алгоритм реализован на языке C#:

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
        // Flood Fill empty elements
        public static void FFuncover(int x, int y, bool[,] visited)
        {
            // Coordinates in Range?
            if (x >= 0 && y >= 0 && x < w && y < h)
            {
                // visited already?
                if (visited[x, y])
                    return;
 
                // uncover element
                elements[x, y].loadTexture(adjacentMines(x, y));
 
                // close to a mine? then no more work needed here
                if (adjacentMines(x, y) > 0)
                    return;
 
                // set visited flag
                visited[x, y] = true;
 
                // recursion
                FFuncover(x - 1, y, visited);
                FFuncover(x + 1, y, visited);
                FFuncover(x, y - 1, visited);
                FFuncover(x, y + 1, visited);
            }
        }
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
10.05.2016, 00:52
Наверно что этот алгоритм намного медленней чем через GL_POLYGON если через CPU делать, считает каждый пиксель. А через GL_POLYGON на видеокарту отправляет только границы какую область закрашивать, а значит намного быстрей. Но возможно этот алгоритм будет быстрей чем через GL_POLYGON если это будет шейдер на спец языке.
0
9036 / 2937 / 493
Регистрация: 05.10.2013
Сообщений: 7,960
Записей в блоге: 216
10.05.2016, 01:21
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Наверно что этот алгоритм намного медленней чем через GL_POLYGON если через CPU делать, считает каждый пиксель. А через GL_POLYGON на видеокарту отправляет только границы какую область закрашивать, а значит намного быстрей. Но возможно этот алгоритм будет быстрей чем через GL_POLYGON если это будет шейдер на спец языке.
Было бы здорово если бы автор темы реализовал бы оба способа, а потом бы написал насколько медленне получится и можно ли с этим мириться. Может не намного медленнее получится или вообще незначительно. Может в скорости реализации алгоритма будет быстрее
0
1 / 1 / 1
Регистрация: 08.06.2013
Сообщений: 70
10.05.2016, 10:22  [ТС]
Проблема в том, что обе этих кривых - сплайны. У них количество разбиений между точками 10 (в данном случае), т.е. между каждой точкой 10 линий!

Конечно, есть возможность (вероятнее всего), сделать так, что бы суммарное количество разбиений на прямой было одинаковым (т.е. что бы сплайн сверху строился, допустим из 1000 прямых и нижний тоже из 1000), тогда можно заливать все обычным GL_POLYGON(там выйдет трапеция, где по Х - будут ее основания).

Так же есть возможность воспользоваться заливкой(рекурсивной по 4 направлениям), предложенной
8Observer8, но это будет долгая вещь, особенно если сплайнов будет куча и границы двух цветов.

А насчет тесселяции, пробовал разобраться, но так и не понял, каким образом там область разбивается на эти треугольники. Там надо определиться как область описанную двумя(одним) сплайнами разбить и в какой последовательности подавать точки. Пока что отложил эту идею на потом.
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
10.05.2016, 15:10
Найдите книгу и диск в инете бесплатно Райт, Липчак - OpenGL Суперкнига.
Там описание тесселяции на русском и пример прога FLORIDA. Стр 500 гдето.
Выглядит как просто задание сложного многоугольника массивом. Значит ваша задачка похоже сведется к все точки от кривых последовательно ввести и все.
0
0 / 0 / 0
Регистрация: 13.05.2016
Сообщений: 14
22.05.2016, 17:14
Рекурсивный обход очень долгий и неэффективный в моем случае. Как минимум из-за того, что точки имеют не константное положение на OpenGLControl:

C#
1
Gl.glVertex2d((Point[i].X - XAreaSize / 2) * Zoom + XOffset - 1, (YAreaSize / 2 - EarthSize + Point[i].Y) * Zoom + YOffset - 1);
Т.е. массив Point's - константен, а вот все остальное - нет.

А с тесселяцией я очень долго мучился, но таки смог запустить на c#, все работает хорошо, вроде бы и достаточно быстро (ну вроде как).

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
 private void MyVertex3dv(System.IntPtr vertexData)
        {
            double[] v = new double[3];
            System.Runtime.InteropServices.Marshal.Copy(vertexData, v, 0, 3);
            Gl.glVertex3dv(v);
        }
 
 private void DrawingFiling(List<PointSpline> FirstPoint, List<PointSpline> SecondPoint)
        {
            int i;
 
            /*Вычисляем суммарое количество точек*/
            int N = FirstPoint.Count + SecondPoint.Count;
 
            /*Создаем массив для тесселяции*/
            double[][] TessPoints = new double[N][];
            /*Заполянем массив для тесселяции*/
            for (i = 0; i < FirstPoint.Count; i++)
            {
                TessPoints[i] = new double[3];
                TessPoints[i][0] = (FirstPoint[i].X - XAreaSize / 2) * Zoom + XOffset - 1;
                TessPoints[i][1] = (YAreaSize / 2 - EarthSize + FirstPoint[i].Y) * Zoom + YOffset - 1;
                TessPoints[i][2] = 0.0;
            }
            for (i = 0; i < SecondPoint.Count; i++)
            {
                TessPoints[i + FirstPoint.Count] = new double[3];
                TessPoints[i + FirstPoint.Count][0] = (SecondPoint[SecondPoint.Count - 1 - i].X - XAreaSize / 2) * Zoom + XOffset - 1;
                TessPoints[i + FirstPoint.Count][1] = (YAreaSize / 2 - EarthSize + SecondPoint[SecondPoint.Count - 1 - i].Y) * Zoom + YOffset - 1;
                TessPoints[i + FirstPoint.Count][2] = 0.0;
            }
 
            Gl.glColor3d(255.0, 255.0, 0.0);
            /*Создаем объект тесселяции*/
            Glu.GLUtesselator pTess = Glu.gluNewTess();
            Glu.gluTessProperty(pTess, Glu.GLU_TESS_BOUNDARY_ONLY, Gl.GL_FALSE);
            /*Начало отрисовки*/
            Glu.gluTessCallback(pTess, Glu.GLU_TESS_BEGIN, new Glu.TessBeginCallback(Gl.glBegin));
            /*Конец отрисовки*/
            Glu.gluTessCallback(pTess, Glu.GLU_TESS_END, new Glu.TessEndCallback(Gl.glEnd));
            /*Передача координат*/
            Glu.gluTessCallback(pTess, Glu.GLU_TESS_VERTEX, new Glu.TessVertexCallback(MyVertex3dv));
 
 
            /*Начинаем тесселяцию*/
            Glu.gluTessBeginPolygon(pTess, IntPtr.Zero);
            /*Начинаем описание кривого полигона*/
            Glu.gluTessBeginContour(pTess);
 
            /*Заносим наши точки*/
            for (i = 0; i < N; i++)
                Glu.gluTessVertex(pTess, TessPoints[i],TessPoints[i]);
 
            /*Конец описания кривого полигона*/
            Glu.gluTessEndContour(pTess);
            /*Конец тесселяции*/
            Glu.gluTessEndPolygon(pTess);
 
            /*Удаляем тесселятор*/
            Glu.gluDeleteTess(pTess);
        }
Миниатюры
Заливка произвольных фигур  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.05.2016, 17:14
Помогаю со студенческими работами здесь

Рандомная заливка фигур
Хочу залить каждый ректангл разной кистью, но в итоге все получаются одинаковой заливки. Что не так? for (int i = 0; i &lt;...

Текстурная заливка фигур в Graphics
Можно ли при рисовании прямоугольника(или любой другой фигуры) с помощью Graphics, залить её не просто каким-то цветом, а текстурой?

Заливка фигур из файла BMP
Помогите пожалуйста, я новичок. Есть bmp файл с неизвестной фигурой, её надо залить другим цветом. Как это реализовать?

Создание произвольных фигур и подсчет матрицы
Кодеры помогите. Есть 2 задачи, надо их сделать. Делфи у нас небыло уже около полугода за этот срок все подзабыл. №2 Так...

Заполнение произвольных плоских фигур треугольниками
Здравствуйте! В программировании и в мире алгоритмов новичок, поэтому не судите строго. Есть ли какая-нибудь методика, где разбирается...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru