프로그래밍/컴퓨터그래픽스

점, 선, 다각형을 이용한 다양한 도형 그리기

studylida 2025. 4. 4. 20:22

1. 출력 기본 객체란?

OpenGL에서 화면에 무엇인가를 그릴 때 가장 작은 단위는 점(Point), 선(Line), 그리고 다각형(Polygon)입니다. 이들을 출력 기본 객체 (Primitive)라고 부릅니다.

✅ 점, 선, 다각형

  • 점 (GL_POINTS): 하나의 위치를 표시하는 단일 정점
  • 선 (GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP): 두 정점을 잇거나 연속적인 선형 구조를 만듦
  • 다각형 (GL_POLYGON, GL_TRIANGLES 등): 여러 정점을 연결하여 면을 구성

✅ 앞면과 뒷면 (Face)

  • 다각형에는 앞면(front face)뒷면(back face) 개념이 있습니다.
  • OpenGL은 이 정보를 바탕으로 면을 표시하거나 생략할 수 있습니다.
  • 법선 벡터(Normal Vector): 정점을 나열한 방향으로 오른손을 말아쥐었을 때, 엄지 방향이 법선 방향이 됩니다.

2. OpenGL로 도형을 그리는 기본 구조

OpenGL은 glBegin()glEnd() 사이에 도형을 정의합니다. 각 정점은 glVertex*() 함수를 통해 지정합니다.

glBegin(GL_LINES);
    glVertex2i(50, 100);
    glVertex2i(75, 150);
glEnd();

✅ glVertex*() 함수 종류

glVertex[차원][데이터형][v] 형식을 따릅니다.

요소 가능한 값 설명
차원 2, 3, 4 2D, 3D, 4D 좌표 지정
데이터형 i, s, f, d 정수(int), short, float, double
v (없음), v 개별 인자 또는 배열 입력 방식
예시 함수 의미
glVertex2i(x, y) 2차원 정수 좌표
glVertex3f(x, y, z) 3차원 실수 좌표
glVertex2iv(p) 정수형 2D 배열 입력

3. 선(Line) 도형 그리기

각기 다른 선 도형을 OpenGL로 어떻게 표현하는지 그림으로 함께 살펴봅시다.

🔹 GL_LINES

각 두 정점을 하나의 선으로 인식합니다.

void draw_lines() {
    // 🔹 GL_LINES
    glColor3d(1, 0, 0);  // 빨강
    glBegin(GL_LINES);
    glVertex2iv(p1); glVertex2iv(p2);
    glVertex2iv(p3); glVertex2iv(p4);
    glVertex2iv(p5); glVertex2iv(p1);
    glEnd();

    // 🔹 GL_LINE_STRIP
    glColor3d(0, 0, 1);  // 파랑
    glBegin(GL_LINE_STRIP);
    glVertex2iv(p1);
    glVertex2iv(p2);
    glVertex2iv(p3);
    glVertex2iv(p4);
    glVertex2iv(p5);
    glEnd();

    // 🔹 GL_LINE_LOOP
    glColor3d(0, 0.5, 0);  // 초록
    glBegin(GL_LINE_LOOP);
    glVertex2iv(p1);
    glVertex2iv(p2);
    glVertex2iv(p3);
    glVertex2iv(p4);
    glVertex2iv(p5);
    glEnd();
}
  • 연결: (p1-p2), (p3-p4), (p5, p1)

🔹 GL_LINE_STRIP

첫 정점부터 마지막 정점까지 연결된 선

  • 연결: p1-p2-p3-p4-p5

🔹 GL_LINE_LOOP

GL_LINE_STRIP + 마지막과 처음 정점을 다시 연결

  • 연결: p1-p2-p3-p4-p5-p1

💡 각 선 도형은 점의 순서에 따라 전혀 다른 결과를 만듭니다.


4. 다각형(Polygon) 도형 그리기

다각형 계열 도형은 점을 세 개 이상 연결하여 면을 구성합니다. OpenGL은 삼각형을 기본 단위로 여러 방식의 도형을 생성할 수 있습니다.

🔸 GL_POLYGON

void draw_polygon() {
    glColor3d(1, 0, 0); // 빨강
    glBegin(GL_POLYGON);
    glVertex2i(-8, 6);
    glVertex2i(-6, 8);
    glVertex2i(-4, 7);
    glVertex2i(-4, 5);
    glVertex2i(-6, 4);
    glVertex2i(-8, 5);
    glEnd();
}

  • 정점들을 모두 연결하여 하나의 다각형 생성
  • 단점: 삼각형이 아닌 복잡한 형태는 잘못 그려질 수 있음

🔸 GL_TRIANGLES

void draw_triangles() {
    glColor3d(0, 0.6, 0); // 초록
    glBegin(GL_TRIANGLES);
    glVertex2i(2, 6); glVertex2i(4, 8); glVertex2i(6, 6);
    glVertex2i(2, 5); glVertex2i(3, 3); glVertex2i(6, 4);
    glEnd();
}

  • 3개의 정점을 묶어 독립된 삼각형 생성

🔸 GL_TRIANGLE_STRIP

void draw_triangle_strip() {
    glColor3d(0, 0, 1); // 파랑
    glBegin(GL_TRIANGLE_STRIP);
    glVertex2i(-8, 2);
    glVertex2i(-6, 3);
    glVertex2i(-7, 0);
    glVertex2i(-4, -1);
    glEnd();
}

  • 이전 삼각형의 마지막 두 점과 새로운 점으로 삼각형 구성

🔸 GL_TRIANGLE_FAN

void draw_triangle_fan() {
    glColor3d(1, 0.5, 0); // 주황
    glBegin(GL_TRIANGLE_FAN);
    glVertex2i(5, 1); // 중심점
    glVertex2i(6, 3);
    glVertex2i(8, 2);
    glVertex2i(8, 0);
    glVertex2i(6, -1);
    glVertex2i(4, -1);
    glVertex2i(3, 1);
    glVertex2i(6, 3); // 다시 첫 점으로 닫기
    glEnd();
}

  • 첫 점을 중심으로 부채꼴로 삼각형 구성

🔸 GL_QUADS

// 🔸 GL_QUADS: 왼쪽 아래
void draw_quads() {
    glColor3d(0.5, 0.5, 0.5); // 회색
    glBegin(GL_QUADS);
    glVertex2i(-8, -4); glVertex2i(-6, -4);
    glVertex2i(-6, -6); glVertex2i(-8, -6);

    glVertex2i(-5, -4); glVertex2i(-3, -4);
    glVertex2i(-3, -6); glVertex2i(-5, -6);
    glEnd();
}

  • 4개의 정점으로 하나의 사각형 생성 (OpenGL 최신 버전에서는 비권장)

🔸 GL_QUAD_STRIP

void draw_quad_strip() {
    glColor3d(0.3, 0.3, 0.8); // 파랑 계열
    glBegin(GL_QUAD_STRIP);
    glVertex2i(5, -4); glVertex2i(3, -8);
    glVertex2i(7, -4); glVertex2i(7, -6);
    glEnd();
}

  • 두 개의 점 쌍을 연결해서 사각형 스트립 생성

5. 실습 코드 예제: 타원과 호(Arc) 그리기

이제 OpenGL 기본 도형을 활용하여 타원과 호를 직접 그려보는 실습 예제를 살펴보겠습니다.

🔧 타원 그리기

void draw_ellipse(double cx, double cy, double sx, double sy, double r, double g, double b, int snum) {
    glColor3d(r, g, b); // 색상 지정
    glBegin(GL_TRIANGLE_FAN); // 중심을 기준으로 삼각형 팬 시작
    glVertex2d(cx, cy); // 중심 점
    for (int i = 0; i < snum; ++i) {
        double theta = i / (double)(snum - 1) * 2.0 * 3.141592; // 각도 계산
        double x = cx + sx * cos(theta); // 타원의 x 좌표
        double y = cy + sy * sin(theta); // 타원의 y 좌표
        glVertex2d(x, y);
    }
    glEnd(); // 도형 그리기 종료
}

이 함수는 중심을 기준으로 원을 따라 정점을 배치하고, 이 점들을 삼각형으로 연결하여 타원 형태를 만듭니다.

🔧 호(Arc) 그리기

void draw_arc(double cx, double cy, double radius, double start_angle, double end_angle, double r, double g, double b, int snum) {
    glColor3d(r, g, b); // 색상 설정
    glBegin(GL_TRIANGLE_FAN); // 삼각형 팬 시작
    glVertex2d(cx, cy); // 중심 점
    for (int i = 0; i < snum; i++) {
        double theta = start_angle + (end_angle - start_angle) * (i / (double)snum);
        theta = theta * 2.0 * 3.141592 / 360; // 각도를 라디안으로 변환
        double x = cx + radius * cos(theta); // 호 위의 x 좌표
        double y = cy + radius * sin(theta); // 호 위의 y 좌표
        glVertex2d(x, y);
    }
    glEnd(); // 도형 그리기 종료
}

이 함수는 특정 각도 범위 안에서만 정점을 계산해 부채꼴(Arc)을 만듭니다.


6. 전체 요약

도형 OpenGL 상수 특징
GL_POINTS 단일 정점
GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP 정점 연결 방식 차이
삼각형 GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN 다양한 구성 방식 제공
사각형 GL_QUADS, GL_QUAD_STRIP 정점 4개 기반 도형
  • 도형 그리기는 glBegin()glEnd() 사이에 작성
  • glVertex*() 함수로 정점 지정
  • 복잡한 도형도 결국 삼각형 조합으로 그릴 수 있음