"""Primitiva GL_POLYGON — um polígono convexo de N lados. Aula 02 — Visualização 2D: primitivas gráficas. Exemplo em Python com PySide6 e PyOpenGL (pipeline fixed-function). Execute com: python poligonos2d.py Pontos de atenção: * ``GL_POLYGON`` usa **todos** os vértices entre ``glBegin`` e ``glEnd`` para formar **um único** polígono, fechando automaticamente o último no primeiro. * O polígono precisa ser **convexo** e **simples** (sem lados que se cruzam). Com um polígono côncavo o resultado é indefinido — normalmente sai preenchido de forma errada. Para formas côncavas, decomponha em triângulos (triangulação) ou use ``gluTess*``. Troque ``VERTICES`` pelo conjunto ``CONCAVO`` (mais abaixo) para ver na prática o que acontece quando a restrição de convexidade é violada. """ from __future__ import annotations import sys from PySide6.QtCore import Qt from PySide6.QtGui import QSurfaceFormat from PySide6.QtWidgets import QApplication from PySide6.QtOpenGLWidgets import QOpenGLWidget from OpenGL.GL import * from OpenGL.GLU import gluOrtho2D # Pentágono convexo (contorno anti-horário). VERTICES = [ (-20.0, -35.0), (-35.0, 5.0), ( 0.0, 35.0), ( 35.0, 5.0), ( 20.0, -35.0), ] # Estrela de 4 pontas: CÔNCAVA. Use para observar o resultado incorreto. CONCAVO = [ ( 0.0, 35.0), ( 8.0, 8.0), ( 35.0, 0.0), ( 8.0, -8.0), ( 0.0, -35.0), ( -8.0, -8.0), (-35.0, 0.0), ( -8.0, 8.0), ] class Poligonos2D(QOpenGLWidget): """Desenha um polígono convexo com GL_POLYGON.""" def initializeGL(self) -> None: glClearColor(0.10, 0.11, 0.13, 1.0) def resizeGL(self, w: int, h: int) -> None: w, h = max(1, w), max(1, h) glViewport(0, 0, w, h) glMatrixMode(GL_PROJECTION) glLoadIdentity() if w <= h: gluOrtho2D(-50.0, 50.0, -50.0 * h / w, 50.0 * h / w) else: gluOrtho2D(-50.0 * w / h, 50.0 * w / h, -50.0, 50.0) glMatrixMode(GL_MODELVIEW) glLoadIdentity() def paintGL(self) -> None: glClear(GL_COLOR_BUFFER_BIT) glColor3f(0.75, 0.75, 0.78) # Todos os vértices formam UM polígono; o contorno fecha sozinho. glBegin(GL_POLYGON) for x, y in VERTICES: glVertex2f(x, y) glEnd() def keyPressEvent(self, event) -> None: if event.key() == Qt.Key.Key_Escape: self.close() def main() -> int: fmt = QSurfaceFormat() fmt.setVersion(2, 1) fmt.setProfile(QSurfaceFormat.OpenGLContextProfile.NoProfile) fmt.setDepthBufferSize(0) QSurfaceFormat.setDefaultFormat(fmt) app = QApplication(sys.argv) window = Poligonos2D() window.setWindowTitle("Primitivas 2D — GL_POLYGON") window.resize(600, 400) window.show() return app.exec() if __name__ == "__main__": raise SystemExit(main())