Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: skaz54 от Декабрь 05, 2012, 08:13



Название: Перекрытие элементов в QPainterPath
Отправлено: skaz54 от Декабрь 05, 2012, 08:13
Здравствуйте.

На QPainterPath добавляю несколько элементов. Иногда они могут пересекаться.
Чтобы общая область так же была прорисована устанавливаю для QPainterPath значение setFillRule в значение Qt::WindingFill.
Все вроде работает.

Возьмем пример из Qt PainterPath в Examples.
Все работает, как написано, но если заменить строчки

    groupPath.moveTo(60.0, 40.0);
    groupPath.arcTo(20.0, 20.0, 40.0, 40.0, 0.0, 360.0);



на строку

    groupPath.addEllipse(20, 20, 40, 40);

После замены строк значение setFillRule(Qt::WindingFill) не работает - в месте пересечения элементов остается "дырка"

В чем здесь дело - разобраться не могу.

Помогите.
Заранее спасибо.


Название: Re: Перекрытие элементов в QPainterPath
Отправлено: Fregloin от Декабрь 06, 2012, 12:05
Сталкивался с подобным, установка флагов ничем не помогла, дырки остаются - скорее всего баг Qt


Название: Re: Перекрытие элементов в QPainterPath
Отправлено: Igors от Декабрь 06, 2012, 13:44
Вообще в любой системе если контур само-пересекается, дырки должны быть, это нормально, на это даже рассчитывают. Есть правила (fillRule) по которым определяется что заливать а что нет. Предъявите скриншот, посмотрим


Название: Re: Перекрытие элементов в QPainterPath
Отправлено: skaz54 от Декабрь 06, 2012, 14:58
Показываю скриншоты (по порядку).
1. Исходный код примера - значение параметра fillRule = OddEvenFill. Во втором и третьем ряду третья колонка наблюдается "дыра" в месте перекрытия элементов.

2. Исходный код примера - значение параметра fillRule = WindingFill. Во втором и третьем ряду третья колонка наблюдается отсутствие "дыр" в месте перекрытия элементов.

3. Модифицированный код примера - строки
groupPath.moveTo(60.0, 40.0);
groupPath.arcTo(20.0, 20.0, 40.0, 40.0, 0.0, 360.0);

заменил на строку
groupPath.addEllipse(20, 20, 40, 40);
Изменения касаются третьего элемента во второй строке. Значение параметра fillRule = OddEvenFill. Во втором и третьем ряду третья колонка наблюдается "дыра" в месте перекрытия элементов.

4. Модифицированный код примера. Значение параметра fillRule = WindingFill. Во втором ряду третья колонка "дыра" осталась. В третьем ряду третья колонка "дыра"отсутствует.

Windows XP, QT 4.7


Название: Re: Перекрытие элементов в QPainterPath
Отправлено: Igors от Декабрь 06, 2012, 16:00
Возьмем пример из Qt PainterPath в Examples.
Все работает, как написано, но если заменить строчки

    groupPath.moveTo(60.0, 40.0);
    groupPath.arcTo(20.0, 20.0, 40.0, 40.0, 0.0, 360.0);



на строку

    groupPath.addEllipse(20, 20, 40, 40);

После замены строк значение setFillRule(Qt::WindingFill) не работает - в месте пересечения элементов остается "дырка"
Так эта замена не эквивалентна - Вы изменили направление обхода. addElipse использует clockwise, arcTo =  counter-clockwise. Тот же эффект будет если в исходном примере 360 замените на -360

Если никакие дырки не нужны - просто создавайте/рисуйте каждый path отдельно


Название: Re: Перекрытие элементов в QPainterPath
Отправлено: skaz54 от Декабрь 06, 2012, 17:26
Спасибо