Coding/Toy Project

[Ray Tracing in C] 2. 벡터

레이트레이싱은 벡터 연산의 연속으로 이뤄질 것이다. 이 때의 벡터는 프로그래밍에서 1차원 배열이 아니라 수학/공학적인 개념으로 쉽게 말해 '방향과 크기'를 의미한다. 자세한 설명은 동영상 링크를 참조하자.
(참고: 선형대수학을 위한 벡터란?)

먼저 벡터 struct를 헤더에 정의하자. 간단히 실수형 x,y,z만 가지고 있으면 된다. (이름은 최대한 짧게 지었다.)

// vec.h

typedef struct	s_v
{
	double	x;
	double	y;
	double	z;
}				t_v;

이와 함께 연산들도 미리 정의해놓는다. 벡터의 기본 연산은 모두 쓸 것이다. 목록은 다음과 같다.

  • v_init = 벡터 struct를 정의한다.
  • v_mag = 벡터의 크기를 계산한다.
  • v_norm = 벡터를 normalize(크기를 1로)한다.
  • v_plus = 두 벡터를 더한다.
  • v_minus = 두 벡터를 뺀다.
  • v_scala = 벡터에 스칼라곱을 한다.
  • v_dot = 두 벡터의 내적을 한다.
  • v_cross = 두 벡터의 외적을 한다.

완성된 헤더는 다음과 같다. 각 함수의 실제 구현은 글에서는 생략한다.

#ifndef VEC_H
# define VEC_H

# include <math.h>

typedef struct	s_v
{
	double	x;
	double	y;
	double	z;
}				t_v;

t_v				v_init(double x, double y, double z);
double			v_mag(t_v v);
t_v				v_norm(t_v v);
t_v				v_plus(t_v v1, t_v v2);
t_v				v_minus(t_v v1, t_v v2);
t_v				v_scala(double a, t_v v);
double			v_dot(t_v v1, t_v v2);
t_v				v_cross(t_v v1, t_v v2);

#endif