Как предотвратить появление видимых пробелов/соединений между полигонами в QPainter с помощью сглаживания

Я рисую треугольники/многоугольники в QPainter, используя сглаживание, полученное при рендеринге 3D-моделей. Если два многоугольника нарисованы рядом друг с другом, между ними есть зазор.

Вот некоторый код (в PyQt), чтобы продемонстрировать проблему:

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class Window(QLabel):

    def __init__(self):
        QLabel.__init__(self)

        pixmap = QPixmap(300,300)
        pixmap.fill()
        painter = QPainter(pixmap)
        painter.setRenderHint(QPainter.Antialiasing)
        painter.setPen(QPen(Qt.NoPen))
        painter.setBrush(QBrush(QColor('black')))

        poly1 = QPolygonF()
        for x, y in ((0,0),(0,240.5),(210.3,0)):
            poly1 << QPointF(x,y)
        painter.drawPolygon(poly1)
        poly2 = QPolygonF()
        for x, y in ((210.3,0),(210.3,240),(0,240.5)):
            poly2 << QPointF(x,y)
        painter.drawPolygon(poly2)
        painter.end()

        self.setPixmap(pixmap)

app = QApplication(sys.argv)
win = Window()
win.show()
app.exec_()

Снимок экрана из кода

Как я могу предотвратить эту проблему? Как предлагает ниже vahancho, я мог бы добавить границы к каждому многоугольнику или увеличить его на полпикселя в каждом направлении. К сожалению, это делает соединения видимыми, если заливка/перо частично прозрачны.


person xioxox    schedule 03.11.2014    source источник
comment
Что, если вы попытаетесь удалить эту строку: painter.setPen(QPen(Qt.NoPen))?   -  person vahancho    schedule 03.11.2014
comment
Это исправляет это в этом случае. Я мог бы добавить границы в 1 пиксель к каждому многоугольнику с тем же цветом, что и заливка. К сожалению, это не работает, если я хочу прозрачные треугольники.   -  person xioxox    schedule 03.11.2014


Ответы (1)


Попробуйте сделать размытие по Гауссу с радиусом 1 пиксель во время финализации, чтобы избежать проблемы. Если вы писали игру, вам следует отключить сглаживание во время рендеринга, поставить шаг в конец. Это означает, что вы должны сделать что-то вроде SSAA в конце концов, раз и навсегда, но не сглаживание при каждом вызове отрисовки.

person lymastee    schedule 25.05.2016