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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сглаживание фигур из большого количества точек (Antialiasing many points  (Прочитано 7157 раз)
vintik
Гость
« : Июль 21, 2011, 23:30 »

Доброго времени суток, товарищи!
Помогите, кто чем может!))
Задача: построить замкнутый контур по большому числу точек (примерно 200).
Казалось бы,  берём QPolygonF, вставляем в него точки, передаём его в QGraphicsPolygonItem и добавляем на сцену.
Отлично работает.
НО!!!
При включённом сглаживании в конструкторе QGraphicsView:
setRenderHint(QPainter::Antialiasing,true);
И последующих попытках трансформации вида: большой zoom => rotate или scale - программа жутко тормозит.
Была мысль включить аппаратное ускорение в конструкторе QGraphicsView
setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers),this))
однако, похоже не все видеокарты поддерживают SampleBuffers (http://www.prog.org.ru/topic_18612_0.html)
Т.е. это не выход

Наверняка есть какой-то финт ушами, чтобы порешать проблему... подскажите направление!

Если что, Qt 4.7.3, ось linux (gentoo(видяха Intel GM965/GL960 Integrated Graphics Controller, драйвер Intel) или opensuse(видяха какая-то radeon, драйвер nouveau))
Записан
Sancho_s_rancho
Гость
« Ответ #1 : Июль 22, 2011, 08:54 »

GraphicsView  конечно большой тормоз, но чтоб на полигоне из 200 точек...
Волшебных флагов для QGraphicsView не существует.
Я бы пошел по пути реализации собственного Itema. Где бы все отрисовывал и сглаживал в пределах моих требований.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #2 : Июль 22, 2011, 12:01 »

либо представить это как QImage ... работать будет быстрее однозначно
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Июль 22, 2011, 14:01 »

Задача: построить замкнутый контур по большому числу точек (примерно 200).
Казалось бы,  берём QPolygonF, вставляем в него точки, передаём его в QGraphicsPolygonItem и добавляем на сцену.
Отлично работает.
Отлично если исходные точки уже упорядочены и образуют корректный замкнутый контур. А если точки следуют в произвольном порядке - получается полигон с взаимо-пересечениями который может работать "совсем не отлично"
Записан
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #4 : Июль 22, 2011, 17:01 »

либо представить это как QImage ... работать будет быстрее однозначно
И как делать zoom? Прям картинку увеличивать? Тогда качество будет никакое.
Записан
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #5 : Июль 22, 2011, 17:17 »

А вообще мне тоже интересен этот вопрос, т.к. скорость отрисовки с antialiasing без OpenGL не очень впечатляет. А с OpenGL хоть и быстро, но сглаживание не всегда работает и хуже по качеству получается.

Вот пример по быстрому накидал. Без OpenGL сильно тормозит даже на Core2Duo 3GHz с NVIDIA 9800GTX+. Как можно ускорить отрисовку?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #6 : Июль 22, 2011, 19:50 »

corei5 2.4GHz, GeForce GT 330M / встроенная Intel HD Graphics (не знаю какая из них работает для приложения), Mac OS X 10.6.8 - абсолютно никаких тормозов. критическая загрузка процессора - 25%, оперативки - 16 Мб (с опенгл - 40 Мб). что я делаю не так?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
vintik
Гость
« Ответ #7 : Июль 22, 2011, 23:33 »

Отлично если исходные точки уже упорядочены и образуют корректный замкнутый контур. А если точки следуют в произвольном порядке - получается полигон с взаимо-пересечениями который может работать "совсем не отлично"
Не, контур как раз замкнутый и без пересечений.
Вот, кстати, kamre набросал пример, там вполне такие неплохие контуры... При включённом сглаживании и зуме тормозит.

На работе удалось завести сглаживание под opengl - драйвер к nvidia под винду справился.
Работает странно: при большом зуме чёрный контур закрашенного серым полигона пропадает... но сглаживание - да, есть.
Работает шустро, но вот с таким фокусом... пока opengl для меня не решение...

Волшебных флагов для QGraphicsView не существует.
Я бы пошел по пути реализации собственного Itema. Где бы все отрисовывал и сглаживал в пределах моих требований.
Но вот с чего начать такой item?
Предположим, что контур нужно закрашивать. Тогда в переопределённом методе paint нужно видимо использовать QPainterPath.
Допустим нарисовали, залили. Как переопределить boundingRect? Если тупо возвращать весь охватывающий полигон прямоугольник - ничего не меняется...
Может нужно как-то по хитрому возвращать область для перерисовки?
Или вообще в другом направлении мысль нужно развивать?
Записан
vintik
Гость
« Ответ #8 : Июль 23, 2011, 00:46 »

В архиве наитупейший пример, рисуется большой полигон.
Со сглаживанием на большом зуме при перетаскивании и вращении - задумывается
(вращение левая кнопка мыши + скролл)
Стоит отключить сглаживание - летает

А кто-нить вот эту весчь знает как использовать? QPainterPath::toFillPolygons
Это может быть решением?
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #9 : Июль 24, 2011, 18:41 »

В Qt под windows у растрового движка вообще проблема со сглаживанием длинных кривых. Смотрите, например, тут http://www.prog.org.ru/topic_11954_0.html.
Записан
vintik
Гость
« Ответ #10 : Июль 25, 2011, 22:30 »

А есть ли способ нарисовать на сцене залитый полигон, но чтобы его замкнутый контур состоял из QGraphicsLineItem, например?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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