[그래픽스] 2. 수학

Jaeyoung Seon·2022년 2월 4일
2

컴퓨터그래픽스

목록 보기
3/6
post-thumbnail
  1. 수학
    2.1. 집합과 매핑
    2.2. 2차방정식 풀이
    2.3. 삼각법
    2.4. 벡터
    2.5. 곡선과 표면
    2.6. 선형 보간
    2.7. 삼각형

2. 수학

그래픽스의 90%는 수학적인 개념을 코드로 옮기는 것. 수학을 깔끔하게 처리할 수록 코드도 깔끔해짐. 때문에 이 챕터에서는 철저히 "그래픽스에 맞는" 수학에 집중함. 주로 고등학교/대학교에서 배우는 내용을 다시 보게 될 것이며 튜토리얼보다는 참고용으로 많이 쓰이게 될 것.
이 개념들이 여기저기 마구잡이로 흩어져 있는 개념처럼 보일 수 있고, 실제로 그러함. 각 개념은 표준 수학 교육과정에서 약간 이례적이고 그래픽스에 매우 중요한 개념이며, 기하학적인 관점에서 다뤄지지 않는 개념임. 이 챕터에서는 삼각형의 중심 좌표 (barycentric coordinate)처럼 대학 학부생 과정에서 간단하게만 알고 넘어가는 개념들을 강조하여 이 책의 표기법들을 리뷰함. 개념을 완벽하게 짚고 넘어가는 대신 직관이나 기하학적인 해석을 강조함.
그 중 선형대수 (linear algebra)에 대한 내용은 변환 행렬을 다룬 뒤 5장에서 다룰 예정임. 이 장은 수학 개념과 친해지고자 만든 장이므로 훑어보도록 하고, 나중에 필요한 경우 이 장으로 다시 돌아와서 보면 됨.

2.1. 집합과 매핑

매핑 (mapping): 함수 (function)라고도 하며, 수학과 프로그래밍의 기본임.

프로그램 안에 함수가 있는 것처럼 수학에서의 매핑은 한 타입 (type)의 인수를 가져와 특정 타입의 객체에 매핑하는 것. 프로그램에서는 "타입"이라고 하고, 수학에서는 집합 (set)이라고 함.

집합의 멤버에 해당하는 객체를 표시할 때 기호를 사용함.
예를 들어, aSa \in S는 "a는 집합 S의 원소"라는 뜻.

두 집합 A, B가 주어졌을 때 두 집합에 대한 데카르트 곱 (cartesian product)을 정의할 수 있음.
A, B의 데카르트 곱 A x BaAa \in A이고 bBb \in Ba, b에 대해 가능한 모든 (a, b) 순서쌍으로 구성됨. A x A는 A2A^2으로 짧게 표기할 수 있음. 데카르트 곱을 확장하면 여러 임의 집합 (arbitrarily set)에서 만들어진 임의의 긴 순서 튜플 (ordered tuple)에 대해 3개의 집합을 뽑아 가능한 모든 순서 트리플 (triple) (a, b, c)을 만들 수 있음.

알아두면 좋은 집합:

  • R\R: 실수
  • R+\R^+: 양의 실수 (0 포함)
  • R2\R^2: 2D 실수 평면에서의 순서쌍
  • Rn\R^n: n차 데카르트 공간상의 점
  • Z\Z: 정수
  • S2S^2: (R3\R^3의) 3차원 점 (단위 구에 속한)

S2S^2이 3차원 공간에 있는 점들로 구성되어 있지만, 2개의 변수로 매개변수화 (parameterized)된 표면에 있으므로 2D 집합으로 볼 수 있음.

매핑 표기법은 화살표 (→)와 콜론 (:)을 사용함.
f:RZ,f:\R \rightarrow \Z,
"실수를 입력으로 받아 정수에 매핑함."

이때 화살표 왼쪽에 있는 집합을 함수의 정의역 (domain)이라고 하며, 오른쪽에 있는 집합을 함수의 공역 (codomain, target)이라고 함.
컴퓨터 프로그래머에게 잘 맞는 해석 → "함수 f는 실수 인자를 받아 정수를 리턴한다."
실제로 이 표기법은 프로그래밍에서의 표기법과 유사함.

int f(real)

f(a)f(a)a의 상 (image)라고 하며, 집합 A의 상은 A의 모든 점에 대한 상을 포함하는 공역의 부분집합임. 또한 모든 정의역의 상은 함수의 치역 (range)임.

2.1.1. 역 매핑 (inverse mapping)

f:ABf:A\rightarrow B라는 함수가 있다고 가정하면 f의 역함수 (inverse function) f1:BAf^{-1}:B\rightarrow A
이 정의는 모든 bBb \in B가 함수 f에 존재하는 어떤 점의 상이고 (치역 == 공역), 그 점이 유일할 때 (f(a)=bf(a)=b인 a가 하나만 존재)에만 적용됨. 이러한 매핑이나 함수를 전단사 (bijection)라고 함.

전단사는 모든 aAa\in A를 유일한 bBb\in B에 매핑하며, 모든 bBb\in B에 대해 f(a)=bf(a)=b를 만족하는 오직 하나의 aAa\in A만 존재함. 전단사가 아닌 함수는 역함수가 될 수 없음.

전단사의 한 예는 f(x)=x3f(x)=x^3와 같은 f:RRf:\R\rightarrow \R 함수임. 이것의 역함수는 f1(x)=x3f^{-1}(x)= \sqrt[3]{x}
여기서 변수 xx는 존재하긴 하지만 실제로 쓰이지는 않는 가변수 (dummy variable)이며, 때문에 y=f(x)y=f(x)x=f1(y)x=f^{-1}(y)처럼 표기하는 것이 더 직관적일 수 있음. (y=x3y=x^3, x=x3x=\sqrt[3]{x}는 더 직관적임)

역함수를 갖지 않는 대표적인 함수는 sqr:RRsqr: \R\rightarrow \R임. (sqr(x)=x2sqr(x)=x^2)
why?
1. x2=(x)2x^2=(-x)^2
2. 공역의 음수 부분에 매핑된 정의역의 요소가 없음.

다만 정의역과 치역의 범위를 R+\R^+로 제한한다면 역함수를 정의할 수 있음. 그 경우 역함수는 x\sqrt{x}임.

2.1.2. 구간 (interval)

종종 함수에서 제한된 실수 값을 다뤄야 하는 경우가 있음. 값에 제한을 두는 방법 중 하나는 구간 (interval)을 정의하는 것. 가령 0과 1 사이의 실수로 제한하는 것. (0, 1은 포함하지 않음) → (0, 1)로 표현함. 각 끝점을 포함하지 않기 때문에 열린 구간 (open interval)이라고 함. 그 반대는 닫힌 구간 (closed interval). → [0, 1]
두 개를 같이 쓸 수도 있음 → [0, 1) → 0은 포함, 1은 포함하지 않음

구간 [a, b]가 있을 때 aba \le b여야 함.

데카르트 곱은 구간을 표현할 때 종종 사용됨. 예를 들어, 점 xx가 3차원의 단위 cube일 때, x[0,1]3x \in [0, 1]^3처럼 표현할 수 있음.

구간은 교집합, 합집합, 차집합 같은 집합 연산과 함께 사용할 수 있음.

  • 교집합: \cap
  • 합집합: \cup

ex) [3,5)[4,6]=[4,5)[3,5)\cap [4,6]=[4,5), [3,5)[4,6]=[3,6][3,5)\cup [4,6]=[3,6]

교집합, 합집합과 달리 차집합은 연산자 앞뒤로 오는 집합의 순서에 따라 결과가 달라짐.
차집합 연산자: -
ex) [3,5)[4,6]=[3,4)[3,5)-[4,6]=[3,4), [4,6][3,5)=[5,6][4, 6] − [3, 5) = [5, 6]

이러한 연산은 그림으로 그리면 더 쉽게 파악할 수 있음.

2.1.3. 로그

예전에는 로그 (logarithm)를 활용하여 지수 항을 갖는 방정식을 유용하게 풀 수 있었음.
모든 로그에는 밑 (base)이 존재함.

y=logaxay=xy=\log_ax \leftrightarrow a^y=x

밑이 aa인 로그 함수와 aa의 지수함수는 역함수 관계임.

몇 가지 정의:
aloga(x)=xa^{\log_a(x)}=x
loga(ax)=x\log_a(a^x)=x
loga(xy)=logax+logay\log_a(xy)=\log_ax+\log_ay
loga(x/y)=logaxlogay\log_a(x/y)=\log_ax-\log_ay
logax=logablogbx\log_ax=\log_ab\log_bx

로그에 미적분 (calculus)을 적용할 수 있음.
자연상수 e=2.718e=2.718\cdots을 밑으로 하는 로그를 자연로그 (natural logarithm)라고 함. → lnxlogex\ln x\equiv\log_ex
이때 "≡" 기호는 "동일한 정의를 갖는다."를 의미함. (논리적 동치)
종종 밑을 생략하고 logx\log x처럼 표기하는 경우도 있음. 예를 들어, 천문학자들은 밑이 10인 로그를 많이 사용하고, 컴퓨터 과학자들은 밑이 2인 로그를 많이 사용함.
컴퓨터 그래픽스에서는 다른 분야의 기술들을 참조하는 경우가 많기 때문에 이러한 생략은 피할 것임.

로그 함수와 지수 함수의 미분 (derivative)은 자연 로그가 "자연" 로그인 이유를 밝힘.
ddxlogax=1xlna\frac{d}{dx}\log_ax = \frac{1}{x\ln a}
ddxax=axlna\frac{d}{dx}a^x=a^x\ln a

2.2. 2차방정식 풀이

2차 방정식은 Ax2+Bx+C=0Ax^2+Bx+C=0의 형태를 지님.
xx미지수 (unknown)이고, A,B,CA,B,C상수 (constant)임.
y=Ax2+Bx+Cy=Ax^2+Bx+Cxyxy 2차원 평면을 생각해보면, 이 방정식의 해 (solution)yy가 "0에서 만나는 지점" (zero crossing)에 있는 모든 xx값임.
이 방정식이 포물선 (parabola)을 그리기 때문에 x축과 만나지 않거나 1개 혹은 2개의 교점을 가질 수 있으므로 0, 1, 2개의 실수 해를 가질 수 있음.

방정식 풀이 과정
1. 양 변을 AA로 나눈다.
x2+BAx+CA=0x^2+\frac{B}{A}x+\frac{C}{A}=0
2. 완전제곱식을 완성한다.
(x+B2A)2B24A2+CA=0(x+\frac{B}{2A})^2-\frac{B^2}{4A^2}+\frac{C}{A}=0
3. 상수항을 우변으로 보낸 뒤 제곱근을 취한다.
x+B2A=±B24A2CAx+\frac{B}{2A}=\pm\sqrt{\frac{B^2}{4A^2}-\frac{C}{A}}
4. B2A\frac{B}{2A}를 양 변에서 빼준다.
x=B±B24AC2Ax=\frac{-B\pm\sqrt{B^2-4AC}}{2A}

여기서 ±\pm이라는 기호의 뜻은 +, -의 2가지 해가 존재한다는 의미임.
실수인 해가 존재하는지 판별하는 판별식 (discirminant) DB24ACD\equiv B^2-4AC
D>0D>0인 경우 2개의 실근이 존재하며 D=0D=0인 경우 1개의 실근, D<0D<0인 경우 실근이 존재하지 않는다는 뜻임.

ex) 2x2+6x+4=02x^2+6x+4=0의 해는 x=1,2x=-1, -2의 2개이지만 (D=4D=4) x2+x+1=0x^2+x+1=0의 실근은 존재하지 않음. (D=3D=-3)

2.3. 삼각법

그래픽스에서 삼각법 (trigonometry)의 기초적인 개념을 종종 사용함.

2.3.1. 각

일상 속에서 각도를 많이 사용해서 익숙하지만, 구 (sphere)에서의 각을 이해하기 위해 각의 기본 정의를 다시 볼 필요가 있음.

2개의 반직선 (half-line), 혹은 방향 (direction) 사이에 각 (angle)이 만들어짐. 또한 각도는 단위 원 (unit circle)에서 잘라낸 호 (arc)의 길이로 정의됨.

각도를 정의할 때에는 일반적으로 짧은 호의 길이를 사용하며, 각의 부호는 두 직선이 나타난 순서에 따라 결정됨. 이 정의에 따르면 모든 각은 [π,π][-\pi,\pi] 사이에 존재함.

호의 길이를 기준으로 하는 각의 단위를 라디안 (radian)이라고 함.
라디안과 도 (degree)의 관계:
1°=180π×radian1\degree=\frac{180}{\pi}\times radian
1 radian=π180×degree1 \ radian=\frac{\pi}{180}\times degree

2.3.2. 삼각함수

세 변의 길이가 각각 a,o,ha,o,h인 직각삼각형이 주어졌다고 가정. 이때 hh를 가장 긴 변, 즉 빗변 (hypotenuse)이라고 하면 피타고라스의 정리 (pythagorean theorem)에 따라 다음과 같은 관계를 얻을 수 있음.
a2+o2=h2a^2+o^2=h^2

Φ\Phi에 대한 삼각함수는 다음과 같음.
sinΦ=oh\sin\Phi=\frac{o}{h}
cscΦ=ho\csc\Phi=\frac{h}{o}
cosΦ=ah\cos\Phi=\frac{a}{h}
secΦ=ha\sec\Phi=\frac{h}{a}
tanΦ=oa\tan\Phi=\frac{o}{a}
cotΦ=ao\cot\Phi=\frac{a}{o}

이 정의를 활용하면 극좌표계 (polar coordinate)를 설정할 수 있음.

극좌표계: 원점으로부터의 거리와 x축 양의 부호로 결정되는 좌표계

극좌표계에서 각도의 범위는 (π,π](-\pi,\pi]이고 양의 x축으로부터 반시계 방향으로 각도를 결정함.
이 규칙은 다소 임의적이지만 그래픽스에서 자주 사용하므로 기억해 두는 것이 좋음.

삼각함수는 주기적 (periodic)이며 어떤 각도도 인자로 받을 수 있음. ex) sin(A)=sin(A+2π)\sin(A)=\sin(A+2\pi)
이 때문에 삼각함수는 정의역 R\R에서 not invertible (가역성 X)함. 이 문제는 표준 역함수의 범위를 제한하여 피할 수 있으며, 대부분의 현대 수학 라이브러리에서는 이를 지원함. 각 삼각함수의 역함수에 대한 정의역 범위는 다음과 같음.
asin: [1,1][π2,π2][-1,1]\rightarrow[\frac{-\pi}{2},\frac{\pi}{2}]
acos: [1,1][0,π][-1,1]\rightarrow[0,\pi]
atan: R[π2,π2]\R\rightarrow[\frac{-\pi}{2},\frac{\pi}{2}]
atan2: R2[π,π]\R^2\rightarrow[-\pi,\pi]

atan2(s,c)는 매우 유용하게 쓰임. sinA\sin A에 비례하는 ss 값과 cosA\cos A를 같은 인자로 스케일링하고 AA를 반환하는 cc 값을 사용함. 인자는 양수로 가정함.

2.3.3. 유용한 항등식

유용하게 쓸만한 삼각함수 항등식 (trigonometric identity)이 존재함.

이동 정리 (shifting)
sin(A)=sinA\sin(-A)=-\sin A

cos(A)=cosA\cos(-A)=\cos A

tan(A)=tanA\tan(-A)=-\tan A

sin(π2A)=cosA\sin(\frac{\pi}{2}-A)=\cos A

cos(π2A)=sinA\cos(\frac{\pi}{2}-A)=\sin A

tan(π2A)=cotA\tan(\frac{\pi}{2}-A)=\cot A

피타고라스의 정리 (pythagorean)
sin2A+cos2A=1\sin^2A+\cos^2A=1

sec2Atan2A=1\sec^2A-\tan^2A=1

csc2Acot2A=1\csc^2A-\cot^2A=1

덧셈 & 뺄셈 정리 (addition and subtraction)
sin(A+B)=sinAcosB+sinBcosA\sin(A+B)=\sin A\cos B+\sin B\cos A

sin(AB)=sinAcosBsinBcosA\sin(A-B)=\sin A\cos B-\sin B\cos A

sin(2A)=2sinAcosA\sin(2A)=2\sin A\cos A

cos(A+B)=cosAcosBsinAsinB\cos(A+B)=\cos A\cos B-\sin A\sin B

cos(AB)=cosAcosB+sinAsinB\cos(A-B)=\cos A\cos B+\sin A\sin B

cos(2A)=cos2Asin2A\cos(2A)=\cos^2 A-\sin^2 A

tan(A+B)=tanA+tanB1tanAtanB\tan(A+B)=\frac{\tan A+\tan B}{1-\tan A\tan B}

tan(AB)=tanAtanB1+tanAtanB\tan(A-B)=\frac{\tan A-\tan B}{1+\tan A\tan B}

tan(2A)=2tanA1tan2A\tan(2A)=\frac{2\tan A}{1-\tan^2A}

반각 공식 (half-angle)
sin2(A2)=1cosA2\sin^2(\frac{A}{2})=\frac{1-\cos A}{2}

cos2(A2)=1+cosA2\cos^2(\frac{A}{2})=\frac{1+\cos A}{2}

곱 → 합 공식 (product)
sinAsinB=cos(A+B)cos(AB)2\sin A\sin B=-\frac{\cos(A+B)-\cos(A-B)}{2}

sinAcosB=sin(A+B)+sin(AB)2\sin A\cos B=\frac{\sin(A+B)+\sin(A-B)}{2}

cosAcosB=cos(A+B)+cos(AB)2\cos A\cos B=-\frac{\cos(A+B)+\cos(A-B)}{2}

직각삼각형이 아닌 경우 다음과 같은 공식을 적용할 수 있음.

(a,b,ca,b,c는 변, A,B,CA,B,C는 각도)
사인 법칙 (law of sines)
sinAa=sinBb=sinCc\frac{\sin A}{a}=\frac{\sin B}{b}=\frac{\sin C}{c}

코사인 법칙 (law of cosines)
c2=a2+b22abcosCc^2=a^2+b^2-2ab\cos C

탄젠트 법칙 (law of tangents)
a+bab=tan(A+B2)tan(AB2)\frac{a+b}{a-b}=\frac{\tan(\frac{A+B}{2})}{\tan(\frac{A-B}{2})}

이 삼각형의 넓이는 14(a+b+c)(a+b+c)(ab+c)(a+bc)\frac{1}{4}\sqrt{(a+b+c)(-a+b+c)(a-b+c)(a+b-c)}

2.4. 벡터

벡터 (vector)길이와 방향을 가지며, 이 때문에 화살표로 표현하면 좋음.
두 벡터의 길이와 방향이 모두 같다면 두 벡터는 서로 같다고 할 수 있음.

대부분의 경우 벡터를 화살표로 표시하고 사용하지만 프로그래밍에서는 벡터를 숫자로 표현해야 하는 경우가 있고, 이는 보통 저수준의 (low-level) 벡터 연산에 해당됨.
벡터는 a\textbf{a}처럼 굵은 글씨로 표현함. 벡터의 길이는 a||\textbf{a}||.
영벡터 (zero vector)는 길이가 0인 벡터를 말함. 영벡터의 방향은 정의할 수 없음.

벡터는 많은 곳에서 쓰일 수 있는데, 그 중 하나가 변위, 혹은 오프셋 (displacement, offset)임.

"동쪽으로 두 걸음, 북쪽으로 세 걸음 가면 보물을 발견할 수 있을 것이다."
이 경우 오프셋은 알 수 있지만 시작점이 어디인지 알 수는 없음. (어디서 출발해야 함?)

또한 벡터는 위치 (location, position, point) 표현에도 사용할 수 있음. 위치는 다른 위치의 변위로 나타낼 수 있음. but 위치는 벡터가 아님. 반면 오프셋은 벡터임.

2.4.1. 벡터 연산

익히 알고 있는 산술 연산 (더하기, 빼기 등)을 벡터에 적용할 수 있음.
두 벡터는 길이와 방향이 같은 경우 서로 같다고 할 수 있으며, 평행사변형 규칙 (parallelogram rule)에 따라 더할 수 있음. 한 벡터의 꼬리 (tail)를 다른 벡터의 머리 (head)에 이어붙여서 덧셈을 수행함.

두 벡터 이외에 "삼각형을 완성하는" 벡터가 바로 두 벡터의 합임.

벡터의 덧셈은 교환 가능함. (commutative)
a+b=b+a\text{a}+\text{b}=\text{b}+\text{a}
이는 우리가 일반적으로 예상할만한 것을 공식으로 나타낸 것.

a-\textbf{a}a\textbf{a}와 반대 방향의 벡터임. (길이는 같음) 이를 이용하면 뺄셈도 덧셈처럼 정의할 수 있음.
baa+b\text{b}-\text{a}\equiv-\text{a}+\text{b}


(벡터의 뺄셈을 평행사변형 규칙으로 표현한 것)

벡터의 은 여러 가지로 나뉨.
벡터에 단순히 실수를 곱하는 것을 scale이라고 하며, 이때 방향은 바뀌지 않고 길이만 변함.
두 벡터끼리 곱하는 것은 내적 (dot product)과 외적 (cross product)으로 나뉨. (5장에서 자세히 볼 예정)

2.4.2. 벡터에서의 데카르트 좌표

모든 2차원 벡터는 평행하지 않은 두 개의 nonzero 벡터로 표현할 수 있음. 이러한 두 벡터의 성질을 선형 독립 (linear independence)이라고 함. 선형 독립 관계인 두 벡터는 2차원 기저 (basis)를 이루며, 이 때문에 기저 벡터 (basis vector)라고 함.

예를 들어, 벡터 c\textbf{c}는 기저 벡터 a\textbf{a}, b\textbf{b}의 조합으로 나타낼 수 있음.
c=aca+bcb\textbf{c}=a_c\textbf{a}+b_c\textbf{b}

이때 aca_cbcb_c는 유일함.

두 벡터가 직교 (orthogonal)할 때 기저를 유용하게 사용할 수 있음. 또한 두 벡터가 정규 직교 (orthonormal)하는 단위벡터일 때 더욱 유용함.

만약 x\textbf{x}, y\textbf{y}라는 특수 벡터를 알고 있다면 각 벡터가 2개의 실수로 표현되는 데카르트 좌표계 (cartesian coordinate system)의 모든 벡터를 표현할 수 있음.
a=xax+yay\textbf{a}=x_a\textbf{x}+y_a\textbf{y}
이때 xa,yax_a,y_a는 2D 벡터 a\textbf{a}의 실수인 데카르트 좌표임.

기저 벡터가 정규 직교가 아니라면 이 식은 단순 방정식과 다르지 않음.

물론 데카르트 좌표계의 장점은 존재함. 예를 들어, 피타고라스 정리에 의해 벡터 a\textbf{a}의 길이 a=xa2+ya2||\textbf{a}||=\sqrt{x_a^2+y_a^2}임.

데라르트 좌표계를 이용하면 내적, 외적, 데카르트 좌표 등을 쉽게 계산할 수 있음.

일반적으로 좌표를 표현할 때 순서쌍 (xa,ya)(x_a,y_a)이나 열 행렬 (column matrix) a=[xaya]\textbf{a}= \begin{bmatrix} x_a \\ y_a \end{bmatrix}로 표현함. 쓸 때마다 쓰기 편한 방식으로 쓰면 됨.

가끔 벡터를 행 행렬 (row matrix)로 표현하는 경우가 있는데, 이때의 기호는 aT\textbf{a}^T임.
aT=[xa ya]\textbf{a}^T= \begin{bmatrix} x_a \ y_a \end{bmatrix}

2D 뿐만 아니라 3D, 4D, ... 등의 벡터도 데카르트 좌표로 표현할 수 있음. 특히 3D 벡터를 표현할 때에는 x,y\textbf{x},\textbf{y} 벡터에 모두 직교하는 기저 벡터 z\textbf{z}를 사용함.

2.4.3. 내적

두 벡터를 서로 곱하는 가장 간단한 방법은 내적 (dot product)임. 벡터 a,b\textbf{a},\textbf{b}의 내적은 ab\textbf{a}\cdot\textbf{b}로 표시할 수 있고, 계산 결과가 스칼라 값이기 때문에 스칼라곱 (scalar product)이라고도 함.
ab=a b cosϕ\textbf{a}\cdot\textbf{b}=||\textbf{a}|| \ ||\textbf{b}|| \ \cos\phi

그래픽스에서는 주로 두 벡터가 이루는 각도의 코사인 값을 구할 때 내적을 사용함.

또한 내적은 다른 벡터로의 사영 (projection)을 찾을 때 사용됨. 벡터 a\textbf{a}의 사영 ab\textbf{a}\rightarrow\textbf{b}은 직각으로 벡터 b\textbf{b} 사영된 벡터임.
ab=acosϕ=abb\textbf{a}\rightarrow\textbf{b}=||\textbf{a}||\cos\phi=\frac{\textbf{a}\cdot\textbf{b}}{||\textbf{b}||}

내적은 익히 알고 있는 실수 연산을 대부분 따름.
ab=ba\textbf{a}\cdot\textbf{b}=\textbf{b}\cdot\textbf{a}
a(b+c)=ab+ac\textbf{a}\cdot(\textbf{b}+\textbf{c})=\textbf{a}\cdot\textbf{b}+\textbf{a}\cdot\textbf{c}
(ka)b=a(kb)=kab(k\textbf{a})\cdot\textbf{b}=\textbf{a}\cdot(k\textbf{b})=k\textbf{a}\cdot\textbf{b}

두 2차원 벡터 a,b\textbf{a},\textbf{b}가 데카르트 좌표로 표현되었다면, xx=yy=1\textbf{x}\cdot\textbf{x}=\textbf{y}\cdot\textbf{y}=1xy=0\textbf{x}\cdot\textbf{y}=0이라는 성질을 이용하여 a,b\textbf{a},\textbf{b}의 내적을 구할 수 있음.
ab=(xax+yay)(xbx+yby)         =xaxb(xx)+xayb(xy)+xbya(yx)+yayb(yy)         =xaxb+yayb\textbf{a}\cdot\textbf{b}=(x_a\textbf{x}+y_a\textbf{y})\cdot(x_b\textbf{x}+y_b\textbf{y}) \\ \ \ \ \ \ \ \ \ \ =x_ax_b(\textbf{x}\cdot\textbf{x})+x_ay_b(\textbf{x}\cdot\textbf{y})+x_by_a(\textbf{y}\cdot\textbf{x})+y_ay_b(\textbf{y}\cdot\textbf{y}) \\ \ \ \ \ \ \ \ \ \ =x_ax_b+y_ay_b

3차원 벡터도 이와 비슷함.
ab=xaxb+yayb+zazb\textbf{a}\cdot\textbf{b}=x_ax_b+y_ay_b+z_az_b

2.4.4. 외적

외적 a×b\textbf{a}\times\textbf{b}는 주로 3차원 벡터에서만 사용됨. 외적은 인수로 갖는 두 벡터와 서로 직각인 3차원 벡터를 반환함. 외적으로 나온 벡터의 길이는 sinϕ\sin\phi와 관련이 있음.
a×b=a bsinϕ||\textbf{a}\times\textbf{b}||=||\textbf{a}|| \ ||\textbf{b}||\sin\phi
크기 (magnitude) a×b||\textbf{a}\times\textbf{b}||a,b\textbf{a}, \textbf{b}로 이루어진 평행사변형의 넓이와 같음. 또한 a×b\textbf{a}\times\textbf{b}는 벡터 a,b\textbf{a}, \textbf{b}모두 직교함.

정의에 의해 x축, y축, z축 벡터는 다음과 같이 주어짐.
x=(1,0,0)y=(0,1,0)z=(0,0,1)\textbf{x}=(1,0,0) \\ \textbf{y}=(0,1,0) \\ \textbf{z}=(0,0,1)
이때 x×y\textbf{x}\times\textbf{y}는 반드시 z\textbf{z}의 양 혹은 음 방향에 있어야 하며, 이 때문에 일반적으로 이렇게 표현함.
z=x×y\textbf{z}=\textbf{x}\times\textbf{y}

위에서 정의한 세 가지 단위 벡터의 모든 조합:
x×y=+zy×x=zy×z=+xz×y=xz×x=+yx×z=y\textbf{x}\times\textbf{y}=+\textbf{z} \\ \textbf{y}\times\textbf{x}=-\textbf{z} \\ \textbf{y}\times\textbf{z}=+\textbf{x} \\ \textbf{z}\times\textbf{y}=-\textbf{x} \\ \textbf{z}\times\textbf{x}=+\textbf{y} \\ \textbf{x}\times\textbf{z}=-\textbf{y}

sinϕ\sin\phi의 성질에 따라, 벡터 자신에 외적을 취하면 영벡터가 됨.x×x=0\textbf{x}\times\textbf{x}=\textbf{0}임.
외적은 교환 가능하지 않음.x×yy×x\textbf{x}\times\textbf{y}\ne\textbf{y}\times\textbf{x}

일반적으로 벡터 x\textbf{x}가 동쪽, y\textbf{y}가 북쪽을 가리키는 경우 z\textbf{z}위쪽을 가리킴. 이를 오른손 좌표계 (right-handed coordinate system)라고 함.

외적의 또다른 성질은 다음과 같음.
a×(b+c)=a×b+a×ca×(kb)=k(a×b)\textbf{a}\times(\textbf{b}+\textbf{c})=\textbf{a}\times\textbf{b}+\textbf{a}\times\textbf{c} \\ \textbf{a}\times(k\textbf{b})=k(\textbf{a}\times\textbf{b})
또한 오른손 법칙에 따라 a×b=(b×a)\textbf{a}\times\textbf{b}=-(\textbf{b}\times\textbf{a})

데카르트 좌표계에서는 외적을 구할 때 다음 과정을 따름.
a×b=(xax+yay+zaz)×(xbx+yby+zbz)           =xaxbx×x+xaybx×y+xazbx×z+yaxby×x+yayby×y+yazby×z+zaxbz×x+zaybz×y+zazbz×z           =(yazbzayb)x+(zaxbxazb)y+(xaybyaxb)z\textbf{a}\times\textbf{b}=(x_a\textbf{x}+y_a\textbf{y}+z_a\textbf{z})\times(x_b\textbf{x}+y_b\textbf{y}+z_b\textbf{z}) \\ \ \ \ \ \ \ \ \ \ \ \ =x_ax_b\textbf{x}\times\textbf{x}+x_ay_b\textbf{x}\times\textbf{y}+x_az_b\textbf{x}\times\textbf{z}+y_ax_b\textbf{y}\times\textbf{x}+y_ay_b\textbf{y}\times\textbf{y}+y_az_b\textbf{y}\times\textbf{z}+z_ax_b\textbf{z}\times\textbf{x}+z_ay_b\textbf{z}\times\textbf{y}+z_az_b\textbf{z}\times\textbf{z} \\ \ \ \ \ \ \ \ \ \ \ \ =(y_az_b-z_ay_b)\textbf{x}+(z_ax_b-x_az_b)\textbf{y}+(x_ay_b-y_ax_b)\textbf{z}

따라서 외적을 좌표 형태로 표현하면 다음과 같음.
a×b=(yazbzayb, zaxbxazb, xaybyaxb)\textbf{a}\times\textbf{b}=(y_az_b-z_ay_b,\ z_ax_b-x_az_b,\ x_ay_b-y_ax_b)

2.4.5. 정규 직교 기저와 좌표계

그래픽스에서 좌표계를 다루는 것은 매우 중요한 일이고, 그 중에서도 중요한 일은 정규 직교 기저 (orthonormal base)를 다루는 것임.
2개의 2차원 벡터 u,v\textbf{u},\textbf{v}가 있을 때, 두 벡터가 서로 직교하고 단위 길이인 경우 정규 직교 기저를 형성함.

따라서 u=v=1||\textbf{u}||=||\textbf{v}||=1이고, uv=0\textbf{u}\cdot\textbf{v}=0임.

3차원 벡터의 경우 u,vw\textbf{u},\textbf{v}\textbf{w}가 정규 직교 기저를 형성할 때
u=v=w=1uv=vw=wu=0||\textbf{u}||=||\textbf{v}||=||\textbf{w}||=1 \\ \textbf{u}\cdot\textbf{v}=\textbf{v}\cdot\textbf{w}=\textbf{w}\cdot\textbf{u}=0
이때 오른손 법칙을 따르면 w=u×v\textbf{w}=\textbf{u}\times\textbf{v}이고, 반대의 경우는 왼손 법칙을 따름.

데카르트 좌표계에서의 정규 직교 기저는 무한히 존재하는 정규 직교 기저들 중 하나임.
정규 직교 기저와 그것의 원점 위치가 프로그램 내부에서는 low-level 표현으로 사용됨. 따라서 세 벡터 x,y,z\textbf{x},\textbf{y},\textbf{z}는 절대 명시적으로 저장되지 않고 표준 원점 위치인 o\textbf{o}도 아님.
전역 모델은 일반적으로 표준 좌표계에 저장되고, 이를 전역 좌표계 (global coordinate system)라고 함.
but 원점 p\textbf{p}와 정규 직교 기저 벡터 u,v,w\textbf{u},\textbf{v},\textbf{w}를 갖는 다른 좌표계를 사용하려고 한다면, 이를 위해 벡터들을 명시적으로 저장함. 이러한 시스템을 기준틀 (frame of reference) 혹은 좌표틀 (coordinate frame)이라고 함.

예를 들어 비행 시뮬레이터를 개발한다고 가정. 이때 좌표계는 비행기의 머리 부분에 붙어 있어야 하고, 정규 직교 기저는 비행기에 맞춰짐. 동시에 마스터 표준 좌표계도 가질 수 있음. 즉, 비행기에 맞는 좌표계와 world에 맞는 좌표계가 따로 존재한다는 뜻.

이처럼 특정 객체 (비행기 등)에 종속된 좌표계를 로컬 좌표계 (local coordinate system)라고 함.

low level에서 보면 로컬 프레임은 표준 좌표에 저장됨. 예를 들어, 좌표 (xu,yu,zu)(x_\textbf{u},y_\textbf{u},z_\textbf{u})를 갖는 벡터 u\textbf{u}는 다음과 같음.
u=xux+yuy+zuz\textbf{u}=x_\textbf{u}\textbf{x}+y_\textbf{u}\textbf{y}+z_\textbf{u}\textbf{z}

위치 (location)은 명시적으로 표준 원점으로부터의 오프셋을 포함함.
p=o+xpx+ypy+zpz\textbf{p}=\textbf{o}+x_\textbf{p}\textbf{x}+y_\textbf{p}\textbf{y}+z_\textbf{p}\textbf{z}
이때 (xp,yp,zp)(x_\textbf{p},y_\textbf{p},z_\textbf{p})p\textbf{p} 벡터의 좌표임.

벡터 a\textbf{a}uvw\textbf{u}-\textbf{v}-\textbf{w} 프레임과 함께 저장한다면 순서쌍 (ua,va,wa)(u_a,v_a,w_a)을 다음과 같이 저장할 수 있음.
a=uau+vav+waw\textbf{a}=u_a\textbf{u}+v_a\textbf{v}+w_a\textbf{w}

표준 좌표계에 저장된 벡터 b\textbf{b}uvw\textbf{u}-\textbf{v}-\textbf{w} 좌표를 얻으려면 내적을 사용하면 됨.
ub=ubvb=vbwb=wbu_b=\textbf{u}\cdot\textbf{b} \\ v_b=\textbf{v}\cdot\textbf{b} \\ w_b=\textbf{w}\cdot\textbf{b}

u,v,w\textbf{u}, \textbf{v}, \textbf{w}가 정규 직교하기 때문에 다음과 같은 식이 성립함.
ub=ub(uu)+vb(uv)+wb(uw)=ub\textbf{u}\cdot\textbf{b}=u_b(\textbf{u}\cdot\textbf{u})+v_b(\textbf{u}\cdot\textbf{v})+w_b(\textbf{u}\cdot\textbf{w})=u_b

행렬을 이용한 좌표계는 6.2.1, 6.5장에서 다룰 예정.

2.4.6. 단일 벡터로부터 기저 생성하기

종종 주어진 벡터로 정렬된 정규 직교 기저가 필요할 때가 있음. 즉 벡터 a\textbf{a}가 주어졌을 때 a\textbf{a}와 같은 방향을 가리키는 w\textbf{w} 벡터를 포함하여 정규 직교 벡터 u,v,w\textbf{u}, \textbf{v},\textbf{w}를 필요로 함. (u,v\textbf{u}, \textbf{v}는 크게 신경쓸 필요 없음) 다만 하나의 벡터만으로는 문제를 해결하기 충분하지 않고, 가능한 기저들 중 하나를 찾을 수 있는 강력한 절차가 필요함.

외적을 사용하면 해결이 가능함. 먼저 w\textbf{w}a\textbf{a}와 같은 방향을 갖는 단위벡터로 만들어야 함.
w=aa\textbf{w}=\frac{\textbf{a}}{||\textbf{a}||}

그런 다음 w\textbf{w}와 한 직선 상에 있지 않은 벡터 textbfttextbf{t}를 고르고, 외적을 사용하여 w\textbf{w}에 수직인 단위벡터 u\textbf{u}를 만듦.
u=t×wt×w\textbf{u}=\frac{\textbf{t}\times\textbf{w}}{||\textbf{t}\times\textbf{w}||}

만약 t\textbf{t}w\textbf{w}와 같은 직선 상에 있으면 위 식에서 분모는 지워질 것이고, 거의 같은 선상에 있으면 계산 결과는 낮은 정밀도를 가짐.
w\textbf{w}와 완전히 다른 벡터를 찾는 간단한 방법은 w\textbf{w}와 동일하게 t\textbf{t}로 시작하고 t\textbf{t}에서 크기가 가장 작은 성분을 1로 바꾸는 것임.
예를 들어 w=(12,12,0)\textbf{w}=(\frac{1}{\sqrt{2}},\frac{-1}{\sqrt{2}},0)이면 t=(12,12,1)\textbf{t}=(\frac{1}{\sqrt{2}},\frac{-1}{\sqrt{2}},1)임.

w,u\textbf{w},\textbf{u}를 알고 있다면 기저를 완성하는 것은 간단함.
v=w×u\textbf{v}=\textbf{w}\times\textbf{u}

이러한 상황은 표면 셰이딩 (surface shading)에 사용됨. 이때 표면 법선에 정렬된 기저가 필요하지만 법선 주위의 회전은 중요하지 않음.

2.4.7. 두 개의 벡터로부터 기저 생성하기

주어진 벡터를 중심으로 기저의 회전이 중요하게 여겨질 때에도 2.4.6에 나온 개념을 사용할 수 있음. 간단한 예는 카메라의 기저를 생성하는 것. 카메라가 바라보고 있는 방향에 맞춰진 벡터를 구하는 것이 중요하지만, 그 벡터를 중심으로 한 카메라의 방향은 임의적이지 않고 특정 방법을 통해 구해야 함. 방향이 고정되고 나면 기저를 완벽하게 구할 수 있음.

프레임을 완벽하게 지정하는 간단한 방법은 두 벡터 a\textbf{a} (w\textbf{w}를 나타냄), b\textbf{b} (v\textbf{v}를 나타냄)를 제공하는 것임. 두 벡터가 직교한다면 u=b×a\textbf{u}=\textbf{b}\times\textbf{a}로 쉽게 세 번째 벡터를 얻을 수 있음.

결과로 나온 기저가 정규 직교한다는 것을 확실하게 하기 위해 입력 벡터가 정확하지 않더라도 1개의 벡터로부터 기저를 생성하는 방법과 유사하게 진행해야 함.
w=aau=b×wb×wv=w×u\textbf{w}=\frac{\textbf{a}}{||\textbf{a}||} \\ \textbf{u}=\frac{\textbf{b}\times\textbf{w}}{||\textbf{b}\times\textbf{w}||} \\ \textbf{v}=\textbf{w}\times\textbf{u}

사실 이 방법은 a,b\textbf{a}, \textbf{b} 벡터가 직교하지 않을 때 제대로 동작함. 이 경우 w\textbf{w}a\textbf{a}와 같은 방향으로 생성되며, v\textbf{v}w\textbf{w}에 수직인 모든 벡터 중 b\textbf{b}에 가장 가까운 벡터로 선택됨.

a\textbf{a}b\textbf{b}가 동일선상에 있지 않으면 이 방법은 사용할 수 없음. 이 경우 b\textbf{b}a\textbf{a}에 수직인 방향을 고르는 데 도움이 되지 않음. (모든 방향에 수직이기 때문)

카메라의 위치를 지정하는 예시를 보면, (4.3에서 자세히 다룸) 카메라가 보고 있는 방향과 평행한 w\textbf{w} 벡터와 카메라의 상단 (top)을 가리키는 v\textbf{v} 벡터를 갖는 프레임을 생성하고자 함. 카메라를 똑바로 세우기 위해서는 카메라의 방향을 시점 방향 중심으로 설정하기 위한 참조 벡터로 직진 방향을 사용하여 시점 방향을 중심으로 하는 기저를 생성해야 함. 가능한 직진 방향에 가깝게 v\textbf{v}를 설정하는 것은 "카메라를 똑바로 서있게" 하는 직관적인 개념임.

2.4.8. 기저 다루기

종종 반올림 오류나 파일 저장의 낮은 정밀도로 인해 기저를 구했지만 그것이 정규 직교가 아닌 경우가 있음.
2.4.7에서 다뤘던 방법을 사용하여 단순히 w\textbf{w}, v\textbf{v}에서 새로운 기저를 생성하게 되면 그 기저는 직교하며 이전 것과 가까운 기저가 됨.

이러한 접근은 많은 응용에 사용되기 좋지만 최선의 방법은 아님. 이 방법은 정확히 직교하는 벡터를 생성하고 거의 비슷하게 직교하는 시작 기저의 경우 시작점에서 멀리 벗어나지 않는 결과를 도출함. but 이 방법은 비대칭적임.w\textbf{w}보다는 v\textbf{v}, v\textbf{v}보다는 u\textbf{u} 벡터를 선호함.
시작 기저와 가까운 기저를 선택하지만 가장 가까운 정규 직교 기저를 선택하리라는 보장은 없음. 이 경우 SVD (5.4.1에서 자세히 다룸)를 사용하여 원래 기저에 가장 가까운 정규 직교 기저를 선택할 수 있도록 보장할 수 있음.

2.5. 곡선과 표면

곡선의 기하학, 특히 표면 (surface)은 그래픽스에서 중심적인 역할을 하며, 이 장에서는 2차원, 3차원 공간에서의 곡선과 표면에 대한 기초를 살펴봄.

2.5.1. 2차원 암시적 곡선

직관적으로 보면, 곡선 (curve)은 "펜을 종이에서 떼지 않고 한 번에 그릴 수 있는 점들의 집합"임. 곡선을 설명하는 일반적인 방법은 암시적 방정식 (implicit equation)을 사용하는 것임.
2차원에서의 암시적 방정식은 f(x,y)=0f(x,y)=0의 형태임. 함수 f(x,y)f(x,y)는 실수를 반환하고, 함수의 값이 0이 되는 점 (x,y)(x,y)는 곡선 위에 존재하고 아닌 경우 곡선 위에 존재하지 않음. 예를 들어 함수 f(x,y)f(x,y)를 이렇게 정의할 수 있음.
f(x,y)=(xxc)2+(yyc)2r2f(x,y)=(x-x_c)^2+(y-y_c)^2-r^2
(xc,yc)(x_c,y_c)는 2차원 상의 점이고 rr은 0이 아닌 실수임. f(x,y)=0f(x,y)=0인 경우, 이 방정식을 만족하는 점들은 중심점이 (xc,yc)(x_c,y_c)이고 반지름 rr을 갖는 원 위에 있음.

이러한 방정식을 "암시적" 방정식이라고 하는 이유는 곡선 위의 점 (x,y)(x,y)을 방정식으로부터 바로 구할 수 없고 방정식을 풀어서 값을 결정해야 하기 때문. 따라서 곡선 위의 점들은 방정식에 의해 명시적으로 구할 수 없지만, 방정식에 암묵적으로 존재하게 됨.

함수 ff는 모든 (x,y)(x,y)에 대한 값을 가짐. ff를 지형이라고 생각하고 해수면이 f=0f=0이라고 가정함. 이때 해안 (shore)은 암시적 곡선 (implicit curve)이고, ff의 값은 고도 (altitude)를 의미함.

또한 곡선의 공간을 f>0,f<0,f=0f>0,f<0,f=0으로 각각 분할할 수 있음. 이 기준에 따라 특정 점이 곡선 "내부"에 존재하는지 판단함. f(x,y)=cf(x,y)=c는 모든 상수 cc에 대한 곡선이며, 일반적으로는 c=0c=0이 사용됨. 예를 들어, 방정식이 f(x,y)=x2+y21f(x,y)=x^2+y^2-1인 경우 변수 cc는 원점을 중심으로 하는 여러 원을 나타냄.

벡터를 사용하면 표기법을 간단하게 줄일 수 있음. 벡터 c=(xc,yc), p=(x,y)\textbf{c}=(x_c,y_c), \ \textbf{p}=(x,y)가 있다고 가정하면 중심점 c\textbf{c}와 반지름 rr을 갖는 원은 다음과 같이 나타낼 수 있음.
(pc)×(pc)r2=0(\textbf{p}-\textbf{c})\times(\textbf{p}-\textbf{c})-r^2=0
이 방정식은 대수적으로 확장하면 방정식이 되지만, 기하학적으로 생각하면 이 방정식이 "원의 방정식"임을 쉽게 알 수 있음. 이를 해석하면, "원 위에 있는 점 p\textbf{p}는 다음과 같은 성질을 갖는다: c\textbf{c}에서 p\textbf{p}로의 벡터는 그 자체로 r2r^2이라는 값을 가진다."

더 간단하게 보면 길이의 제곱은 c\textbf{c}에서 p\textbf{p}까지의 거리의 제곱임.
pc2r2=0||\textbf{p}-\textbf{c}||^2-r^2=0
또한, pcr=0||\textbf{p}-\textbf{c}||-r=0

이 식은 다음과 같이 해석할 수 있음.
"원 위에 있는 점 p\textbf{p}는 중심점 c\textbf{c}로부터의 거리 rr을 갖는 점들이다."
이렇듯 벡터로 표현하는 방식은 변수 x,yx,y를 갖는 데카르트 좌표보다 더 직관적임. 이 때문에 가능하면 벡터 형태를 사용하는 것이 좋음.

벡터 표현은 코드에서 벡터 클래스를 정의할 때에도 유용함. 벡터 형태를 사용하면 코드가 더욱 깔끔해짐. 벡터 지향 방정식 (vector-oriented equation)은 구현 과정에서 오류가 쉽게 발생하지 않음. 일단 벡터 타입을 구현하고 디버깅하고 나면 "자르기-붙여넣기" 과정에서의 오류 등은 발생하지 않음. 벡터로 표현하는 이 방식에 익숙해지기는 쉽지 않겠지만, 익숙해지고 나면 많은 장점들이 기다리고 있을 것.

2.5.2. 2차원 기울기

함수 f(x,y)f(x,y)를 높이가 f(x,y)f(x,y)인 높이 필드 (height field)라고 생각한다면 기울기 (gradient) 벡터는 최대 상승 방향을 가리킴. 기울기 벡터 f(x,y)\nabla f(x,y)는 다음과 같음.
f(x,y)=(fx,fy)\nabla f(x,y)=(\frac{\partial f}{\partial x},\frac{\partial f}{\partial y})

암시적 곡선 f(x,y)=0f(x,y)=0 위의 점에서의 기울기 벡터는 같은 점 위 곡선의 접선 벡터 (tangent vector)에 수직임. 이러한 벡터를 곡선의 법선 벡터 (normal vector)라고 함. 기울기가 상승하는 형태이기 때문에 f(x,y)>0f(x,y)>0인 방향을 나타냄.

높이 필드에서는 편미분과 기울기의 기하학적인 의미가 더 잘 보임. 점 (a,b)(a,b) 근처에 있는 f(x,y)f(x,y)가 평면이라고 가정하면 오르막 혹은 내리막 방향이 존재함.

이 방향과 수직인 방향은 평면과 수평을 이룸. 평면과 f(x,y)=0f(x,y)=0의 모든 교점은 방향과 수평임. 따라서 상승/하강 방향은 교차선 f(x,y)=0f(x,y)=0에 직교함.

편미분이 이와 관련되어있다는 것을 알기 위해서는 편미분의 기하학적인 의미를 시각화해야 함.

1차원 함수 y=g(x)y=g(x)의 미분은 다음과 같음.
dydx=limΔx0ΔyΔx=limΔx0g(x+Δx)g(x)Δx\frac{dy}{dx}=\lim_{\Delta x\to0}\frac{\Delta y}{\Delta x}=\lim_{\Delta x\to0}\frac{g(x+\Delta x)-g(x)}{\Delta x}

이를 gg에 대한 접선의 기울기라고 함.

편미분은 1차원 미분의 일반화. 2차원 함수 f(x,y)f(x,y)에서는 변수 xx에 따라 ff가 급격하게 변화할 수 있기 때문에 xx에 대한 같은 극한을 적용할 수 없음. 하지만 yy를 상수로 고정한다면 미분과 비슷한 편미분을 정의할 수 있음.

δfδxlimΔx0f(x+Δx,y)f(x,y)Δx\frac{\delta f}{\delta x}\equiv \lim_{\Delta x\to0}\frac{f(x+\Delta x,y)-f(x,y)}{\Delta x}


여기서 벡터 a\textbf{a}는 함수 ff의 변하지 않는 경로를 따라가는 벡터임. 위 그림에서 벡터 a=(Δx,Δy)\textbf{a}=(\Delta x, \Delta y)임.

이 상승 방향이 벡터 a\textbf{a}에 수직이기 때문에 내적의 결과는 0임.
(f)a(x,y)(xa,ya)=xΔx+yΔy=0(\nabla f)\cdot a\equiv (x\nabla,y\nabla)\cdot (x_a,y_a)=x\nabla \Delta x+y\nabla \Delta y=0

또한 ff(xa,ya)(x_a,y_a)에서의 변화량 또한 0임.
Δf=fxΔx+fyΔy=fxxa+fyya=0\Delta f=\frac{\partial f}{\partial x}\Delta x+\frac{\partial f}{\partial y}\Delta y=\frac{\partial f}{\partial x}x_a+\frac{\partial f}{\partial y}y_a=0

서로 수직인 벡터 (x,y)(x,y)(x,y)(x',y')이 주어지면 두 벡터 사이의 각도가 0°0\degree이기 때문에 내적의 결과는 0임. (즉 xx+yy=0xx'+yy'=0)
벡터가 (x,y)(x,y) 하나만 주어진 경우 (y,x),(y,x)(y,-x),(-y,x)와 같이 내적이 0이 되는 벡터를 쉽게 찾을 수 있음. 이를 일반화하면 (x,y)(x,y) 벡터는 k(y,x)k(y,-x) 벡터에 수직임. (kk는 0이 아닌 상수)
(xa,ya)=k(fy,fx)(x_a,y_a)=k(\frac{\partial f}{\partial y},-\frac{\partial f}{\partial x})

앞의 식과 결합하면
(x,y)=k(fx,fy)(x_\nabla,y_\nabla)=k'(\frac{\partial f}{\partial x},\frac{\partial f}{\partial y}) (kk는 0이 아닌 상수)

기울기 벡터 (2x,2y)(2x,2y)를 갖는 원의 방정식 x2+y21=0x^2+y^2-1=0을 생각해보면 원의 바깥 영역은 함수 f(x,y)=x2+y21f(x,y)=x^2+y^2-1가 0보다 큰 영역임. 기울기 벡터의 길이는 방정식의 계수에 따라 달라짐. 예를 들어 단위 원 (unit circle)이 방정식 Ax2+Ay2A=0Ax^2+Ay^2-A=0으로 표현된다면 (AA는 0이 아님) 기울기 벡터는 (2Ax,2Ay)(2Ax,2Ay)임. 이 벡터는 원에 직교하지만 길이는 AA에 의해 결정됨. A>0A>0인 경우 원의 바깥 영역을, A<0A<0인 경우 원의 내부를 가리킬 것.


2차원 암시적 직선

직선의 기울기-절편 (slope-intercept) 형태는 다음과 같음.
y=mx+by=mx+b

이 형태는 쉽게 암시적인 형태로 바꿀 수 있음.
ymxb=0y-mx-b=0

여기서 mm기울기 (slope), bb는 직선이 y축과 만나는 지점의 y값으로, y절편 (y-intercept)이라고 함. 이 직선은 2차원 평면을 분할하고, "내부/외부"보다 더 직관적인 "위/아래"라는 표현을 사용함.

방정식이 0이 되는 점을 바꾸지 않고 방정식에 어떠한 상수를 곱할 수 있기 때문에, kf(x,y)=0kf(x,y)=0은 0이 아닌 kk에 대해 같은 곡선 형태를 지님.

but 기울기-절편 형태로는 x=0x=0 같은 직선을 표현할 수 없음. (mm이 무한대로 증가해야 하기 때문) 이러한 이유로 Ax+By+C=0Ax+By+C=0과 같은 형태를 더 많이 씀. (A,B,CA,B,C는 실수)

대수적으로 문제가 발생할 때마다 기하학적인 개념을 사용하여 문제 해결에 도움을 줄 수 있음. 그 중 하나가 기울기임.
직선 Ax+By+C=0Ax+By+C=0이 있고, 이 직선의 기울기 벡터는 (A,B)(A,B)이며 이 벡터는 직선에 수직임. 또한 Ax+By+CAx+By+C가 양수인 영역을 향하고 있음.

직선 위의 점으로 만든 벡터 (x1x0,y1y0)(x_1-x_0,y_1-y_0)는 직선과 평행하므로 기울기 벡터와는 수직임.

A,B,CA,B,C는 무한히 많은 순서쌍이 존재할 수 있기 때문에 x0,y0x_0,y_0등을 이용한 식으로 바꿔줄 수 있음.
먼저 기울기 벡터 (A,B)=(y0y1,x1x0)(A,B)=(y_0-y_1,x_1-x_0)이므로

(y0y1)x+(x1x0)y+C=0(y_0-y_1)x+(x_1-x_0)y+C=0

또한 (x0,y0)(x_0,y_0)(x1,y1)(x_1,y_1)이 직선 위에 있으므로 위 식을 만족함. 따라서 x,yx,y에 각각을 대입하여 CC를 구할 수 있음.

C=x0y1x1y0C=x_0y_1-x_1y_0

따라서 바뀐 직선의 방정식은

(y0y1)x+(x1x0)y+x0y1x1y0=0(y_0-y_1)x+(x_1-x_0)y+x_0y_1-x_1y_0=0

이러한 방식으로 직선을 표현하는 것의 장점은 기울기-절편 형태로 바꾸기 쉽다는 것임. (yy가 없는 부분을 우항으로 옮기고 양변을 yy가 포함된 식으로 나누면 됨.)

y=y1y0x1x0x+x1y0x0y1x1x0y=\frac{y_1-y_0}{x_1-x_0}x+\frac{x_1y_0-x_0y_1}{x_1-x_0}

직선의 방정식은 점과 직선 사이의 거리를 구할 때에도 사용할 수 있음. Ax+By+CAx+By+C의 값은 직선에서부터의 거리에 비례함.

기울기 벡터가 직선에 수직이므로 이를 이용하면 점에서 직선까지의 거리는 벡터 k(A,B)k(A,B)의 길이와 같음.

거리 = kA2+B2k\sqrt{A^2+B^2}

(x,y)+k(A,B)(x,y)+k(A,B)에 대해 f(x,y)=Ax+By+Cf(x,y)=Ax+By+C의 값은 다음과 같음.

f(x+kA,y+kB)=Ax+kA2+By+kB2+c=k(A2+B2)f(x+kA,y+kB)=Ax+kA^2+By+kB^2+c=k(A^2+B^2)

(x,y)(x,y)가 직선 위에 있기 때문에 이러한 결과가 가능한 것임. 위 두 식을 조합하면 점 (a,b)(a,b)부터 직선까지의 거리는

거리 = f(a,b)A2+B2\frac{f(a,b)}{\sqrt{A^2+B^2}}

이 거리의 크기 (절댓값)는 기하학적인 거리이지만 직선의 한 쪽에서는 거리가 양수이고, 어느 쪽에서는 음수이기 때문에 부호 거리 (signed distance)라는 이름을 붙임. 필요에 따라 두 표현 f(x,y)=0f(x,y)=0f(x,y)=0-f(x,y)=0 중에서 선택할 수 있음.
벡터 (A,B)(A,B)가 단위 벡터라면 f(a,b)f(a,b)는 부호 거리임. 위에서 제시한 방정식에 (A,B)(A,B) 벡터가 단위 벡터가 되게 하는 상수를 곱함 수 있음.

f(x,y)=y0y1(x1x0)2+(y0y1)2x+x1x0(x1x0)2+(y0y1)2y+x0y1x1y0(x1x0)2+(y0y1)2x=0f(x,y)=\frac{y_0-y_1}{\sqrt{(x_1-x_0)^2+(y_0-y_1)^2}}x+\frac{x_1-x_0}{\sqrt{(x_1-x_0)^2+(y_0-y_1)^2}}y+\frac{x_0y_1-x_1y_0}{\sqrt{(x_1-x_0)^2+(y_0-y_1)^2}}x=0

암시적 직선은 삼각형 래스터화 (triangle rasterization) (8.1.2장에서 다룰 예정)에 매우 유용하게 사용됨.


암시적 2차 곡선

선형 함수 f(x,y)f(x,y)는 암시적 직선 f(x,y)=0f(x,y)=0을 형성함. ffx,yx,y로 이루어진 2차 함수라면 일반형은 다음과 같음.

Ax2+Bxy+Cy2+Dx+Ey+F=0Ax^2+Bxy+Cy^2+Dx+Ey+F=0

2차원에서의 2차 곡선에는 타원 (ellipse), 쌍곡선 (hyperbola) 등이 있고, 특별한 형태의 포물선, 원, 직선도 있음.

중심점이 (xc,yc)(x_c,y_c)이고 반지름이 rr인 원의 2차 곡선은 다음과 같음.

(xxc)2+(yyc)2r2=0(x-x_c)^2+(y-y_c)^2-r^2=0

또한 타원의 방정식은

(xxc)2a2+(yyc)2b21=0\frac{(x-x_c)^2}{a^2}+\frac{(y-y_c)^2}{b^2}-1=0

여기서 (xc,yc)(x_c,y_c)는 타원의 중심점, a,ba,b는 각각 단반경 (minor semi-axis), 장반경 (major semi-axis)임.

2.5.3. 3차원 암시적 표면

암시적 방정식을 2차원에서의 곡선을 정의하기 위해 사용할 수 있는 것처럼 3차원의 표면을 정의할 때에도 사용할 수 있음.
2차원에서처럼 암시적 방정식은 표면 위의 점들을 암묵적으로 정의함.

f(x,y,z)=0f(x,y,z)=0

표면 위의 점 (x,y,z)(x,y,z)는 함수 ff의 인자로 전달되면 그 결과는 항상 0임. 반면 표면 위에 있지 않은 점의 경우 0보다 큰 숫자가 나오게 됨.
ff를 확인하여 점이 표면 위에 있는지 확인하거나, ff의 부호를 확인하여 점이 표면의 위쪽에 있는지 아래쪽에 있는지 확인할 수도 있음.

벡터 표기법을 사용하면 특정한 벡터 p=(x,y,z)\textbf{p}=(x,y,z)에 대해 다음과 같이 표기할 수 있음.

f(p)=0f(\textbf{p})=0

2.5.4. 암시적 표면에 대한 표면 법선

표면 법선 (surface normal)은 표면에 수직인 벡터임. (빛 연산 등에 많이 쓰임)
표면 위에 있는 각각의 점들은 서로 다른 법선 벡터를 가짐.

2차원 곡선에서처럼, 표면 위에 있는 점 p\textbf{p}에서의 표면 법선은 암시적 함수의 기울기로부터 주어짐.

n=f(p)=(f(p)x,f(p)y,f(p)z)\textbf{n}=\nabla f(\textbf{p})=(\frac{\partial f(\textbf{p})}{\partial x},\frac{\partial f(\textbf{p})}{\partial y},\frac{\partial f(\textbf{p})}{\partial z})

기울기 벡터는 f(p)>0f(\textbf{p})>0인 영역을 가리킴. ff의 특수 형태가 "안쪽을 향하는" 기울기 벡터를 갖고 바깥쪽을 향하는 기울기 벡터가 필요할 때, 이 표면에서 f(p)=0-f(\textbf{p})=0f(p)=0f(\textbf{p})=0과 같음. but 기울기 벡터의 방향은 서로 반대임.

f(p)=(f(p))-\nabla f(\textbf{p})=\nabla (-f(\textbf{p}))

2.5.5. 암시적 평면

표면 법선 벡터 n\textbf{n}을 갖는 점 a\textbf{a}를 통과하는 무한한 평면이 있다고 가정. 평면의 방정식은 다음과 같음.

(pa)n=0(\textbf{p}-\textbf{a})\cdot \textbf{n}=0

a\textbf{a}n\textbf{n}은 알려진 변수이고, 점 p\textbf{p}는 방정식을 풀어서 알아내야 함. 기하학에서는 이 방정식을 "a\textbf{a}에서 p\textbf{p}로의 벡터는 평면의 법선과 수직이다."라고 함. p\textbf{p}가 평면 위에 없는 경우 (pa)(\textbf{p}-\textbf{a})n\textbf{n}과 수직이 아님.

세 점 a,b,c\textbf{a},\textbf{b},\textbf{c}를 통해 평면의 방정식을 구해야 할 때에는 평면 위의 두 벡터를 외적하여 법선벡터를 구한 뒤 방정식을 도출함.

n=(ba)×(ca)\textbf{n}=(\textbf{b}-\textbf{a})\times (\textbf{c}-\textbf{a})

이를 이용한 평면의 방정식은 다음과 같음.

(pa)((ba)×(ca))=0(\textbf{p}-\textbf{a})\cdot ((\textbf{b}-\textbf{a})\times (\textbf{c}-\textbf{a}))=0

간단하게 벡터 (pa),(ba),(ca)(\textbf{p}-\textbf{a}),(\textbf{b}-\textbf{a}),(\textbf{c}-\textbf{a})로 정의된 평행육면체 (parallelepiped)의 부피가 0이라고 생각하면 됨.

평행육면체: 모든 면이 평행사변형으로 이루어진 육면체

이는 p\textbf{p}a,b,c\textbf{a},\textbf{b},\textbf{c}와 같은 평면에 있을 때만 적용됨.

행렬식을 이용하여 표현할 수도 있음.

xxa   yya   zzaxbxa   ybya   zbzaxcxa   ycya   zcza=0\begin{vmatrix} x-x_a \ \ \ y-y_a \ \ \ z-z_a \\ x_b-x_a \ \ \ y_b-y_a \ \ \ z_b-z_a \\ x_c-x_a \ \ \ y_c-y_a \ \ \ z_c-z_a \end{vmatrix}=0

벡터를 이용한 방식과 행렬식을 이용한 방식은 모두 같은 식을 나타냄. 벡터를 이용하면 식을 기하학적으로 이해하기 쉽고 코드를 효율적으로 작성할 수도 있음. 행렬식 또한 거의 비슷한 장점을 갖고 있음. 결국 두 방식은 모두 소스코드와 잘 맞음. 변수가 늘어나면 그만큼 오타가 발생할 확률도 높아짐.


3차원 2차 표면
x,y,zx,y,z 3개의 변수를 갖는 2차 다항식은 3차원의 2차 평면을 정의함. 예를 들어 구는 다음과 같이 정의할 수 있음.

f(p)=(pc)2r2=0f(\textbf{p})=(\textbf{p}-\textbf{c})^2-r^2=0

또한 타원체 (ellipsoid)는 다음과 같음.

f(p)=(xxc)2a2+(yyc)2b2+(zzc)2c2f(\textbf{p})=\frac{(x-x_c)^2}{a^2}+\frac{(y-y_c)^2}{b^2}+\frac{(z-z_c)^2}{c^2}


암시적 표면을 통한 3차원 곡선
f(p)=0f(\textbf{p})=0과 같은 형태의 3차원 표면은 표면을 제대로 표현하지 못하고, 실제로 사용하기에도 부족한 부분이 많음. 3차원 곡선은 2개의 암시적 방정식의 교점을 통해 만들어짐.

f(p)=0g(p)=0f(\textbf{p})=0 \\ g(\textbf{p})=0

예를 들어 3차원 직선은 두 평면이 겹치는 부분임.

2.5.6. 2차원 매개변수 곡선

매개변수 (parametric) 곡선은 단일 파라미터에 의해 제어가 됨. 매개변수 곡선은 다음과 같은 형태를 가짐.

[xy]=[g(t)h(t)]\begin{bmatrix}x\\y\end{bmatrix}=\begin{bmatrix}g(t)\\h(t)\end{bmatrix}

(x,y)(x,y)는 곡선 위의 점이고, tt는 곡선에 영향을 주는 매개변수임. 주어진 매개변수 tt에 대해 함수 g,hg,h에 의해 점들이 결정됨.

매개변수 곡선을 벡터 형태로 표현할 수 있음.

p=f(t)\textbf{p}=f(t)

이때 f:RR2f:\R\rightarrow\R^2임. 이러한 벡터 함수는 코드를 더욱 깔끔하게 만들어주므로 많이 사용되는 방법임.

위치에 따른 곡선을 "시간에 대한 함수"로 생각할 수 있음. 또한 곡선이 어느 점에서든 속도 (velocity)를 갖는다고 생각할 수도 있음. 예를 들어 점 p(t)\textbf{p}(t)t=2t=-2 부근에서는 천천히 이동하고 t=2t=2t=3t=3 사이에서는 빠르게 이동한다고 가정함. 이러한 개념은 매개변수 곡선을 표현할 때 많이 사용되는 개념임.


2차원 매개변수 직선
p0=(x0,y0)\textbf{p}_0=(x_0,y_0)p1=(x1,y1)\textbf{p}_1=(x_1,y_1)을 지나는 2차원 매개변수 직선은 다음과 같이 표현할 수 있음.

[xy]=[x0+t(x1x0)y0+t(y1y0)]\begin{bmatrix}x\\y\end{bmatrix}=\begin{bmatrix}x_0+t(x_1-x_0)\\y_0+t(y_1-y_0)\end{bmatrix}

이와 유사한 형태를 갖는 벡터 표현은 다음과 같음.

p(t)=p0+t(p1p0)\textbf{p}(t)=\textbf{p}_0+t(\textbf{p}_1-\textbf{p}_0)

이 식은 기하학적으로 "점 p0\textbf{p}_0에서 시작해서 매개변수 tt에 의해 결정된 점 p1\textbf{p}_1를 향해 이동한다."고 해석할 수 있음. 이 식의 특징 중 하나는 p(0)=p0, p(1)=p1\textbf{p}(0)=\textbf{p}_0, \ \textbf{p}(1)=\textbf{p}_1이라는 것. 점이 매개변수 tt를 따라 선형적으로 변하기 때문에 textbfp0textbf{p}_0textbfp1textbf{p}_1 사이의 tt 값은 점들 간의 거리를 측정할 수 있음.

t<0t<0인 점들은 textbfp0textbf{p}_0의 "반대편"에 있는 점들이고, t>1t>1인 점들은 textbfp1textbf{p}_1의 반대편에 있는 점들임.

o\textbf{o}와 벡터 d\textbf{d}를 사용하여 매개변수 직선을 표현할 수 있음.

p(t)=o+t(d)\textbf{p}(t)=\textbf{o}+t(\textbf{d})

벡터 d\textbf{d}가 단위 길이를 갖는다면 직선은 호의 길이 (arc length)로 매개변수화 (parameterized)된 것임. 즉 매개변수 tt는 직선에 따른 거리의 정확한 측정값임.


2차원 매개변수 원
중심점 (xc,yc)(x_c,y_c)와 반지름 rr을 갖는 매개변수 원의 형태는 다음과 같음.

[xy]=[xc+rcosϕyc+rsinϕ]\begin{bmatrix}x\\y\end{bmatrix}=\begin{bmatrix}x_c+r\cos\phi\\y_c+r\sin\phi\end{bmatrix}

곡선 위의 모든 점에 대해 매개변수 ϕ\phi가 유일하려면 ϕ\phi의 범위를 ϕ[0,2π)\phi\in [0,2\pi) 또는 ϕ(π,π]\phi\in (-\pi,\pi]로 제한해야 함. (혹은 길이 2π2\pi를 갖는 반열린구간)

또한 타원은 다음과 같이 나타낼 수 있음.

[xy]=[xc+acosϕyc+bsinϕ]\begin{bmatrix}x\\y\end{bmatrix}=\begin{bmatrix}x_c+a\cos\phi\\y_c+b\sin\phi\end{bmatrix}

2.5.7. 3차원 매개변수 곡선

3차원 매개변수 곡선은 2차원 매개변수 곡선과 비슷하게 이루어짐.

x=f(t)y=g(t)z=h(t)x=f(t)\\y=g(t)\\z=h(t)

예를 들어 zz축 중심의 나선형은 다음과 같음.

x=costy=sintz=tx=\cos t\\y=\sin t\\z=t

2차원 곡선에서처럼 함수 f,g,hf,g,h는 정의역 DRD\subset\R에서 정의됨. 또한 벡터 형태로는 다음과 같이 나타낼 수 있음.

[xyz]=p(t)\begin{bmatrix}x\\y\\z\end{bmatrix}=\textbf{p}(t)


3차원 매개변수 직선
3차원 매개변수 직선은 2차원 매개변수 직선의 확장임. 예를 들어 다음과 같은 직선이 있다고 가정함.

x=2+7ty=1+2tz=35tx=2+7t\\y=1+2t\\z=3-5t

이 형태는 복잡하고 소스코드로 바꾸기고 번거롭기 때문에 벡터 형태를 사용할 것.

p=o+td\textbf{p}=\textbf{o}+t\textbf{d}

이때 벡터 o,d\textbf{o},\textbf{d}는 각각 o=(2,1,3),d=(7,2,5)\textbf{o}=(2,1,3),\textbf{d}=(7,2,-5)로 정의함.

기하학적으로 이 직선은 벡터 o\textbf{o}를 통과하고 벡터 d\textbf{d}와는 평행함.
t=2t=2인 경우 p(t)=(2,1,3)+2(7,2,5)=(16,5,7)\textbf{p}(t)=(2,1,3)+2(7,2,-5)=(16,5,-7)

2차원에서처럼 선분 (line segment)을 3차원 매개변수 직선에 의해 나타낼 수 있음. 두 점 a,b\textbf{a},\textbf{b} 사이의 선분은 p(t)=a+t(ba)\textbf{p}(t)=\textbf{a}+t(\textbf{b}-\textbf{a})로 나타낼 수 있음. 이때 구간이 t[0,1]t\in[0,1]이라면 p(0)=a,p(1)=b\textbf{p}(0)=\textbf{a},\textbf{p}(1)=\textbf{b}이고 p(0.5)=(a+b)2\textbf{p}(0.5)=\frac{(\textbf{a}+\textbf{b})}{2}임. (a,b\textbf{a},\textbf{b}의 중점)

반직선 (half-line), 혹은 광선 (ray)은 보통 [0,)[0,\infin)의 반열린구간을 갖는 3차원 매개변수 직선임. 지금부터는 모든 직선, 선분, 반직선을 "광선"으로 통칭할 것.

2.5.8. 3차원 매개변수 표면

매개변수를 통해 표면을 나타낼 때에는 매개변수 2개를 사용함.

x=f(u,v)y=g(u,v)z=h(u,v)x=f(u,v)\\y=g(u,v)\\z=h(u,v)

벡터 형태는 다음과 같음.

[xyz]=p(u,v)\begin{bmatrix}x\\y\\z\end{bmatrix}=\textbf{p}(u,v)

예를 들어, 지구 표면 위의 점은 경도와 위도라는 2개의 매개변수로 표현할 수 있음. 원점을 지구의 중심, rr을 지구의 반지름으로 잡는다면 원점을 중심으로 하는 구면 좌표계 (spherical coordinate system)에서 다음과 같은 매개변수 방정식을 도출할 수 있음.

x=rcosϕsinθy=rsinϕsinθz=rcosθx=r\cos\phi\sin\theta\\y=r\sin\phi\sin\theta\\z=r\cos\theta

이 경우에는 식을 벡터 형태로 만들 수 없음.

매개변수 (θ,ϕ)(\theta,\phi)(x,y,z)(x,y,z)를 통해 찾기 위해서는 atan2\text{atan2} 함수를 적용하면 됨. (ϕ(π,π)\phi\in(-\pi,\pi)라고 가정)

θ=acos(zx2+y2+z2ϕ=atan2(y,x)\theta=\text{acos}(\frac{z}{\sqrt{x^2+y^2+z^2}}\\\phi=\text{atan2}(y,x)

암시적 표면에서 함수 ff를 미분하면 표면 법선을 얻을 수 있고, 매개변수 표면에서는 p\textbf{p}를 미분하면 표면 지오메트리에 대한 정보를 얻을 수 있음.

함수 q(t)=p(t,v0)\textbf{q}(t)=\textbf{p}(t,v_0)vvv0v_0로 고정해놓은 상태에서 uu를 변화시키면서 얻은 매개변수 곡선임. isoparametric curve (줄여서 isoparm)라고 부르는 이 곡선은 표면 위에 있음. q\textbf{q}을 미분하면 곡선에 접하는 벡터를 얻을 수 있고, q\textbf{q}' 또한 표면 위에 있음.
p\textbf{p}의 한 인수를 변화시켜서 얻었기 때문에 q\textbf{q}' 벡터는 uu에 대한 p\textbf{p}의 편미분임. (pu\textbf{p}_u) 이와 비슷하게 편미분 pv\textbf{p}_v는 표면에 대한 두 번째 접선 벡터인 상수 uu에 대한 isoparametric curve의 접선임.

2.5.9. 곡선 및 표면 요약

2차원에서의 암시적 곡선이나 3차원에서의 표면은 f:R2Rf:\R^2\rightarrow\R 또는 f:R3Rf:\R^3\rightarrow\R에서 2개 혹은 3개의 변수로 이루어진 스칼라 값 함수로 정의되며, 함수가 0이 되는 모든 점들로 이루어짐.

S={pf(p)=0}S=\{\textbf{p}|f(\textbf{p})=0\}


2차원, 3차원 매개변수 곡선은 p:DRR2\textbf{p}:D\subset\R\rightarrow\R^2 또는 p:DRR3\textbf{p}:D\subset\R\rightarrow\R^3에서 1개의 변수로 이루어진 벡터 값 함수로 정의됨.

S={p(t)tD}S=\{\textbf{p}(t)|t\in D\}


3차원 매개변수 표면은 p:DR2R3\textbf{p}:D\subset\R^2\rightarrow\R^3에서 2개의 변수를 갖는 벡터 값 함수로 정의되며, 정의역의 모든 점 (u,v)(u,v)의 상들로 이루어짐.

S={p(t)(u,v)D}S=\{\textbf{p}(t)|(u,v)\in D\}


암시적 곡선 및 표면에서 법선 벡터는 ff를 미분하여 얻어지고, (곡선의) 접선 벡터나 (표면의) 벡터는 기저를 형성하여 법선 벡터로부터 만들어짐.

매개변수 곡선 및 표면에서는 p\textbf{p}을 미분하여 접선 벡터를 얻을 수 있고, 법선 벡터는 기저를 형성하여 접선 벡터로부터 만들어짐.

2.6. 선형 보간

그래픽스에서 가장 많이 사용하는 수학적 연산은 선형 보간 (linear interpolation)일 것임.
이미 앞선 장에서 2차원/3차원 선분을 만들기 위해 위치의 선형 보간을 봤는데, 두 점 a,b\textbf{a},\textbf{b}는 직선 p=(1t)a+tb\textbf{p}=(1-t)a+t\textbf{b}의 매개변수 tt와 관련이 있음. p\textbf{p}t=0t=0, t=1t=1에서 a,b\textbf{a},\textbf{b}를 통과하기 때문에 이것 역시 보간이라고 할 수 있음. 선형 (linear) 보간이라고 부르는 이유는 tt1t1-t의 가중치가 tt의 선형 다항식이기 때문.

데이터 AA에서 BB까지 이동함에 따라 0부터 1까지 변화하는 변수 tt를 만든다고 가정하면 중간값은 함수 (1t)A+tB(1-t)A+tB임.

2.7. 삼각형

2차원/3차원에서 삼각형은 많은 그래픽스 프로그램의 기초적인 모델링 성분임. (모델링의 가장 작은 요소는 삼각형) 색상과 같은 정보에는 삼각형의 꼭짓점에 태그가 붙고, 이러한 정보는 삼각형으로 보간됨. 이러한 보간을 직접적으로 수행하는 좌표계를 질량 중심 좌표 (barycentric coordinate)라고 함.

앞으로 이 좌표계를 바닥부터 개발할 예정임.

2.7.1. 2D 삼각형

2차원 점 a,b,c\textbf{a},\textbf{b},\textbf{c}로 이루어진 삼각형이 있을 때, 넓이는 다음과 같음.

넓이 = 12xbxa   xcxaybya   ycya       =12(xayb+xbyc+xcyaxaycxbyaxcyb)\frac{1}{2}\begin{vmatrix}x_b-x_a \ \ \ x_c-x_a\\y_b-y_a \ \ \ y_c-y_a\end{vmatrix}\\ \ \ \ \ \ \ \ =\frac{1}{2}(x_ay_b+x_by_c+x_cy_a-x_ay_c-x_by_a-x_cy_b)

a,b,c\textbf{a},\textbf{b},\textbf{c}가 시계 반대 방향의 순서를 갖는 경우 넓이는 양수이고, 그렇지 않은 경우 음수임.

보통 그래픽스에서는 삼각형의 각 정점에 색 (color)과 같은 속성을 할당하고 해당 속성의 값을 부드럽게 보간하는 경우가 있음. 여러 가지 방법이 있는데, 그 중 가장 간단한 방법은 질량 중심 좌표를 사용하는 것임. 이 좌표계에서는 원점을 a\textbf{a}로 잡고 b,c\textbf{b},\textbf{c}까지의 벡터를 기저 벡터로 설정함.

이때 점 p\textbf{p}는 다음과 같이 나타낼 수 있음.

p=a+β(ba)+γ(ca)\textbf{p}=\textbf{a}+\beta(\textbf{b}-\textbf{a})+\gamma(\textbf{c}-\textbf{a})

약간 변형하면

p=(1βγ)a+βb+γc\textbf{p}=(1-\beta-\gamma)\textbf{a}+\beta\textbf{b}+\gamma\textbf{c}

좀 더 간단하게 표현하기 위해 α=1βγ\alpha=1-\beta-\gamma로 정의하면 방정식은 다음과 같이 정리될 수 있음.

p(α,β,γ)=αa+βb+γc\textbf{p}(\alpha,\beta,\gamma)=\alpha\textbf{a}+\beta\textbf{b}+\gamma\textbf{c}

(단, α+β+γ=1\alpha+\beta+\gamma=1)

질량 중심 좌표는 평면 위의 모든 점에 대해 정의되어있음. 질량 중심 좌표계의 점 p\textbf{p}a,b,c\textbf{a},\textbf{b},\textbf{c}로 이루어진 삼각형 내부에 있고, 다음 특성을 만족함.

0<α<10<β<10<γ<10<\alpha<1\\0<\beta<1\\0<\gamma<1

좌표 중 하나가 0이고 나머지 두개가 0과 1 사이에 있다면 그 점은 삼각형의 세 변 중 하나 위에 존재하는 것임. 또한 2개의 요소가 0이면 그 점은 삼각형의 세 정점 중 하나임.
또한 질량 중심 좌표를 사용하면 삼각형의 세 정점을 매끄럽게 혼합할 수 있음. 같은 계수 (α,β,γ)(\alpha,\beta,\gamma)는 색상과 같은 다른 속성을 혼합하는 데 사용될 수 있음.

주어진 점 p\textbf{p}에 대해 질량 중심 좌표를 계산하기 위해서는 위의 방정식을 활용하여 α=1βγ\alpha=1-\beta-\gamma로 놓고 나머지 β,γ\beta,\gamma를 구하는 것임.

[xbxa   xcxaybya   ycya][βγ]=[xpxaypya]\begin{bmatrix}x_b-x_a \ \ \ x_c-x_a\\y_b-y_a \ \ \ y_c-y_a\end{bmatrix}\begin{bmatrix}\beta\\\gamma\end{bmatrix}=\begin{bmatrix}x_p-x_a\\y_p-y_a\end{bmatrix}

이 방정식은 대수적으로는 직접 풀 수 있지만 기하학적인 해를 계산할 때 더 유용하게 사용할 수 있음.

질량 중심 좌표의 기하학적인 특징은 직선에서부터 삼각형의 변까지 이르는 "부호를 갖는" 거리라는 점임. (그림의 β\beta 참고)

직선 fac(x,y)=0f_{ac}(x,y)=0이 점 a,c\textbf{a},\textbf{c}를 지나는 직선이라고 하면 β\beta의 값은 다음과 같이 구할 수 있음.

β=fac(x,y)fac(xb,yb)\beta=\frac{f_{ac}(x,y)}{f_{ac}(x_b,y_b)}

γ,α\gamma,\alpha 또한 비슷한 방법으로 구할 수 있음.

종종 효율을 위해 질량 중심 좌표의 변수 α,β,γ\alpha,\beta,\gamma 중 두 개만 구하고 나머지 하나는 α+β+γ=1\alpha+\beta+\gamma=1을 통해 구하기도 함.

p0,p1\textbf{p}_0,\textbf{p}_1을 지나는 직선의 식을 구하기 위해 다음 방정식을 이용할 수 있음.

fab(x,y)(yayb)x+(xbxa)y+xaybxbya=0f_{ab}(x,y)\equiv (y_a-y_b)x+(x_b-x_a)y+x_ay_b-x_by_a=0

fab(x,y)f_{ab}(x,y)의 값이 1이 아니므로 이상적인 형태가 아닐 수 있음. 따라서 fab(x,y)f_{ab}(x,y)으로 나눠서 다음 식을 얻을 수 있음.

γ=(yayb)x+(xbxa)y+xaybxbya(yayb)xc+(xbxa)yc+xaybxbya\gamma=\frac{(y_a-y_b)x+(x_b-x_a)y+x_ay_b-x_by_a}{(y_a-y_b)x_c+(x_b-x_a)y_c+x_ay_b-x_by_a}

물론 나눗셈을 하기 때문에 "division by zero" 문제가 발생할 수 있지만, 삼각형의 넓이가 0이 될 수 없기 때문에 이러한 문제는 발생하지 않음. α,β\alpha,\beta에 대한 유사 공식 (analogous formula)이 있지만 일반적으로 하나만 필요함.

β=(yayc)x+(xcxa)y+xaycxcya(yayc)xb+(xcxa)yb+xaycxcyaα=1βγ\beta=\frac{(y_a-y_c)x+(x_c-x_a)y+x_ay_c-x_cy_a}{(y_a-y_c)x_b+(x_c-x_a)y_b+x_ay_c-x_cy_a}\\\alpha=1-\beta-\gamma

질량 중심 좌표를 구하는 다른 방법은 삼각형 내부에서 나눠진 세 삼각형 Aa,Ab,AcA_a,A_b,A_c의 넓이를 구하는 것임.

질량 중심 좌표는 다음 규칙을 따름. (AA는 전체 삼각형의 넓이. A=Aa+Ab+AcA=A_a+A_b+A_c)

α=AaAβ=AbAγ=AcA\alpha=\frac{A_a}{A}\\\beta=\frac{A_b}{A}\\\gamma=\frac{A_c}{A}

2.7.2. 3D 삼각형

질량 중심 좌표의 좋은 점 중 하나는 3차원으로의 변환이 쉽다는 점임. 3차원 상에 점 a,b,c\textbf{a},\textbf{b},\textbf{c}가 있다고 가정하면 2차원에서와 같은 식을 사용할 수 있음.

p=(1βγ)a+βb+γc\textbf{p}=(1-\beta-\gamma)\textbf{a}+\beta\textbf{b}+\gamma\textbf{c}

삼각형에 대한 법선 벡터는 삼각형을 이루는 평면의 두 벡터를 외적하여 구할 수 있음.

n=(ba)×(ca)\textbf{n}=(\textbf{b}-\textbf{a})\times(\textbf{c}-\textbf{a})

이때 법선 벡터는 단위 길이일 필요는 없고, 외적의 오른손 법칙을 따름.

삼각형의 넓이 또한 외적을 통해 구할 수 있음.

넓이 = 12(ba)×(ca)\frac{1}{2}||(\text{b}-\text{a})\times(\text{c}-\text{a})||

이 넓이는 유부호 넓이 (signed area)가 아니기 때문에 질량 중심 좌표를 구할 때 직접적으로 사용할 수 없음.
but "시계 방향" 정점 순서를 갖는 삼각형은 같은 평면에 있으면서 "시계 반대 방향" 정점 순서를 갖는 삼각형의 법선 벡터와 반대 방향을 가리킴.

ab=a bcosϕ\text{a}\cdot\text{b}=||\text{a}|| \ ||\text{b}||\cos\phi

(ϕ\phi는 두 벡터 사이의 각도)
만약 a,b\text{a},\text{b}가 평행하면 cosϕ=±1\cos\phi=\pm1이고 두 벡터가 같은 방향을 가리키는지, 혹은 반대 방향을 가리키는지 알 수 있음.

위에서 정의했던 여러 방정식을 이용하면 다음을 얻을 수 있음.

α=nnan2β=nnbn2γ=nncn2\alpha=\frac{\textbf{n}\cdot\textbf{n}_a}{||\textbf{n}^2||}\\\beta=\frac{\textbf{n}\cdot\textbf{n}_b}{||\textbf{n}^2||}\\\gamma=\frac{\textbf{n}\cdot\textbf{n}_c}{||\textbf{n}^2||}

여기서 n\textbf{n}n=(ba)×(ca)\textbf{n}=(\textbf{b}-\textbf{a})\times(\textbf{c}-\textbf{a})을 통해 구한 것.

na=(cb)×(pb)nb=(ac)×(pc)nc=(ba)×(pa)\textbf{n}_a=(\text{c}-\text{b})\times(\text{p}-\text{b})\\\textbf{n}_b=(\text{a}-\text{c})\times(\text{p}-\text{c})\\\textbf{n}_c=(\text{b}-\text{a})\times(\text{p}-\text{a})

profile
재밌는 인생을 살자!

0개의 댓글