- 문제 -
벡터 집합 { ( 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;
}
'과거 자료' 카테고리의 다른 글
[#4] 매크로를 활용해서 메모리 해제하기 (0) | 2022.11.12 |
---|---|
C++ 코딩 스타일 정리 (0) | 2022.11.10 |
뷰 포트 시점을 객체에 고정 하기 (0) | 2022.10.26 |
[#3] 회전 변환 식 유도하기 (0) | 2022.10.25 |
[#3] 선형대수학 - 기초 개념 정리 (0) | 2022.10.12 |