수학/이득우의 게임 수학

행렬의 설계

monstro 2025. 9. 3. 11:03
728x90
반응형

- 개요

평면상의 물체 원하는 형태로 변환하기 위해 2 X 2 행렬을 설계하는 방법을 알아본다

 

- 가정

 

위와 같이 두 개의 표준기저벡터 (1, 0)(0, 1)새로운 벡터 (a, c) (b, d)에 대응되어 변환된다고 가정한다

이때 표준기저벡터가 존재하는 벡터 공간을 V로 표현하고, 새로운 벡터가 존재하는 공간을 W로 표현한다

 

- 대입

벡터공간 V에서의 벡터 v

 

벡터 공간 V에서의 벡터 v는 위와 같이 표준기저벡터선형 결합을 통해 생성된다

 

벡터 v가 선형변환되어 만들어진 벡터공간 W에서의 벡터 w

 

벡터 v 선형 변환되는 경우에는 동일한 선형 결합식을 사용하여 위와 같이 벡터 w가 계산된다

 

행렬의 곱으로 표현

 

벡터 w는 위와 같이 a, b, c, d로 만들어진 정방행렬벡터 (x, y)를 곱한 결과와 동일하다

또, 정방행렬 표준기저벡터가 변화된 두 벡터 (a, c)와 벡터 (b, d)의 관계를 분석하면

이들이 정방행렬을 구성하는 열벡터임을 알 수 있다

 

- 응용

struct Matrix2x2
{
public:
	// 생성자 
	FORCEINLINE constexpr Matrix2x2() = default;
	FORCEINLINE explicit constexpr Matrix2x2(const Vector2& InCol0, const Vector2& InCol1) { Cols = { InCol0, InCol1 }; }

	...

	// 멤버함수 
	...
	FORCEINLINE Matrix2x2 Transpose() const;
	...
	FORCEINLINE Matrix2x2 operator*(const Matrix2x2& InMatrix) const;

	...

	// 멤버변수 
	std::array<Vector2, Rank> Cols = { Vector2::UnitX, Vector2::UnitY };
};

...

FORCEINLINE Matrix2x2 Matrix2x2::Transpose() const
{
	return Matrix2x2(
		Vector2(Cols[0].X, Cols[1].X),
		Vector2(Cols[0].Y, Cols[1].Y)
	);
}

...

FORCEINLINE Matrix2x2 Matrix2x2::operator*(const Matrix2x2 &InMatrix) const
{
	Matrix2x2 transposedMatrix = Transpose();
	return Matrix2x2(
		Vector2(transposedMatrix[0].Dot(InMatrix[0]), transposedMatrix[1].Dot(InMatrix[0])),
		Vector2(transposedMatrix[0].Dot(InMatrix[1]), transposedMatrix[1].Dot(InMatrix[1]))
	);
}

...

}

 

2개의 열벡터로 구성된 2차원 행렬을 위와 같이 구조체로 정의하였다

구조체 내부에서 열벡터Cols 멤버변수로 정의하고 2개의 2차원 벡터를 인자로 받는다

Transpose 함수를 사용하여 2차원 행렬에서 전치 행렬을 생성하여 열 벡터행렬행 벡터행렬로 변경한다

 

// 과정 (1)
Matrix2x2 matrix1(Vector2(2.f, 3.f), Vector2(4.f, 5.f));
Matrix2x2 transposed = matrix1.Transpose();

// 과정 (2)
float scalar = 10.f;
Matrix2x2 scalarMultiply = matrix1 * scalar;

// 과정 (3)
Vector2 vector1(5.f, 6.f);
Vector2 vectorMultiply = matrix1 * vector1;

// 과정 (4)
Matrix2x2 matrix2(Vector2(6.f, 7.f), Vector2(8.f, 9.f));
Matrix2x2 matrixMultiply = matrix1 * matrix2;

 

위의 구조체를 응용하여 위와 같은 코드를 작성할 수 있다

각각의 과정을 분석하면 다음과 같다

  • 첫 번째 과정 : 2 X 2 행렬전치 행렬로 변경
    • 기존의 ((2, 3), (4, 5))로 구성된 행렬을 ((2, 4), (3, 5))의 행렬로 변경
  • 두 번째 과정 : 2 X 2행렬에 대한 스칼라 곱 
    • ((2, 3), (4, 5))의 행렬10을 곱하여 ((20, 30), (40, 50))의 행렬 생성
  • 세 번째 과정 : 2 X 2 행렬에 대한 벡터 곱
    • ((2, 3), (4, 5))의 행렬벡터 (5, 6)을 곱하여 (34, 45)의 벡터 생성
  • 네 번째 과정 : 2 X 2 행렬에 대한 행렬 곱
    • ((2, 3), (4, 5))의 행렬에 ((6, 7), (8, 9))의 행렬을 곱하여 ((40, 53), (52, 69))의 행렬 생성
728x90
반응형

'수학 > 이득우의 게임 수학' 카테고리의 다른 글

회전 변환행렬  (0) 2025.09.03
크기 변환행렬  (0) 2025.09.03
열 기준 행렬과 행 기준 행렬  (0) 2025.08.20
정방행렬의 곱셈  (0) 2025.08.20
행렬의 연산 - 행렬의 곱셈  (0) 2025.08.14