ÇÏÀÌÆ®¸ÊÀÇ ³ôÀÌ ±¸Çϱâ

ÁöÇüÀÇ ³ôÀ̸¦ ±¸ÇÏ´Â °ÍÀº »ç°¢ Æò¸é»óÀÇ ³ôÀ̸¦ ±¸ÇÏ´Â °ÍÀÌ´Ù.
¸ÊÅø¿¡¼­ ÇϳªÀÇ »ç°¢Çü ÆÐÄ¡´Â 2°³ÀÇ »ï°¢Çü ¸Þ½¬·Î ÀÌ·ç¾î Áø´Ù.
¸ÊÅø¿¡¼­ º°µµÀÇ ¹öÅؽº ÆíÁý¸¸ ÇÏÁö ¾Ê´Â´Ù¸é ´ëºÎºÐÀÇ °æ¿ì´Â »ç°¢Çü ³ôÀ̸¦ ±¸ÇÏ´Â °Í ¸¸À¸·Îµµ
ÃæºÐÇÏ´Ù.

»ç°¢Çü ³ôÀ̸¦ ±¸ÇÏ´Â ¹æ¹ý 2°¡Áö,  ¼±Çü º¸°£À» ÀÌ¿ëÇÑ ¹æ½Ä, Æò¸éÀÇ ¹æÁ¤½ÄÀ» ÀÌ¿ëÇÑ ¹æ½Ä 
¹æ¹ýÀ» ¾Ë¾Æº»ÈÄ ¼±Çü º¸°£À» ÀÌ¿ëÇؼ­ »ï°¢Çü º°·Î ³ôÀ̸¦ ±¸ÇÏ¿© º»´Ù.

1. ¼±Çü º¸°£À» ÀÌ¿ëÇÑ ¹æ½Ä.

2. Æò¸éÀÇ ¹æÁ¤½ÄÀ» ÀÌ¿ëÇÑ ¹æ½Ä

3. ¼±Çü º¸°£À» ÀÀ¿ëÇÑ »ï°¢Çü º°·Î ³ôÀÌ ±¸Çϱâ

1. ¼±Çü º¸°£À» ÀÌ¿ëÇÑ ¹æ½Ä.

4°³ÀÇ Á¡À¸·Î µÈ »ç°¢Çü Æò¸éÀÇ ³ôÀ̸¦ ±¸ÇÒ·Á¸é ½Ö(¶Ç´Â ÀÌÁß) ¼±Çü º¸°£(Bilinear interpolation)
À» ÀÌ¿ëÇÑ´Ù.

Á÷¼±ÀÇ ¼±Çü º¸°£ °ø½ÄÀº ´ÙÀ½°ú °°´Ù.

Á¡ A, B¸¦ Áö³ª´Â Á÷¼±ÀÌ ÀÖ´Ù.  AB »çÀÌ¿¡ ÀÓÀÇÀÇ Á¡ t°¡ ÀÖ°í, t´Â 0.0 <= t < 1 ´ÜÀ§·Î Ç¥½ÃÇÑ´Ù.
ÀÌ ¶§ ¼±Çü º¸°£ °ø½ÄÀº

          u(t) = A¤ý( 1 - t ) + B¤ýt   ÀÌ´Ù.

½Ö ¼±ÇüÀº ¸» ±×´ë·Î ¼±Çü º¸°£À» µÎ ¹ø ÇÏ´Â °ÍÀÌ´Ù.
¼öÆò ¼±ÇüÀ» u(t), ¼öÁ÷ ¼±ÇüÀ» v(t)¶ó ÇÑ´Ù.

          Col = A¤ý( 1 - t ) + B¤ýt         (t´Â 0 <= t < 1 ¹üÀ§ÀÌ´Ù.)
          Row = C¤ý( 1 - t ) + D¤ýt        

P(u, v) = Col¤ý( 1 - v ) + Row¤ýv
         = ( A¤ý( 1¤ýu) + B¤ý u )¤ý( 1 - v )   +   ( C ¤ý ( 1 - u ) + D ¤ýu ) ¤ýv
         = A¤ý( 1 - u )¤ý( 1 - v ) + B¤ýu¤ý( 1 - v ) + C¤ý( 1 - u )¤ýv + D¤ýu¤ýv

¹öÅؽº°£ÀÇ °£°ÝÀÌ 1ÀÎ Á¤¹æÇü »ç°¢ÇüÀ̶ó°í °¡Á¤ÇÑ´Ù.  
x, y ÁÂÇ¥°¡ 0.3, 0.1ÀÌ°í A(0, 0, 10), B(1, 0, 100), C(0, 1, 100), D(1, 1, 100À϶§ °ªÀ» ±¸ÇØ º¸ÀÚ.

float height(float fx, float fy)

{

    float A, B, C, D, u, v;

    A = C = 10.0f;

    B = D = 100.0f;

 

    u = fx;

    v = fy;

    float fHeight = A*( 1 - u )*( 1 - v ) + B*u*( 1 - v ) + C*( 1 - u )*v + D*u*v;

    return fHeight;

}

 

void main()

{

    printf("Height = %f\n", height(0.3f, 0.1f));

}

°á°ú

Height = 37

2. Æò¸éÀÇ ¹æÁ¤½ÄÀ» ÀÌ¿ëÇÑ ¹æ½Ä

Æò¸éÀÇ ¹æÁ¤½ÄÀ» ÀÌ¿ëÇÏ¿© ±¸ÇÏ´Â ¹æ¹ýµµ ÀÖ´Ù.
ÀýµÎü Äøµ¿¡¼­ ax + by + cz + d = 0 À̸é Æò¸éÀ§¿¡ ÀÖÀ»¶§ÀÌ´Ù.
Æò¸éÀÇ ³ë¸Ö º¤Å͸¦ ±¸ÇÑ ÈÄ, d °ªÀ» ±¸ÇÑ´Ù.  
¸¶Áö¸·À¸·Î Æò¸éÀ§ÀÇ z °ªÀ» ±¸ÇÏ¸é ³ôÀÌ°¡ ³ª¿Â´Ù.

#include <stdio.h>

#include <d3d9.h>

#include <d3dx9.h>

#pragma comment (lib, "dxguid.lib")

#pragma comment (lib, "d3d9.lib")

#pragma comment (lib, "d3dx9.lib")

 

 

float height(float fx, float fy)

{

    D3DXVECTOR3 A = D3DXVECTOR3(0.0f, 0.0f, 10.0f);

    D3DXVECTOR3 B = D3DXVECTOR3(1.0f, 0.0f, 100.0f);

    D3DXVECTOR3 C = D3DXVECTOR3(0.0f, 1.0f, 10.0f);

    D3DXVECTOR3 D = D3DXVECTOR3(1.0f, 1.0f, 100.0f);

 

    //Æò¸éÀÇ ³ë¸»À» ±¸ÇÑ´Ù.

    D3DXVECTOR3 ab = B - A;

    D3DXVECTOR3 ac = C - A;

 

    D3DXVECTOR3 normal, plane;

    float  planeD;

    D3DXVec3Cross(&normal, &ab, &ac);

    D3DXVec3Normalize( &plane, &normal);

 

    //Æò¸éÀÇ D°ªÀ» ±¸ÇÑ´Ù.

    planeD = -D3DXVec3Dot(&A, &plane);

 

    float height = ( plane.x * fx + plane.y * fy + planeD ) / -plane.z;

    return height;

}

 

 

void main()

{

    printf("Height = %f\n", height(0.3f, 0.1f));

}

 

3. ¼±Çü º¸°£À» ÀÀ¿ëÇÑ »ï°¢Çü º°·Î ³ôÀÌ ±¸Çϱâ

ÁöÇü ¸Þ½¬¸¦ ÆòÆò »ç°¢ÇüÀ¸·Î »ý°¢ÇÏ°í ³ôÀ̸¦ ±¸Çصµ Å« Â÷ÀÌ´Â ¾ø´Ù.
¿ÀÂ÷ ¾øÀÌ Á» ´õ ¼¼¹ÐÇÏ°Ô ³ôÀ̸¦ ±¸ÇÏ´Â ¹æ¹ýÀÌ ÇÊ¿äÇÏ´Ù.

ÁÂÇ¥´Â

A (0.0f, 0.0f, 10.0f)
B (1.0f, 0.0f, 100.0f)
C (0.0f, 1.0f, 10.0f)
D (1.0f, 1.0f, 100.0f)  ¶ó°í °¡Á¤ÇÑ´Ù.
dx = fx - A.x
dy = fy - A.y

°¡

³ª

ÁöÇü »ç°¢Çü ÆÐÄ¡¿¡¼­ »ï°¢ÇüÀÌ ¸ð¾çÀº 2°¡Áö Á¾·ù°¡ ÀÖ´Ù.
°¡, ³ª¿¡¼­ À§, ¾Æ·¡ »ï°¢Çü¿¡ Æ÷ÇԵǴÂÁö Á¶»çÇÑ´Ù.

(°¡)ÀÇ °æ¿ì:  
dx >= dy ÀÌ¸é ¾Æ·¡ »ï°¢Çü , ¾Æ´Ï¸é À§ »ï°¢Çü¿¡ Æ÷ÇÔ µÈ´Ù.
0.3 >= 0.1 À̹ǷΠ¾Æ·¡ »ï°¢Çü

(³ª)ÀÇ °æ¿ì:
dx <= 1 - dy ÀÌ¸é ¾Æ·¡ »ï°¢Çü , ¾Æ´Ï¸é À§ »ï°¢Çü¿¡ Æ÷ÇÔ µÈ´Ù.
0.3 <= 1 - 0.1 À̹ǷΠ¾Æ·¡ »ï°¢ÇüÀÌ´Ù.

(°¡)ÀÇ °æ¿ì ¾Æ·¡ÂÊ »ï°¢ÇüÀÌ¸é ´ÙÀ½°ú °°ÀÌ ±¸ÇÑ´Ù.

uh = A - B
vh = D - B
fHeight = B + Linear( 0.0f, uh, 1.0f - dx ) + Linear( 0.0f, vh, dy )

Á¡ B¿Í B¿¡¼­ A ¹æÇâÀÇ 1 - dx ±îÁöÀÇ º¸°£°Å¸®¿Í Á¡ B¿¡¼­ D ¹æÇâÀÇ dy ±îÁöÀÇ º¸°£°Å¸®¸¦
´õÇÏ¸é ³ôÀ̸¦ ±¸ÇÒ ¼ö ÀÖ´Ù.

ÀÌ°ÍÀ» ±×¸²À¸·Î Ç¥½ÃÇÏ¸é ´ÙÀ½°ú °°´Ù.

°¡

³ª

Ưº°ÇÑ °æ¿ì°¡ ¾Æ´Ï¶ó¸é »ï°¢ÇüÀ» ±¸ºÐÇÏ¿© º°µµ·Î °è»êÇÏ´Â °Í º¸´Ù´Â »ç°¢ÇüÀ» Æò¸éÀ¸·Î °è»êÇصµ
º° ¹®Á¦°¡ ¾øÀ» °ÍÀÌ´Ù.

#include <stdio.h>

 

float Linear(float v0, float v1, float t)

{

    return v0 * (1.0f - t) + v1 * t;

}

 

//    *

//   *

// *      ¸ð¾çÀÇ »ç°¢Çü ÆÐÄ¡

float heightA(float fx, float fy)

{

    float fHeight, A, B, C, D;

    A = C = 10.0f;

    B = D = 100.0f;

    float dx = fx, dy = fy;

    float uh, vh;   //A¿ÍÀÇ °Å¸®(À̶§ ABCDÀÇ ÃÖ´ë °Å¸®¸¦ 1·Î º»´Ù.)

 

    if( dx >= dy )  //ABD »ï°¢Çü, ¾Æ·¡ÂÊ

    {

        uh = A - B;

        vh = D - B;

        fHeight = B + Linear( 0.0f, uh, 1.0f - dx ) + Linear( 0.0f, vh, dy );

    }

    else //ACD »ï°¢Çü, À­ÂÊ

    {

        uh = D - C;

        vh = A - C;

        fHeight = C + Linear( 0.0f, uh, dx ) + Linear( 0.0f, vh, 1.0f - dy );

    }

 

    return fHeight;

}

 

// *

//   *

//    *    ¸ð¾çÀÇ »ç°¢Çü ÆÐÄ¡

float heightB(float fx, float fy)

{

    float fHeight, A, B, C, D;

    A = C = 10.0f;

    B = D = 100.0f;

    float dx = fx, dy = fy;

    float uh, vh;   //A¿ÍÀÇ °Å¸®(À̶§ ABCDÀÇ ÃÖ´ë °Å¸®¸¦ 1·Î º»´Ù.)

 

    if( dx <= 1.0f - dy )  //BAC »ï°¢Çü, ¾Æ·¡ÂÊ

    {

        uh = B - A;

        vh = C - A;

        fHeight = A + Linear( 0.0f, uh, dx ) + Linear( 0.0f, vh, dy );

    }

    else //BDC »ï°¢Çü, À­ÂÊ

    {

        uh = C - D;

        vh = B - D;

        fHeight = D + Linear( 0.0f, uh, 1.0f - dx ) + Linear( 0.0f, vh, 1.0f - dy );

    }

 

    return fHeight;

}

 

void main()

{

    //printf("Height = %f\n", heightB(0.3f, 0.1f));

    printf("Height = %f\n", heightA(0.4f, 0.9f));

    printf("Height = %f\n", heightB(0.4f, 0.9f));

}