5-1 선형성
선형성은 직선의 형태를 띄는 성질을 의미한다.
수학적으로 선형성의 성질을 정의하기 위해서는 가법성과 1차 동차성, 두 가지 조건을 모두 만족해야한다.
가법성 : f(x1 + x2) = f(x1) + f(x2)
1차 동사성 : f(k * x) = k * f(x)
선형 함수의 기본 형식은 다음과 같다. f(x) = ax
가법성을 만족하는 수식 f(x1 + x2) = f(x1) + f(x2)에서 좌변과 우변의 값이 동일한지 확인하는 것으로 판별할 수 있다.
● 좌변 : f(x1 + x2) = a(x1+ x2)
● 우변 : f(x1) + f(x2) = ax1 + ax2
다음 좌변과 우변은 모든 실수이므로 분배법칙에 의해 a(x1 + x2) = ax1 + ax2 가 성립한다.
1차 동차성을 만족하는 수식 f(k* x) = k* f(x)에 함수 f(x) = ax를 적용해 좌변과 우변을 계산한 결과는 다음과 같다.
● 좌변 : f(kx) = a(kx)
● 우변 : k(fx) = k(ax)
5-2 벡터 공간의 선형 변환
벡터 공간을 선형 함수로 변화시킨 새로운 공간도 기저벡터의 선형 결합으로 형성되므로 선형성을 지닌다.
이렇게 두 공간이 동일한 구조를 지닐 때 두 공간의 대응 관계를 변환이라고 부른다.
따라서 선형성을 유지시켜주는 선형 함수 f(x) = (ax + by, cx + dy) 는 선형 변환이라고 한다.
벡터 공간에서 발생하는 선형 변환의 원리는 크기 변환이나 회전 변환과 관련이 있다.
임의의 벡터 v의 크기를 K배 늘리는 작업은 다음과 같이 스칼라 곱셈으로 표현이 가능하다.
f(v) = f( x, y) = (kx, ky)
앞선 예제에서, 벡터 v를 각 Θ만큼 회전시키는 작업은 다음과 같은 함수로 표현이 가능했다.
f(v) = f(x,y) = (cos Θ x - sin Θy, sin Θx + cos Θy)
5-3 행렬의 설계
// 회전 변환 행렬의 기저 벡터와 행렬
Vector2 rBasis1(cos, sin);
Vector2 rBasis2(-sin, cos);
Matrix2x2 rMatrix(rBasis1, rBasis2);
// 크기 변환 행렬의 기저 벡터와 행렬
Vector2 sBasis1 = Vector2::UnitX * currentScale;
Vector2 sBasis2 = Vector2::UnitY * currentScale;
Matrix2x2 sMatrix(sBasis1, sBasis2);
// 크기, 회전의 순서로 진행하는 합성 변환 행렬의 계산
Matrix2x2 finalMatrix = rMatrix * sMatrix;
// 각 값을 초기화한 후 색상을 증가시키면서 점에 대응
rad = 0.f;
for (auto const& v : hearts)
{
// 1. 점에 행렬을 적용한다.
Vector2 transformedV = finalMatrix * v;
// 2. 변환된 점을 이동한다.
Vector2 translatedV = transformedV + currentPosition;
hsv.H = rad / Math::TwoPI;
r.DrawPoint(translatedV, hsv.ToLinearColor());
rad += increment;
}
// 현재 위치, 크기, 각도를 화면에 출력
r.PushStatisticText(std::string("Position : ") + currentPosition.ToString());
r.PushStatisticText(std::string("Scale : ") + std::to_string(currentScale));
r.PushStatisticText(std::string("Degree : ") + std::to_string(currentDegree));
}
https://github.com/moonimax/GameMath_CMaker/tree/Vector-functions