Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: vintik от Июль 21, 2011, 23:30



Название: Сглаживание фигур из большого количества точек (Antialiasing many points
Отправлено: 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))


Название: Re: Сглаживание фигур из большого количества точек (Antialiasing many points
Отправлено: Sancho_s_rancho от Июль 22, 2011, 08:54
GraphicsView  конечно большой тормоз, но чтоб на полигоне из 200 точек...
Волшебных флагов для QGraphicsView не существует.
Я бы пошел по пути реализации собственного Itema. Где бы все отрисовывал и сглаживал в пределах моих требований.


Название: Re: Сглаживание фигур из большого количества точек (Antialiasing many points
Отправлено: Fregloin от Июль 22, 2011, 12:01
либо представить это как QImage ... работать будет быстрее однозначно


Название: Re: Сглаживание фигур из большого количества точек (Antialiasing many points
Отправлено: Igors от Июль 22, 2011, 14:01
Задача: построить замкнутый контур по большому числу точек (примерно 200).
Казалось бы,  берём QPolygonF, вставляем в него точки, передаём его в QGraphicsPolygonItem и добавляем на сцену.
Отлично работает.
Отлично если исходные точки уже упорядочены и образуют корректный замкнутый контур. А если точки следуют в произвольном порядке - получается полигон с взаимо-пересечениями который может работать "совсем не отлично"


Название: Re: Сглаживание фигур из большого количества точек (Antialiasing many points
Отправлено: kamre от Июль 22, 2011, 17:01
либо представить это как QImage ... работать будет быстрее однозначно
И как делать zoom? Прям картинку увеличивать? Тогда качество будет никакое.


Название: Re: Сглаживание фигур из большого количества точек (Antialiasing many points
Отправлено: kamre от Июль 22, 2011, 17:17
А вообще мне тоже интересен этот вопрос, т.к. скорость отрисовки с antialiasing без OpenGL не очень впечатляет. А с OpenGL хоть и быстро, но сглаживание не всегда работает и хуже по качеству получается.

Вот пример по быстрому накидал. Без OpenGL сильно тормозит даже на Core2Duo 3GHz с NVIDIA 9800GTX+. Как можно ускорить отрисовку?


Название: Re: Сглаживание фигур из большого количества точек (Antialiasing many points
Отправлено: kambala от Июль 22, 2011, 19:50
corei5 2.4GHz, GeForce GT 330M / встроенная Intel HD Graphics (не знаю какая из них работает для приложения), Mac OS X 10.6.8 - абсолютно никаких тормозов. критическая загрузка процессора - 25%, оперативки - 16 Мб (с опенгл - 40 Мб). что я делаю не так?


Название: Re: Сглаживание фигур из большого количества точек (Antialiasing many points
Отправлено: vintik от Июль 22, 2011, 23:33
Отлично если исходные точки уже упорядочены и образуют корректный замкнутый контур. А если точки следуют в произвольном порядке - получается полигон с взаимо-пересечениями который может работать "совсем не отлично"
Не, контур как раз замкнутый и без пересечений.
Вот, кстати, kamre набросал пример, там вполне такие неплохие контуры... При включённом сглаживании и зуме тормозит.

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

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


Название: Re: Сглаживание фигур из большого количества точек (Antialiasing many points
Отправлено: vintik от Июль 23, 2011, 00:46
В архиве наитупейший пример, рисуется большой полигон.
Со сглаживанием на большом зуме при перетаскивании и вращении - задумывается
(вращение левая кнопка мыши + скролл)
Стоит отключить сглаживание - летает

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


Название: Re: Сглаживание фигур из большого количества точек (Antialiasing many points
Отправлено: xokc от Июль 24, 2011, 18:41
В Qt под windows у растрового движка вообще проблема со сглаживанием длинных кривых. Смотрите, например, тут http://www.prog.org.ru/topic_11954_0.html.


Название: Re: Сглаживание фигур из большого количества точек (Antialiasing many points
Отправлено: vintik от Июль 25, 2011, 22:30
А есть ли способ нарисовать на сцене залитый полигон, но чтобы его замкнутый контур состоял из QGraphicsLineItem, например?