Russian Qt Forum
Октябрь 01, 2024, 10:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Градиент [решено]  (Прочитано 15211 раз)
alexman
Гость
« Ответ #15 : Январь 28, 2012, 11:56 »

ЗЫ kriging 100% подойдет, но хз по скорости.
Давайте я создам новую тему и там Вы расскажете как "крайгить"? (чтобы не мешать все в кучу)
А что непонятно? По произвольному набору точек вычисляем значение для произвольной точки. Здесь есть где оптимизировать:
 1. Алгоритм параллелится. То есть вычисление значений точек друг от друга независимы.
 2. Так как вычислять значения всех точек на каждый чих критично, то можно вычислять некоторую регулярную сетку с шагом, а промежуточные значения можно интерполировать.
Записан
twp
Гость
« Ответ #16 : Январь 28, 2012, 12:51 »

Там я вижу треугольник(и), для него решение широко известно и проблем нет. Как 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 Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Январь 28, 2012, 13:53 »

А что непонятно? По произвольному набору точек вычисляем значение для произвольной точки.
Это можно сказать о любом из 11 (если не ошибаюсь) методов интерполяции начиная с простейшего "взять ближайший". Ладно, понял, отстал  Улыбающийся

а что мешает самому попробывать? В 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
Гость
« Ответ #18 : Январь 28, 2012, 14:51 »

Да хоть LOOP, хоть STRIP. они оба линии рисуют, просто один замыкает другой нет, но внутренность не закрашивают. Поправьте если не так
все верно, внутренность закрашивается установкой цвета glColor перед установкой координаты точки glVertex
В своем предыдущем посте я уже говорил что мне нужен код  (для расчета весов (чисел)), так что даже если GL нарисует - мне это ничего не дает. Поэтому если у Вас есть такая отрисовка под рукой - покажите, а специально на это время тратить не нужно.
Я ответил чисто по теме, готового примера у меня к сожалению нет. И я не совсем понял про расчет весов, из предыдущего поста не совсем очевидно что нужно сделать
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Январь 28, 2012, 16:29 »

И я не совсем понял про расчет весов, из предыдущего поста не совсем очевидно что нужно сделать
Напр считаем цвет точки внутри треугольника

pixel_color = (colo1_1 * 5 + colo1_2 * 6 + color_3 * 6) / (5 + 6 + 7)

Вот эти 5. 6, 7 и есть "веса" которые мне нужно получить. Если они нормализованы (т.е. их сумма = 1), то деление можно не делать. Ну и понятно что можно считать не только цвет, но и все для чего заданы значения в вершинах.
Записан
Disa
Гость
« Ответ #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 Offline

Сообщений: 11445


Просмотр профиля
« Ответ #21 : Январь 28, 2012, 17:23 »

Здесь студенту предлагается самому это написать Улыбающийся Судя по картинке веса вычисляются как
Код
C++ (Qt)
weight[i] = 1.0 / MAX(distance(p, vertex[i]), EPSILON);
 
т.е. вес каждой вершины обратно пропорционален расстоянию до нее. Это не годится по причинам изложенным в ответе #13. Представим себе смежный полигон внизу нарисованного. Тогда малиновый цвет (что есть на нижнем ребре) мгновенно оборвется - ведь смежный полигон не имеет малиновой точки внутри.
Записан
Disa
Гость
« Ответ #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 Offline

Сообщений: 11445


Просмотр профиля
« Ответ #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 Offline

Сообщений: 11445


Просмотр профиля
« Ответ #24 : Январь 30, 2012, 09:44 »

Теперь нужно выбрать соответственное усреднение или интерполяцию (я точно не уверен какой из методов нужно употреблять к данной задачи, но я все же склоняюсь к усреднению).
Осреднение и интерполяция - по существу одно и то же Улыбающийся Bilenear прекрасный метод, но мне ничего не известно как его применить для 5 или более точек (нужны 4). Просто интерполировать - не вопрос, можно взять напр вес = 1 / расстояние_до_вершины (как уже говорилось выше). Но так получаем "швы" на ребрах (см ответы #13 и #21) 
Записан
Disa
Гость
« Ответ #25 : Январь 30, 2012, 10:18 »

Да-да, я уже посмотрел ответ 13, поэтому и предложил билинейную, но забыл, что число точек в ней не более 4х Грустный
Мб многочлены Лагранжа для 2х переменных? Я правда баюсь что будет резкая потеря в производительности для большого числа вершин.

Интерполяция функций двух переменных
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #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
Гость
« Ответ #27 : Февраль 05, 2012, 17:27 »

А не дорого каждый раз просчитывать sin и cos? Я все же попробую сделать с помощью полинома.
Я ,конечно, не очень силен в не классических алгоритмах компьютерной графики, но интуиция подсказывает что должно быть полноценное решение (которое могло бы полностью равномерно закрашывать любой выпуклый многоугольник или хотя бы какой-то (достаточно большой) их класс) Ну в общем нужно делать Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #28 : Февраль 05, 2012, 17:38 »

А не дорого каждый раз просчитывать sin и cos? Я все же попробую сделать с помощью полинома.
Ну так елы-палы, все ж цивильно: cos вычисляется как скалярное произведение, sin как длина векторного произведения. А если с полиномом пошустрее - обсудим (буду рад с единомышленником)
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.092 секунд. Запросов: 23.