Обратите внимание, что d\ = /zw'(xj).

Для построения текстурированного изображения четырехугольника можно воспользоваться следующей функцией: void quadratic ()

{
float dx01 = (float)(pr[1].x - pr[0].x)/(float)(pr[1].y - pr[0].y); float dx12 = (float)(pr[2].x - pr[1].x)/(float)(pr[2].y - pr[1].y); float dx03 = (float)(pr[3].x - pr[0].x)/(float)(pr[3].y - pr[0].y); float dx32 = (float)(pr[2].x - pr[3].x)/(float)(pr[2].y - pr[3].y); float x1 = pr [0].x; float x2 =pr[0].x;

for (int у = pr [0].y; у < pr [2].y; y++ ) {

float du1 = t.x [0][0] * x1 + t.x [0][1] * у + t.x [0][2];

float dv1 = t.x [1][0] * x1 + t.x [1][1] * у + t.x [1][2];

float d1 = t.x [2][0] * x1 + t.x [2][1] * у + t.x [2][2];

float du2 = t.x [0][0] * x2 + t.x [0][1] * у + t.x [0][2];

float dv2 = t.x [1][0] * x2 + t.x [1][1] * у + t.x [1][2];

float d2 = t.x [2][0] * x2 + t.x [2][1] * у + t.x [2][2];

float u1 =du1 /d1;
float u2 =du2/d2;
float v1 =dv1/d1;
float v2 =dv2/d2;
float um =(du1 +du2)/(d1 + d2 );
float vm = ( dv1 + dv2 ) / ( d1 + d2 );
float invDx = x2 > x1 ? 1.0 / ( x2 - x1 ): 0.0;
float a0 = u1;
float a1 = (-3*u1 + 4*um - u2 ) * invDx;
float a2 = 2*( u1 - 2*um + u2 ) * invDx * invDx;
float bO = v1;

float Ы = (-3*v1 + 4*vm - v2 ) * invDx;

float b2 = 2*( v1 - 2*vm + v2 ) * invDx * invDx;
float deltalM =a1 + a2; float deltaU2 = 2 * a2;

13. Элементы виртуальной реальное

float deltaVI = b1 + b2; float deltaV2 = 2 * b2;
float u = u1; float v = v1;
for (int x = x1; x < x2; x++ ) {
puttexel ( x, y, u, v ); u +=deltaU1; v +=deltaV1; deltaUl += deltaU2; deltaVI += deltaV2;
}
if ( y < pr [1.].y ) x1 += dx01;
else
x1 += dx12; if(y<pr [3].y) x2 += dx03;
else
x2 += dx32;
}
}

Квадратичная интерполяция сложнее линейной, но она обеспечивает замет более высокое качество.

Ниже приводятся изображения, получаемые в процессе применения нескольк методов интерполяции.

В качестве текстуры применяется стандартная клеточная текстура.

На рис. 13.29 приведено изображение, получающееся при корректном проектировании грани.


⇐ Предыдущая| |Следующая ⇒