직선

Woogie_·2025년 5월 22일

게임 수학

목록 보기
11/15

아핀 공간에서 점의 조합

  • 앞서서 아핀 공간에서 점 + 점의 연산은 불가능 하였음

  • 스칼라 보조를 사용하여 다음과 같은 조합식을 만들 때

aP1+bP2=?a\cdot P_1 +b\cdot P_2 = ?
  • 2차원의 점이라고 가정할 경우 위 조합식은 다음과 같이 전개됨
a(x1,y1,1)+b(x2,y2,1)=(ax1+bx2,ay1+by2,a+b)a(x_1,y_1,1)+b(x_2,y_2,1)=(ax_1+bx_2,ay_1+by_2,a+b)
  • 이 때 위 결과가 점이 되기 위해서는 마지막 차원 값이 반드시 1이 되어야 한다. 따라서 다음의 수식이 성립
a+b=1a+b=1
  • 이를 원 식에 대입하면 다음의 식이 만들어지며 이는 점을 보장해주며 aa값에 따라 무수히 많은 점을 만들어낼 수 있음
P(a)=aP1+(1a)P2P(a)=a\cdot P_1+(1-a)\cdot P_2

아핀 조합의 수식

아핀 조합에 따른 점의 생성

  • aa 값에 따라 생성된 점들이 위 그림과 같이 같은 선상에 있음을 어떻게 증명할 수 있을 것인가?
P=aP1+(1a)P2PP2=a(P1P2)u=avP'=aP_1+(1-a)P_2\\ P'-P_2=a(P_1-P_2)\\ \vec{u}=a\vec{v}

선의 종류

점의 표현

스크린 좌표계

  • 화면은 픽셀들로 구성되어 있으며, 다음과 같은 좌표계를 사용하며 픽셀의 위치를 관리

  • 수학에서 사용하는 데카르트 좌표계와 스크린 좌표계의 차이

    • 데카르트 좌표계

      • 실수 R\mathbb{R}

      • 오른손 좌표계(우상방향 증가)

      • 연속성

    • 스크린 좌표계

      • 양의 정수 H\mathbb{H}

      • 왼손 좌표계(우하방향 증가)

      • 이산성

    픽셀화 (Rasterization)

  • 물체의 형상을 픽셀로 변환해 표현하는 작업

  • 화면의 해상도가 짝수인 경우 (0,0)(0, 0)을 표현하는데 한계가 발생

  • 이 경우에는 지정된 규칙에 따라 네 개 중 하나의 픽셀을 선택할 수 밖에 없음

  • 픽셀을 벡터로 변환할 때에는 픽셀 영역 하나의 대표값을 지정 해야 함

선 그리기 알고리즘 (브레젠험 알고리즘)

  • 직선의 방정식으로 그리기

  • 이론적으로는 다음과 같이 그릴 수 있으나 실용적인 방법 x

  • 스크린 좌표계에서 픽셀 좌표는 정수로 고정

  • 1962년도에 고안된 정수 연산만을 사용해 빠르게 선을 그리는 알고리즘
  • 중점 (Mid-point) 알고리즘이라고도 함

브레젠험 알고리즘 구현 방법

  • 화면 공간을 8등분 하고 1 ~ 8 분면 (Octant)으로 나눔

  • 직선의 방정식은 다음과 같음
y=ax+by = ax + b
  • 정수로 된 스크린 좌표계의 두 점의 좌표가 주어졌을 때 다음 정보가 주어짐
    • Width (너비) : x1x0x_1 - x_0
    • Height (높이) : y1y0y_1 - y_0
    • x0,y0x_0, y_0 (시작 점의 좌표)
  • 이를 바탕으로 위의 방정식을 변형
y0=hwx0+bb=y0hwx0y_0={h\over w}x_0+b \quad \therefore b=y_0-{h \over w}x_0
  • 그렇다면 위의 식은 다음과 같이 전개
y=hwx+y0hwx0y={h\over w}x+y_0-{h\over w}x_0
  • 위의 식을 기본으로 모든 것을 전개

제 1팔분면

  • 해당 영역에서는 기울기가 1을 넘어설 수 없는 특징을 가짐

  • 그렇기 때문에 평행이동하거나 1칸 아래로 이동하는 동작만 발생

    • 시작점을 찍은 후 다음 점이 평행 이동하는지 한칸 아래로 내려가는지는 중점 값을 보고 판단

  • 직선의 방정식 우변 ax+bax+b의 값이 좌변 yy보다 작다면 위의 픽셀을 선택하고 크면 아래 픽셀을 선택

  • xx값이 x0+1x_0+1인 경우 얻어지는 yy값은 다음과 같음

y=hw(x0+1)+y0hwx0=hw+y0y={h\over w}(x_0+1)+y_0-{h\over w}x_0\\ ={h\over w}+y_0
  • 이 값과 y0+0.5y_0+0.5와 비교한다. 그렇다면 평행 이동하는 경우는 다음과 가틍ㅁ
hw+y0<y0+0.5\frac{h}{w}+y_0<y_0+0.5
  • 위 수식은 다음과 같이 단순화
hw0.5<02w(hw0.5)<02hw<0\frac{h}{w}-0.5<0\\ 2w(\frac{h}{w}-0.5)<0\\ 2h-w<0
  • 그 다음 위치 (x0+2)(x_0+2) 상황에서는 세 점 중 하나를 선택

  • 이 때에는 두 중점마다 판별식이 달라진다.

    • 4hw4h-w
    • 4h3w4h-3w

  • 그 다음 지점 (x0+3)(x_0+3)에는 세 중점이 있고 각각의 판별식은 다음과 같음

    • 6hw6h-w
    • 6h3w6h-3w
    • 6h5w6h-5w
  • 따라서 xx가 증가할 때마다 판별 결과에 따라 판별식은 다음과 같이 변화된다고 할 수 있음

    • 평행 이동할 때는 2h2h만큼 증가
    • 아래로 내려갈 때는 2h2w2h-2w만큼 증가

나머지 팔분면의 처리

  • 제 2 팔분면은 xx가 증가하지 않고 yy를 증가시키는 방향으로 전개

  • xxyy가 바뀐 상태로 동일하게 알고리즘을 진행하면 되며 판별식은 2wh2w-h

  • 3팔분면은 2팔분면에서 xx를 거꾸로 증가시키는 형태이고 4팔분면은 1팔분면에서 xx방향이 반대로 진행되는 것 외에는 동일

  • 이전의 알고리즘에서 앞에 다음과 같은 요소를 고려해 보완하면 모든 팔분면의 처리가 가능

    • 경사가 완만한가 급격한가?
    • xx방향과 yy방향은 양의 방향인가 음의 방향인가?
profile
상상을 구현하는 개발자

0개의 댓글