DirectX 3D/DirectX92016. 7. 4. 00:10

벡터 상등

기하학적으로는 같은 방향과 같은 길이를 가지는 두 벡터는 동일한 것으로 보게 되지만, 대수적으로는 벡터가 동일한 차원이고 대응되는 성분이 같은 경우에 두 벡터는 동일한 것으로 본다.

예를 들어, 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 클래스를 이용할 때는 오버로드된 비교 연산자가 이 작업을 대신하므로 우리가 직접 신경 쓸 필요는 없지만, 부동 소수점을 비교하는 방법에 대해서는 반드시 기억하고 있어야 한다.


Posted by 멜데스