ÁöÇüÀÇ ³ôÀ̸¦ ±¸ÇÏ´Â °ÍÀº »ç°¢ Æò¸é»óÀÇ ³ôÀ̸¦ ±¸ÇÏ´Â °ÍÀÌ´Ù. ¸ÊÅø¿¡¼ ÇϳªÀÇ »ç°¢Çü ÆÐÄ¡´Â 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));
}
|
|