벡터 상등
기하학적으로는 같은 방향과 같은 길이를 가지는 두 벡터는 동일한 것으로 보게 되지만, 대수적으로는 벡터가 동일한 차원이고 대응되는 성분이 같은 경우에 두 벡터는 동일한 것으로 본다.
예를 들어, Ux = Vx, Uy = Vy, Uz = Vz라면, (Ux, Uy, Uz) = (Vx, Vy, Vz)이다.
코드에서는 오버로드된 동등 연산자를 이용해 두 벡터가 같은지를 확인할 수 있다.
1 2 3 4 5 6 7 8 9 | D3DXVECTOR3 u(1.0f, 0.0f, 1.0f); D3DXVECTOR3 v(0.0f, 1.0f, 0.0f); if( u == v ) return true; //비슷하게 오버로드된 비 동등연산자를 이용해 두 벡터가 같지 않은지를 확인할 수 있다. if( u != v ) return true; | cs |
부동 소수점을 비교할 때는 주의를 기울여야한다.
부동 소수점의 부정확성 때문에 같은 것으로 생각되는 수라도 조금 다를 수 있기 때문이다. 따라서 두 수가 대략적으로 같은지를 확인 해야 한다. 이를 위해 매우 작은 값인 EPSILON 상수를 "버퍼"로 이용하는데, 두 수의 거리가 점의 부정확성을 위한 허용 한계를 제공하는 것이다.
다음의 함수는 두 개의 부동 소수점이 같은지를 테스트하는 데 EPSILON을 이용하는 방법을 보여주고 있다.
1 2 3 4 5 6 7 | const float EPSLION = 0.001f; bool Equals(float lhs, float rhs) { //만약 lhs == rhs라면 두 수의 차이는 0이어야 한다. return fabs(lhs - rhs) < EPSILON ? true : false; } | cs |
D3DXVECTOR3 클래스를 이용할 때는 오버로드된 비교 연산자가 이 작업을 대신하므로 우리가 직접 신경 쓸 필요는 없지만, 부동 소수점을 비교하는 방법에 대해서는 반드시 기억하고 있어야 한다.
'DirectX 3D > DirectX9' 카테고리의 다른 글
2. IDirect3DDevice9::DrawPrimitive 메서드 (0) | 2016.07.15 |
---|---|
1. IDirect3DDevice9::SetRenderState 메서드 (0) | 2016.07.11 |
9. 벡터 - 기본 입문 (0) | 2016.07.03 |
[질문] IDirect3D9 인터페이스가 뭔가요? (2) | 2016.06.14 |
8. Direct3D 초기화 (요약) (0) | 2016.06.14 |