레이트레이싱은 벡터 연산의 연속으로 이뤄질 것이다. 이 때의 벡터는 프로그래밍에서 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
'Coding > Toy Project' 카테고리의 다른 글
[python] 웹 크롤링으로 게시판 업데이트 확인하기 (1) (0) | 2021.05.05 |
---|---|
[Raytracing in C] 1. 준비 (0) | 2021.04.12 |