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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QT 4.2.2 QPainter - рисование прямых  (Прочитано 12153 раз)
evilguard
Гость
« : Февраль 26, 2007, 23:53 »

http://qtprojects.narod.ru/polygon.bmp
Привожу скриншот, там три ломаные, из них 2 с огрехами изображения, местами утолщена линия, хотя такого не должно быть(даже в painte такого не бывает, толщина линии остается постоянной). Третья линия, примерно такая, какая должна быть. Файл специально не сжимал, чтобы лучше видно было. Это проблема графического движка QT? Рисовал с помощью:
Код:

QPainterPath path;
path.lineTo(....);
painter->drawPath(path);


добавлено спустя 3 минуты:

Сразу говорю, дело не в моих точках, приближал до бесконечности эти прямые, та же самая ситуация, много косяков. Сравнил линии, построенные по тем же исходным данным программой на Дельфи, там все замечательно.
Записан
Alex03
Гость
« Ответ #1 : Февраль 27, 2007, 07:24 »

Анталиасинг виден.
И насколько длинные у Вас отрезки? Случайно не по поре пикселов (а то и меньше) длиной?
Записан
Dendy
Гость
« Ответ #2 : Февраль 27, 2007, 07:52 »

В том то и дело, что нету там никакого антиалиасинга. Попробуй включить:

Код:
painter->setRenderHint( QPainter::Antialiasing );
Записан
evilguard
Гость
« Ответ #3 : Февраль 27, 2007, 09:05 »

Вот именно, дело не в антиалиазинге, он мне не нужен. Возьмите в painte и начертите линию. Да, будут видны ступеньки, но не будет наложения кусочков линии друг на друга, то есть будет просто ступеньками, при любых улах наклона, а толщина линии останется постоянной. Это-то мне и нужно.
Просто есть пара аналогичных программ, функциональность которых похожа на мою. На тех же исходных данных они обе показывают нормальные линии, а QT - такие, смотрится грязно.

добавлено спустя 13 минут:

 Dendy
Включил антиалиазинг для пробы, намного лучше стало, исчезли эти самые косяки утолщения линий, хотя и появился антиалиазинг, который в принципе мне и не нужен. Скорее всего остановлюсь на этом варианте. Спасибо!
[off]Можете еще ответить на мои вопросы в теме про Graphics Item, чуть ниже?[/off]
Записан
Alex03
Гость
« Ответ #4 : Февраль 27, 2007, 15:31 »

Цитата: "Dendy"
В том то и дело, что нету там никакого антиалиасинга.

А что по Вашему есть серенькие пикселы рядом с чёрными (при большом увеличении)?
Записан
Dendy
Гость
« Ответ #5 : Февраль 27, 2007, 16:04 »

Серенькие пикселы появляются за счёт размытия картинки при её увеличении. Это эффект вашей программы просмотрщика. ACDSee  к примеру таким балуется.

Вообще алгоритм "один пиксель на линию" применим только в тривиальных случаях. Далеко не каждый примитив можно так нарисовать. Например, что будет, если поставить толщину линии 1.5 да ещё и полупрозрачную? Методы рисования Qt универсальны и подходят для всех примитивов за счёт сглаживания. Без него - разве что линию да эллипс можно нарисовать.
Записан
evilguard
Гость
« Ответ #6 : Февраль 27, 2007, 16:48 »

Dendy
Все понял, то есть надо антиалиазинг использовать постоянно.
Все-таки можете ответить на мой вопрос, по QGraphicsItem?
http://prog.org.ru/forum/topic_4338_474315ab5289380918306b56e8e143c7.html
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #7 : Февраль 28, 2007, 01:50 »

не надо его постоянно использовать... вместо этого толщину линий целыми числами задавать.
1.5 пикселей... вот маразм...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
noosooth
Гость
« Ответ #8 : Февраль 28, 2007, 02:46 »

Цитата: "Racheengel"
не надо его постоянно использовать...

Полностью поддерживаю. Ежели толщина линии 1 px и антиалиасинг выключен,
то либо Qt так заставили отрисовать (координаты точек, их порядок...), либо это bug.
И лечить это дело антиалиасингом, особенно если он не нужен, не есть гуд.

To evilguard:
А можно взглянуть на кусочек кода который рисует самую левую линию
(судя по Вашему bmp) или скажем на координаты точек?

У троллей вообще-то были некоторые  проблемы с отрисовкой линий в 4.1.4 под виндой.
Может опять намудрили...
Записан
Alex03
Гость
« Ответ #9 : Февраль 28, 2007, 07:42 »

Цитата: "Dendy"
Серенькие пикселы появляются за счёт размытия картинки при её увеличении. Это эффект вашей программы просмотрщика. ACDSee  к примеру таким балуется.

Да это я лоханулся.
Смотрел оперой 9.01. В ней при увеличении видны чёткие квадратные пикселы, как самих линий, так и серенькие рядом. Похоже опера предварительно преобразует картинку, а при увеличении уже ничего не сглаживает. Грустный
Ну а всякие ACDSee и прочие именно сглаживают при увеличении. Эт понятно.
Поглядел паинтом.

И всётаки, какой длины отрегки этих линий то?
Записан
evilguard
Гость
« Ответ #10 : Февраль 28, 2007, 09:05 »

Racheengel
Кто сказал, толщину линий я 1.5 задавал?
Код:

QPainterPath path;
//идем в начальную точку
path.moveTo(points[0].x/scale*coef,
       (w_height-points[0].y)/scale*coef);
//строим все отрезки полигона
for (int k=0; k<points.size(); k++)
path.lineTo(points[k].x/scale*coef,
          (w_height-points[k].y)/scale*coef);
Записан
Alex03
Гость
« Ответ #11 : Февраль 28, 2007, 17:28 »

Наверное хотели "for (int k=1; ..."

А чё выведет такой цикел?
Код:

    for (int k=1; k<points.size(); k++)
    {
        path.lineTo(points[k].x/scale*coef,
                        (w_height-points[k].y)/scale*coef);
        qWarning("dx=%f dy=%f\n", (points[k].x-points[k-1].x)/scale*coef,
                                                 (points[k].y-points[k-1].y)/scale*coef);
    }
Записан
evilguard
Гость
« Ответ #12 : Февраль 28, 2007, 18:05 »

Alex03
Да, эту ошибочку я уже сегодня нашел).
Цикел ничего не дает, кроме тормозов)
Записан
evilguard
Гость
« Ответ #13 : Март 01, 2007, 23:23 »

Еще один глючок отыскал в QPaintere. Тоже связан с рисованием полигонов. Использую QPolygonF. Если рисовать так:
Код:

QPolygonF isoline();
.... //заполнение точками
QPainterPath path(isoline[0]);
for (int k=1; k<isoline.size(); k++)
path.lineTo(isoline[k]);
painter->drawPath(path);

то все нормально. Если же делать по-нормальному:
Код:

QPolygonF isoline();
.... //заполнение точками
painter->drawPolyline(isoline);

То появляются косячки на линиях. 2 рисунка, один с косяками, другой без:
http://qtprojects.narod.ru/images.rar (308Кб)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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