если я правильно понял, вы интерполируете объемы (вокселы) вместо пикселей в таком случае: пусть исходный объем vol1[xs1][ys1][zs1]
и цель vol0[xs0][ys0][zs0]
, где xs,ys,zs
- это разрешения, тогда ближайший сосед будет:
// vol0 <- vol1
for ( x0=0; x0<xs0; x0++)
for (x1=(x*x1)/x0, y0=0; y0<ys0; y0++)
for (y1=(y*y1)/y0, z0=0; z0<zs0; z0++)
{ z1=(z*z1)/z0;
vol0[x0][y0][z0]=vol1[x1][y1][z1];
}
Цвет остается тем же для ближайшего соседа. В случае, если vol0
имеет меньшее разрешение, чем vol1
, вы можете сделать циклы for
с разрешением vol1
и вместо этого вычислить x0,y0,z0
из x1,y1,z1
для ускорения. Btw. все переменные являются целыми числами, для этого не нужно использовать числа с плавающей запятой ...
Теперь для цветовой кодировки на случай, если ваши вокселы представляют собой одномерный массив ({r,g,b}
) вместо скалярного целочисленного типа:
vol0[xs0][ys0][zs0][3]
vol1[xs1][ys1][zs1][3]
материал изменится на:
// vol0 <- vol1
for ( x0=0; x0<xs0; x0++)
for (x1=(x*x1)/x0, y0=0; y0<ys0; y0++)
for (y1=(y*y1)/y0, z0=0; z0<zs0; z0++)
for (z1=(z*z1)/z0; i=0; i<3; i++ )
vol0[x0][y0][z0][i]=vol1[x1][y1][z1][i];