컴퓨터 그래픽스(Computer Graphics)는 컴퓨터 화면 위에 이미지와 도형을 그려내는 기술을 다루는 분야입니다. 이때 화면은 하나의 2차원 좌표계로 간주되며, 좌표계는 화면의 좌측 상단 (0,0)에서 시작해 우측 하단까지 이어집니다.
뷰잉 평면(Viewing Plane)은 컴퓨터 그래픽스에서 그래픽을 실제로 그릴 수 있도록 정의된 영역을 의미합니다. 쉽게 말해 사용자가 볼 수 있는 화면상의 가시 영역이라고 할 수 있습니다.
그렇다면 클리핑(Clipping)이란 무엇일까요? 클리핑은 이 뷰잉 평면 바깥에 위치한 점(point)이나 그래픽 요소를 제거하는 과정입니다. 화면에 보이지 않을 부분까지 연산하지 않음으로써 불필요한 자원 낭비를 줄이는 것이 목적입니다.
포인트 클리핑의 개념
간단한 예를 통해 클리핑을 이해해 보겠습니다. 아래 그림에서 파란색으로 표시된 영역이 뷰잉 평면이라고 가정합니다.

그림 속 점 C와 D는 뷰잉 평면 바깥에 있기 때문에 클리핑 대상이 되어 화면에서 제거됩니다.
클리핑 판정 방법
컴퓨터 그래픽스에서 한 점을 클리핑하려면 먼저 뷰잉 평면의 경계 좌표, 즉 최솟값 (Xmin, Ymin)과 최댓값 (Xmax, Ymax)를 알아야 합니다. 그다음 해당 점의 좌표 (Xpoint, Ypoint)를 이 경계 값들과 비교합니다.
판정 조건은 다음과 같습니다.
(Xmin, Ymin) ≤ (Xpoint, Ypoint) ≤ (Xmax, Ymax)
위 조건을 만족하면 그 점은 뷰잉 평면 내부에 있는 것이므로 유지되고, 조건을 벗어나면 뷰잉 평면 외부의 점으로 판단되어 클리핑(제거)됩니다.
C++ 예제 코드
다음은 포인트 클리핑 알고리즘의 동작을 보여주는 C++ 프로그램입니다.
#include <iostream>
using namespace std;
void pointClipping(int points[][2], int n, int Xmin, int Ymin, int Xmax, int Ymax) {
cout << "Points that are removed by Point clipping Algorithm are :" << endl;
for (int i = 0; i < n; i++) {
if ((points[i][0] < Xmin) || (points[i][0] > Xmax))
cout << "(" << points[i][0] << "," << points[i][1] << ")\t";
else if ((points[i][1] < Ymin) || (points[i][1] > Ymax))
cout << "(" << points[i][0] << "," << points[i][1] << ")\t";
}
}
int main() {
int points[6][2] = {{0, 0}, {-10, 10}, {1000, 1000}, {100, 900}, {501, 311}, {250, 250}};
int Xmin = 0;
int Xmax = 500;
int Ymin = 0;
int Ymax = 500;
pointClipping(points, 6, Xmin, Ymin, Xmax, Ymax);
return 0;
}실행 결과
Points that are removed by Point clipping Algorithm are : (-10,10) (1000,1000) (100,900) (501,311)
결과 해석
뷰잉 평면의 범위는 X축과 Y축 모두 0부터 500까지입니다. 주어진 6개의 점 중 (0, 0)과 (250, 250)은 평면 내부에 있으므로 유지되었고, 나머지 네 개의 점은 다음과 같은 이유로 제거되었습니다.
(-10, 10): X 좌표가 Xmin(0)보다 작음(1000, 1000): X, Y 좌표가 모두 Xmax, Ymax(500)보다 큼(100, 900): Y 좌표가 Ymax(500)보다 큼(501, 311): X 좌표가 Xmax(500)보다 큼
이처럼 포인트 클리핑 알고리즘은 단순히 점의 좌표를 뷰잉 평면의 경계 값과 비교하는 것만으로 화면에 표시할 점과 버릴 점을 효율적으로 판별할 수 있습니다.