Russian Qt Forum
Ноябрь 23, 2024, 22:13
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
2D и 3D графика
>
Градиент [решено]
Страниц:
1
[
2
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Градиент [решено] (Прочитано 15368 раз)
alexman
Гость
Re: Градиент
«
Ответ #15 :
Январь 28, 2012, 11:56 »
Цитата: Igors от Январь 28, 2012, 11:43
Цитата: alexman от Январь 27, 2012, 22:53
ЗЫ kriging 100% подойдет, но хз по скорости.
Давайте я создам новую тему и там Вы расскажете как "крайгить"? (чтобы не мешать все в кучу)
А что непонятно? По произвольному набору точек вычисляем значение для произвольной точки. Здесь есть где оптимизировать:
1. Алгоритм параллелится. То есть вычисление значений точек друг от друга независимы.
2. Так как вычислять значения всех точек на каждый чих критично, то можно вычислять некоторую регулярную сетку с шагом, а промежуточные значения можно интерполировать.
Записан
twp
Гость
Re: Градиент
«
Ответ #16 :
Январь 28, 2012, 12:51 »
Цитата: Igors от Январь 28, 2012, 11:43
Там я вижу треугольник(и), для него решение широко известно и проблем нет. Как OpenGL закрашивает N-угольник не знаю, интересно посмотреть. В любом случае мне нужно это в виде текста/кода, а не просто выходная картинка.
а что мешает самому попробывать? В Qt есть отличная поддержка OpenGL и не нужно мучаться с GLUT или чем либо еще.
На счет того что в примере треугольники. В описании glShadeModel(GL_SMOOTH), которая собственно делает интерполяцию цвета, никаких ограничений на это нет. Я там ошибся, нужно использовать GL_LINE_LOOP вместо GL_LINE_STRIP. glBegin(GL_LINE_LOOP) рисует по точкам при этом последнюю точку замыкает с первой. Можно еще использовать GL_POLYGON вместо GL_LINE_LOOP. Что еще надо?
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Градиент
«
Ответ #17 :
Январь 28, 2012, 13:53 »
Цитата: alexman от Январь 28, 2012, 11:56
А что непонятно? По произвольному набору точек вычисляем значение для произвольной точки.
Это можно сказать о любом из 11 (если не ошибаюсь) методов интерполяции начиная с простейшего "взять ближайший". Ладно, понял, отстал
Цитата: twp от Январь 28, 2012, 12:51
а что мешает самому попробывать? В Qt есть отличная поддержка OpenGL и не нужно мучаться с GLUT или чем либо еще.
На счет того что в примере треугольники. В описании glShadeModel(GL_SMOOTH), которая собственно делает интерполяцию цвета, никаких ограничений на это нет. Я там ошибся, нужно использовать GL_LINE_LOOP вместо GL_LINE_STRIP. glBegin(GL_LINE_LOOP) рисует по точкам при этом последнюю точку замыкает с первой. Можно еще использовать GL_POLYGON вместо GL_LINE_LOOP. Что еще надо?
Да хоть LOOP, хоть STRIP. они оба линии рисуют, просто один замыкает другой нет, но внутренность не закрашивают. Поправьте если не так
В своем предыдущем посте я уже говорил что мне нужен код (для расчета весов (чисел)), так что даже если GL нарисует - мне это ничего не дает. Поэтому если у Вас есть такая отрисовка под рукой - покажите, а специально на это время тратить не нужно.
Записан
twp
Гость
Re: Градиент
«
Ответ #18 :
Январь 28, 2012, 14:51 »
Цитата: Igors от Январь 28, 2012, 13:53
Да хоть LOOP, хоть STRIP. они оба линии рисуют, просто один замыкает другой нет, но внутренность не закрашивают. Поправьте если не так
все верно, внутренность закрашивается установкой цвета glColor перед установкой координаты точки glVertex
Цитата: Igors от Январь 28, 2012, 13:53
В своем предыдущем посте я уже говорил что мне нужен код (для расчета весов (чисел)), так что даже если GL нарисует - мне это ничего не дает. Поэтому если у Вас есть такая отрисовка под рукой - покажите, а специально на это время тратить не нужно.
Я ответил чисто по теме, готового примера у меня к сожалению нет. И я не совсем понял про расчет весов, из предыдущего поста не совсем очевидно что нужно сделать
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Градиент
«
Ответ #19 :
Январь 28, 2012, 16:29 »
Цитата: twp от Январь 28, 2012, 14:51
И я не совсем понял про расчет весов, из предыдущего поста не совсем очевидно что нужно сделать
Напр считаем цвет точки внутри треугольника
pixel_color = (colo1_1 * 5 + colo1_2 * 6 + color_3 * 6) / (5 + 6 + 7)
Вот эти 5. 6, 7 и есть "веса" которые мне нужно получить. Если они нормализованы (т.е. их сумма = 1), то деление можно не делать. Ну и понятно что можно считать не только цвет, но и все для чего заданы значения в вершинах.
Записан
Disa
Гость
Re: Градиент
«
Ответ #20 :
Январь 28, 2012, 16:54 »
http://sophia.javeriana.edu.co/~ochavarr/computer_graphics_2010_2/smoothPolygon/
Цитировать
The combination of colors can be calculated as a weighted average as a function of distance. You have to determine what exact function should be used, noting that:
Each pixel has a coordinate position (x, y)
The final color on a pixel is the sum of several vertex color contributions
The fartest a vertex is, the less its color contribution is
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Градиент
«
Ответ #21 :
Январь 28, 2012, 17:23 »
Цитата: Disa от Январь 28, 2012, 16:54
http://sophia.javeriana.edu.co/~ochavarr/computer_graphics_2010_2/smoothPolygon/
Здесь студенту предлагается самому это написать
Судя по картинке веса вычисляются как
Код
C++ (Qt)
weight
[
i
]
=
1.0
/
MAX
(
distance
(
p
,
vertex
[
i
]
)
,
EPSILON
)
;
т.е. вес каждой вершины обратно пропорционален расстоянию до нее. Это не годится по причинам изложенным в ответе #13. Представим себе смежный полигон внизу нарисованного. Тогда малиновый цвет (что есть на нижнем ребре) мгновенно оборвется - ведь смежный полигон не имеет малиновой точки внутри.
Записан
Disa
Гость
Re: Градиент
«
Ответ #22 :
Январь 29, 2012, 23:32 »
Окей, блин, былоб больше времени - яб попробовал закодить :-/
Ну в любом случае ясно что цвет точки внутри это либо:
а) f(colorRGB[n], width[n] (or x, y), n); - в случае когда вершины
"сами"
являются источником цвета
б) f(colorRGB[n], width[n] (or x, y), normal[n], n); - в случае внешнего источника.
Теперь нужно выбрать соответственное усреднение или интерполяцию (я точно не уверен какой из методов нужно употреблять к данной задачи, но я все же склоняюсь к усреднению).
В случае усреднения можно взять
Колмогоровское среднее
и поиграться со степенью функции.
Если же брать интерполяцию, то требуется построить функция color(x0, y0) = f(x, y) для всех x, y лежащих внутри нашего многоугольника, по значениям color(x, y) вершин (то есть это некая гладкая функция в 3х мерном пространстве). Взять например:
Билинейную интерполяцию
Извиняюсь, что не могу помочь кодом, а только идеями :-/
PS: OpenGL умеет закрашивать только выпуклые многоугольники (в случае неправильных как раз и нужна треангуляция), откуда можно предположить что это сделанно для правильного подсчета расстояния.
PSPS: Вообще задача интересная конечно)
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Градиент
«
Ответ #23 :
Январь 30, 2012, 09:32 »
Ладно, давайте уже с OpenGL выясним. Да, он может закрашивать многоугольники (GL_POLYGON), но делает это простейшей триангуляцией (аттач). Вот источник
http://www.codeproject.com/Articles/23991/OpenGL-Geometric-Primitives#Sample59
. Даже 4-x угольник (GL_QUAD) он закрашивает как 2 треугольника. Прут "ребра", это не то что хотелось
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Градиент
«
Ответ #24 :
Январь 30, 2012, 09:44 »
Цитата: Disa от Январь 29, 2012, 23:32
Теперь нужно выбрать соответственное усреднение или интерполяцию (я точно не уверен какой из методов нужно употреблять к данной задачи, но я все же склоняюсь к усреднению).
Осреднение и интерполяция - по существу одно и то же
Bilenear прекрасный метод, но мне ничего не известно как его применить для 5 или более точек (нужны 4). Просто интерполировать - не вопрос, можно взять напр вес = 1 / расстояние_до_вершины (как уже говорилось выше). Но так получаем "швы" на ребрах (см ответы #13 и #21)
Записан
Disa
Гость
Re: Градиент
«
Ответ #25 :
Январь 30, 2012, 10:18 »
Да-да, я уже посмотрел ответ 13, поэтому и предложил билинейную, но забыл, что число точек в ней не более 4х
Мб многочлены
Лагранжа для 2х переменных
? Я правда баюсь что будет резкая потеря в производительности для большого числа вершин.
Интерполяция функций двух переменных
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Градиент
«
Ответ #26 :
Февраль 04, 2012, 12:21 »
В общем есть это в теории, формула достаточно простая
weight[ i ] = (cot(A) + cot(B)) / (d * d)
где
weight - вес i-й вершины
cot - котангенс ф-ция
d - расстояние от интерполируемой точки до i-й вершины
A, B - углы образованные 2 векторами: первый вершина - интерполируемая точка, второй вершина - прилегающая вершина
Однако хлопот немало. Во-первых нужно тщательно проверять на epsilon. Во-вторых я не смог найти а что же делать если котангенс получается отрицательный. Вообще получается что чем "острее" внутренний угол, тем мощнее его влияние, и наоборот. Когда угол приближается к 180 - результат выглядит неестественно.
В общем, подтверждается старая истина: N-угольник - урод, и рендерить его напрямую - себе дороже
Записан
Disa
Гость
Re: Градиент [решено]
«
Ответ #27 :
Февраль 05, 2012, 17:27 »
А не дорого каждый раз просчитывать sin и cos? Я все же попробую сделать с помощью полинома.
Я ,конечно, не очень силен в не классических алгоритмах компьютерной графики, но интуиция подсказывает что должно быть полноценное решение (которое могло бы полностью равномерно закрашывать любой выпуклый многоугольник или хотя бы какой-то (достаточно большой) их класс) Ну в общем нужно делать
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Градиент [решено]
«
Ответ #28 :
Февраль 05, 2012, 17:38 »
Цитата: Disa от Февраль 05, 2012, 17:27
А не дорого каждый раз просчитывать sin и cos? Я все же попробую сделать с помощью полинома.
Ну так елы-палы, все ж цивильно: cos вычисляется как скалярное произведение, sin как длина векторного произведения. А если с полиномом пошустрее - обсудим (буду рад с единомышленником)
Записан
Страниц:
1
[
2
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...