Прозрачность перекрывающихся полигонов в Qt

Есть ли простой способ сделать прозрачным перекрывающуюся область между двумя полигонами? Желательно встроенные функции в виджетах Qt / 2D-графике Qt C ++ фреймворк. (не QML)

Я рендерил данные карты, извлеченные из Openstreetmap.org, и некоторые продвинутые отношения между способами (отрезки линий) представлены как внутренние и внешние пути, образующие многоугольники.

Например, у озера могут быть внешние пути, которые образуют многоугольник, и несколько внутренних путей, которые образуют острова внутри озера.

Я могу правильно построить внешние полигоны и внутренние полигоны отдельно, но я изо всех сил пытаюсь найти легко способ сделать область, которая перекрывается с внутренними многоугольниками, прозрачной.

На изображении ниже белые области — это отдельные многоугольники, нарисованные белым, но вместо этого они должны быть прозрачными участками озера / синего многоугольника.

Белый должен быть прозрачной областью синего цвета

Я попытался использовать QPainterPath для внешних полигонов и вызова

QPainterPath QPainterPath::subtracted(const QPainterPath &inner) const

но результатом стал пустой экран.

Должен ли я сам создавать новые полигоны перед рендерингом?

Должно ли работать решение QPainterPath, и я что-то напутал?

Есть ли какая-то магия, которую можно сделать с помощью QPen / QBrush для рисования перекрывающихся областей прозрачными?

Любые советы о том, как подойти к этому, высоко ценится.

1

Решение

Кажется, я испортил подход QPainterPath. Это работает сейчас.

Я работал с QPolygonF напрямую, так как он имеет метод subtracted (), похожий на QPainterPath. Однако реализация вычитаемых в QPolygonF левых артефактов в виде линий между начальной вершиной каждого внутреннего многоугольника и начальной вершиной внешнего многоугольника.

Использование QPainterPath :: addPolygon и выполнение вычитания работали безупречно.

Ссылка
https://bugreports.qt.io/browse/QTBUG-53720
http://www.qtcentre.org/threads/19463-Draw-polygon-with-holes

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]