- 문제 -
벡터 집합 { ( 1, 0, 0 ), ( 1, 5, 0 ), ( 2, 1, -4 ) } 를 그람 슈미트 공정을 이용해서 정규직교하라.

 

문제가 까다로워 보이진 않았는데. 값이 직교하는지 확인하느라 푸는데 시간이 좀 걸렸던 것 같다.

정답지가 없어서 정확한 값인지는 모르겠지만 각 벡터가 내적값이 0으로 직교하는거보니 맞는 것 같다.

코드에서는 정규화 과정을 생략했는데 정규화는 따로 for으로 빼서 로직을 만들면 된다.

그람 슈미트 공정 과정은 다음처럼 안내되어 있다.

 

1. 기본 단계 : 으로 설정한다

 

2. 에 대해 로 설정한다.

 

3. 정규화 단계: 로 설정한다.

 

방법은 간단한데 부동소수점 오차가 있어서 정확한 값이 나오진 않는 것 같다..

 

#include <iostream>
#include <Windows.h>
#include <DirectXMath.h>
#include <DirectXPackedVector.h>
using namespace std;
using namespace DirectX;
using namespace DirectX::PackedVector;

ostream& XM_CALLCONV operator << ( ostream& os, FXMVECTOR v )
{
	XMFLOAT3 dest;
	XMStoreFloat3 ( &dest, v );

	os << "(" << dest.x << ", " << dest.y << ", " << dest.z << ")";
	return os;
}

int main ( void )
{
	XMVECTOR v[3] = {
		XMVectorSet ( 1.0f, 0.0f, 0.0f, 0.0f ),
		XMVectorSet ( 1.0f, 1.5f, 0.0f, 0.0f ),
		XMVectorSet ( 2.0f, 1.0f, -4.0f, 0.0f )
	};
	XMVECTOR w[3]{
		XMVectorZero ( ),
		XMVectorZero ( ),
        XMVectorZero ( ),
	};
	
	// 직교화 단계
	w[0] = v[0];
	for ( int i = 1; i < 3; ++i ) {
		XMVECTOR projW = XMVectorZero ( );
		XMVECTOR perpW = XMVectorZero ( );
		for ( int j = 0; j < i; ++j ) {
			XMVECTOR tProj;
			XMVector3ComponentsFromNormal ( &tProj, &perpW, w[j], v[i] );
			projW -= tProj;
		}
		w[i] = v[i] + projW;
	}

	cout << w[0] << endl;
	cout << w[1] << endl;
	cout << w[2] << endl;
	cout << "w[0] ? w[1] = " << XMVector3Dot ( w[0], w[1] ) << endl;
	cout << "w[1] ? w[2] = " << XMVector3Dot ( w[1], w[2] ) << endl;

	// 정규화 후 
	for ( int i = 0; i < 3; ++i ) {
		w[i] = XMVector3Normalize ( w[i] );
		cout << "Normalize w[" << i << "]" << w[i] << endl;
	}
	return 0;
}