본문 바로가기
프로그램

[파이썬] OpenGL 사용해서 삼각형, 사각형, 원 그리기

by 오디세이99 2024. 7. 13.
728x90
반응형

 

import pygame                            # Pygame 모듈을 임포트
from pygame.locals import *              # Pygame 로컬 상수 임포트
from OpenGL.GL import *                  # OpenGL 함수 임포트
from OpenGL.GLU import *                 # OpenGL 유틸리티 함수 임포트
import math                              # 수학 함수 사용을 위한 math 모듈 임포트

def draw_triangle():                     # 삼각형을 그리는 함수 정의
    glBegin(GL_TRIANGLES)                # 삼각형 그리기 시작
    glVertex2f(-0.2, -0.2)               # 첫 번째 꼭짓점 좌표
    glVertex2f(0.2, -0.2)                # 두 번째 꼭짓점 좌표
    glVertex2f(0.0, 0.2)                 # 세 번째 꼭짓점 좌표
    glEnd()                              # 그리기 종료

def draw_square():                       # 사각형을 그리는 함수 정의
    glBegin(GL_QUADS)                    # 사각형 그리기 시작
    glVertex2f(-0.2, -0.2)               # 첫 번째 꼭짓점 좌표
    glVertex2f(0.2, -0.2)                # 두 번째 꼭짓점 좌표
    glVertex2f(0.2, 0.2)                 # 세 번째 꼭짓점 좌표
    glVertex2f(-0.2, 0.2)                # 네 번째 꼭짓점 좌표
    glEnd()                              # 그리기 종료

def draw_circle(radius=0.2, num_segments=100):  # 원을 그리는 함수 정의
    theta = 2 * 3.1415926 / num_segments  # 원의 각도 계산
    c = math.cos(theta)                   # 코사인 값 계산
    s = math.sin(theta)                   # 사인 값 계산
    x = radius                            # 초기 x 좌표
    y = 0                                 # 초기 y 좌표

    glBegin(GL_POLYGON)                   # 다각형 그리기 시작
    for i in range(num_segments):         # 각 세그먼트에 대해
        glVertex2f(x, y)                  # 꼭짓점 추가
        t = x                             # 임시 변수에 x 저장
        x = c * x - s * y                 # 회전 변환
        y = s * t + c * y                 # 회전 변환
    glEnd()                               # 그리기 종료

def main():                               # 메인 함수 정의
    pygame.init()                         # Pygame 초기화
    display = (1000, 600)                  # 창 크기 설정
    pygame.display.set_mode(display, DOUBLEBUF | OPENGL)  # OpenGL 창 생성
    width, height = display               # 창의 너비와 높이 설정
    gluOrtho2D(-1, 1, -1 * height / width, 1 * height / width)  # 종횡비 맞추기

    while True:                           # 무한 루프 시작
        for event in pygame.event.get():  # 이벤트 처리
            if event.type == pygame.QUIT: # 창 닫기 이벤트 처리
                pygame.quit()             # Pygame 종료
                return                    # 함수 종료

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)  # 화면 지우기

        glColor3f(1, 0, 0)                # 빨간색 설정
        glPushMatrix()                    # 현재 변환 행렬 저장
        glTranslatef(-0.5, 0, 0)          # 위치 이동
        draw_triangle()                   # 삼각형 그리기
        glPopMatrix()                     # 이전 변환 행렬 복원

        glColor3f(0, 1, 0)                # 초록색 설정
        glPushMatrix()                    # 현재 변환 행렬 저장
        glTranslatef(0.5, 0, 0)           # 위치 이동
        draw_square()                     # 사각형 그리기
        glPopMatrix()                     # 이전 변환 행렬 복원

        glColor3f(0, 0, 1)                # 파란색 설정
        glPushMatrix()                    # 현재 변환 행렬 저장
        glTranslatef(0, 0, 0)             # 위치 이동
        draw_circle()                     # 원 그리기
        glPopMatrix()                     # 이전 변환 행렬 복원

        pygame.display.flip()             # 화면 업데이트
        pygame.time.wait(10)              # 잠시 대기

if __name__ == "__main__":                # 메인 함수 실행 조건
    main()                                # 메인 함수 실행

 

728x90
반응형

댓글