dust3d/thirdparty/cgal/CGAL-4.13/include/CGAL/ImageIO/reech4x4_impl.h

3178 lines
100 KiB
C
Executable File

// Copyright (c) 2005-2008 ASCLEPIOS Project, INRIA Sophia-Antipolis (France)
// All rights reserved.
//
// This file is part of the ImageIO Library, and as been adapted for
// CGAL (www.cgal.org).
// You can redistribute it and/or modify it under the terms of the
// GNU Lesser General Public License as published by the Free Software Foundation;
// either version 3 of the License, or (at your option) any later version.
//
// Licensees holding a valid commercial license may use this file in
// accordance with the commercial license agreement provided with the software.
//
// These files are provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
//
// $URL$
// $Id$
// SPDX-License-Identifier: LGPL-3.0+
//
//
// Author(s) : ASCLEPIOS Project (INRIA Sophia-Antipolis), Laurent Rineau
/*************************************************************************
* reech4x4.c -
*
* $Id$
*
* Copyright©INRIA 1999
*
* AUTHOR:
* Gregoire Malandain (greg@sophia.inria.fr)
*
* CREATION DATE:
*
*
* ADDITIONS, CHANGES
*
*
*
*
*/
#ifdef CGAL_HEADER_ONLY
#define CGAL_INLINE_FUNCTION inline
#else
#define CGAL_INLINE_FUNCTION
#endif
/* CAUTION
DO NOT EDIT THIS FILE,
UNLESS YOU HAVE A VERY GOOD REASON
*/
#include <stdio.h>
#include <CGAL/ImageIO/typedefs.h>
#define _CONVERTR_(R) ( R )
#define _CONVERTI_(R) ( (R) >= 0.0 ? ((int)((R)+0.5)) : ((int)((R)-0.5)) )
#ifdef CGAL_HEADER_ONLY
inline int& get_static_verbose_reech4x4()
{
static int _VERBOSE_REECH_ = 0;
return _VERBOSE_REECH_;
}
#else // CGAL_HEADER_ONLY
static int _VERBOSE_REECH_ = 0;
inline int& get_static_verbose_reech4x4()
{ return _VERBOSE_REECH_; }
#endif // CGAL_HEADER_ONLY
/* Resampling procedure.
Work for 3D images, not for vectorial ones.
(double* mat) is the matrix which permits to get
from resBuf into theBuf.
If one only have the matrix from theBuf into resBuf,
it must be inverted first.
Soit x le point transforme et ix=(int)x;
nous allons distinguer les cas suivants :
x < -0.5 => resultat = 0
-0.5 <= x < 0.0 => ix=0, on n'interpole pas selon X
0.0 < x && ix < dimx-1 => on interpole selon X
x < dimx-0.5 => ix=dimx-1, on n'interpole pas selon X
x >= dimx-0.5 => resultat = 0
*/
CGAL_INLINE_FUNCTION
void Reech3DTriLin4x4_u8 ( void* theBuf, /* buffer to be resampled */
int *theDim, /* dimensions of this buffer */
void* resBuf, /* result buffer */
int *resDim, /* dimensions of this buffer */
double* mat /* transformation matrix */
)
{
int i, j, k, ix, iy, iz;
double x, y, z, dx, dy, dz, dxdy,dxdz,dydz,dxdydz;
double res;
double v6, v5, v4;
int rdimx=resDim[0], rdimy=resDim[1], rdimz=resDim[2];
int tdimx=theDim[0], tdimy=theDim[1], tdimz=theDim[2];
int tdimxy=tdimx*tdimy;
int toffset1=tdimxy+tdimx+1, toffset2=tdimxy-tdimx-1;
int t1dimx=tdimx-1, t1dimy=tdimy-1, t1dimz=tdimz-1;
double ddimx = (double)tdimx-0.5, ddimy = (double)tdimy-0.5;
double ddimz = (double)tdimz-0.5;
u8 *tbuf = (u8*)theBuf;
u8 *tpt;
u8 *rbuf = (u8*)resBuf;
for ( k = 0; k < rdimz; k ++ ) {
if ( get_static_verbose_reech4x4() != 0 )
fprintf( stderr, "Processing slice %d\r", k );
for ( j = 0; j < rdimy; j ++ )
for ( i = 0; i < rdimx; i ++, rbuf ++ ) {
/* computation of the corresponding point coordinates in theBuf */
x = mat[0] * i + mat[1] * j + mat[2] * k + mat[3];
if ((x < -0.5) || ( x > ddimx)) { *rbuf = 0; continue; }
y = mat[4] * i + mat[5] * j + mat[6] * k + mat[7];
if ((y < -0.5) || ( y > ddimy)) { *rbuf = 0; continue; }
z = mat[8] * i + mat[9] * j + mat[10] * k + mat[11];
if ((z < -0.5) || ( z > ddimz)) { *rbuf = 0; continue; }
/* here, the point lies on the borders or completely inside
the image */
ix = (int)x;
iy = (int)y;
iz = (int)z;
tpt = (u8 *)tbuf;
/* are we on the border or not ? */
if ( (x > 0.0) && (ix < t1dimx) &&
(y > 0.0) && (iy < t1dimy) &&
(z > 0.0) && (iz < t1dimz) ) {
/* the corresponding point is in the box defined
by (ix[+1],iy[+1],iz[+1]) */
dx = x - ix;
dy = y - iy;
dz = z - iz;
dxdy = dx*dy;
dxdz = dx*dz;
dydz = dy*dz;
dxdydz = dxdy*dz;
/* we have
v[7]=dxdydz; coefficient of tbuf(ix+1,iy+1,iz+1)
v[6]=dxdz-dxdydz; coefficient of tbuf(ix+1,iy, iz+1)
v[5]=dxdy-dxdydz; coefficient of tbuf(ix+1,iy+1,iz )
v[4]=dx-dxdy-v[6]; coefficient of tbuf(ix+1,iy ,iz )
v[3]=dydz-dxdydz; coefficient of tbuf(ix ,iy+1,iz+1)
v[2]=dz-dydz-v[6]; coefficient of tbuf(ix ,iy ,iz+1)
v[1]=dy-dydz-v[5]; coefficient of tbuf(ix ,iy+1,iz )
v[0]=1-dy-dz+dydz-v[4]; coefficient of tbuf(ix ,iy ,iz )
*/
tpt += ix + iy * tdimx + iz * tdimxy + toffset1;
v6 = dxdz-dxdydz;
v5 = dxdy-dxdydz;
v4 = dx-dxdy-v6;
res = 0;
res += dxdydz * (*tpt); /* tbuf(ix+1,iy+1,iz+1) */
tpt --;
res += (dydz-dxdydz) * (*tpt); /* tbuf(ix ,iy+1,iz+1) */
tpt -= t1dimx;
res += v6 * (*tpt); /* tbuf(ix+1 ,iy, iz+1) */
tpt --;
res += (dz-dydz-v6) * (*tpt); /* tbuf(ix ,iy ,iz+1) */
tpt -= toffset2;
res += v5 * (*tpt); /* tbuf(ix+1,iy+1,iz ) */
tpt --;
res += (dy-dydz-v5) * (*tpt); /* tbuf(ix ,iy+1,iz ) */
tpt -= t1dimx;
res += v4 * (*tpt); /* tbuf(ix+1,iy ,iz ) */
tpt --;
res += (1-dy-dz+dydz-v4) * (*tpt); /* tbuf(ix ,iy ,iz ) */
*rbuf = (u8)_CONVERTI_( res );
continue;
}
/* here, we are sure we are on some border */
tpt += ix + iy * tdimx + iz * tdimxy;
if ( (x < 0.0) || (ix == t1dimx) ) {
if ( (y < 0.0) || (iy == t1dimy) ) {
if ( (z < 0.0) || (iz == t1dimz) ) {
*rbuf = *tpt;
continue;
}
dz = z - iz;
res = (1-dz) * (*tpt); /* (1-dz)* tbuf(ix,iy,iz) */
tpt += tdimxy;
res += dz * (*tpt); /* dz * tbuf(ix,iy,iz+1) */
*rbuf = (u8)_CONVERTI_( res );
continue;
}
dy = y - iy;
if ( (z < 0.0) || (iz == t1dimz) ) {
res = (1-dy) * (*tpt); /* (1-dy)* tbuf(ix,iy,iz) */
tpt += tdimx;
res += dy * (*tpt); /* dy * tbuf(ix,iy+1,iz) */
*rbuf = (u8)_CONVERTI_( res );
continue;
}
dz = z - iz;
res = (1-dy)*(1-dz) * (*tpt); /* tbuf(ix,iy,iz) */
tpt += tdimx;
res += dy*(1-dz) * (*tpt); /* tbuf(ix,iy+1,iz) */
tpt += toffset2+1;
res += (1-dy)*dz * (*tpt); /* tbuf(ix,iy,iz+1) */
tpt += tdimx;
res += dy*dz * (*tpt); /* tbuf(ix,iy+1,iz+1) */
*rbuf = (u8)_CONVERTI_( res );
continue;
}
/* here we are sure that the border is either
along the Y or the Z axis */
dx = x - ix;
if ( (y < 0.0) || (iy == t1dimy) ) {
if ( (z < 0.0) || (iz == t1dimz) ) {
res = (1-dx) * (*tpt); /* tbuf(ix,iy,iz) */
tpt ++;
res += dx * (*tpt); /* tbuf(ix+1,iy,iz) */
*rbuf = (u8)_CONVERTI_( res );
continue;
}
dz = z - iz;
res = (1-dx)*(1-dz) * (*tpt); /* tbuf(ix,iy,iz) */
tpt ++;
res += dx*(1-dz) * (*tpt); /* tbuf(ix+1,iy,iz) */
tpt += tdimxy-1;
res += (1-dx)*dz * (*tpt); /* tbuf(ix,iy,iz+1) */
tpt ++;
res += dx*dz * (*tpt); /* tbuf(ix+1,iy,iz+1) */
*rbuf = (u8)_CONVERTI_( res );
continue;
}
/* here we are sure that the border is along the Z axis */
dy = y - iy;
res = (1-dx)*(1-dy) * (*tpt); /* tbuf(ix,iy,iz) */
tpt ++;
res += dx*(1-dy) * (*tpt); /* tbuf(ix+1,iy,iz) */
tpt += t1dimx;
res += (1-dx)*dy * (*tpt); /* tbuf(ix,iy+1,iz) */
tpt ++;
res += dx*dy * (*tpt); /* tbuf(ix+1,iy+1,iz) */
*rbuf = (u8)_CONVERTI_( res );
}
}
}
CGAL_INLINE_FUNCTION
void Reech3DTriLin4x4gb_u8 ( void* theBuf, /* buffer to be resampled */
int *theDim, /* dimensions of this buffer */
void* resBuf, /* result buffer */
int *resDim, /* dimensions of this buffer */
double* mat, /* transformation matrix */
float gain,
float bias )
{
int i, j, k, ix, iy, iz;
double x, y, z, dx, dy, dz, dxdy,dxdz,dydz,dxdydz;
double res;
double v6, v5, v4;
int rdimx=resDim[0], rdimy=resDim[1], rdimz=resDim[2];
int tdimx=theDim[0], tdimy=theDim[1], tdimz=theDim[2];
int tdimxy=tdimx*tdimy;
int toffset1=tdimxy+tdimx+1, toffset2=tdimxy-tdimx-1;
int t1dimx=tdimx-1, t1dimy=tdimy-1, t1dimz=tdimz-1;
double ddimx = (double)tdimx-0.5, ddimy = (double)tdimy-0.5;
double ddimz = (double)tdimz-0.5;
u8 *tbuf = (u8*)theBuf;
u8 *tpt;
u8 *rbuf = (u8*)resBuf;
double b=bias;
double g=gain;
for ( k = 0; k < rdimz; k ++ ) {
if ( get_static_verbose_reech4x4() != 0 )
fprintf( stderr, "Processing slice %d\r", k );
for ( j = 0; j < rdimy; j ++ )
for ( i = 0; i < rdimx; i ++, rbuf ++ ) {
/* computation of the corresponding point coordinates in theBuf */
x = mat[0] * i + mat[1] * j + mat[2] * k + mat[3];
if ((x < -0.5) || ( x > ddimx)) { *rbuf = 0; continue; }
y = mat[4] * i + mat[5] * j + mat[6] * k + mat[7];
if ((y < -0.5) || ( y > ddimy)) { *rbuf = 0; continue; }
z = mat[8] * i + mat[9] * j + mat[10] * k + mat[11];
if ((z < -0.5) || ( z > ddimz)) { *rbuf = 0; continue; }
/* here, the point lies on the borders or completely inside
the image */
ix = (int)x;
iy = (int)y;
iz = (int)z;
tpt = (u8 *)tbuf;
/* are we on the border or not ? */
if ( (x > 0.0) && (ix < t1dimx) &&
(y > 0.0) && (iy < t1dimy) &&
(z > 0.0) && (iz < t1dimz) ) {
/* the corresponding point is in the box defined
by (ix[+1],iy[+1],iz[+1]) */
dx = x - ix;
dy = y - iy;
dz = z - iz;
dxdy = dx*dy;
dxdz = dx*dz;
dydz = dy*dz;
dxdydz = dxdy*dz;
/* we have
v[7]=dxdydz; coefficient of tbuf(ix+1,iy+1,iz+1)
v[6]=dxdz-dxdydz; coefficient of tbuf(ix+1,iy, iz+1)
v[5]=dxdy-dxdydz; coefficient of tbuf(ix+1,iy+1,iz )
v[4]=dx-dxdy-v[6]; coefficient of tbuf(ix+1,iy ,iz )
v[3]=dydz-dxdydz; coefficient of tbuf(ix ,iy+1,iz+1)
v[2]=dz-dydz-v[6]; coefficient of tbuf(ix ,iy ,iz+1)
v[1]=dy-dydz-v[5]; coefficient of tbuf(ix ,iy+1,iz )
v[0]=1-dy-dz+dydz-v[4]; coefficient of tbuf(ix ,iy ,iz )
*/
tpt += ix + iy * tdimx + iz * tdimxy + toffset1;
v6 = dxdz-dxdydz;
v5 = dxdy-dxdydz;
v4 = dx-dxdy-v6;
res = 0;
res += dxdydz * (*tpt); /* tbuf(ix+1,iy+1,iz+1) */
tpt --;
res += (dydz-dxdydz) * (*tpt); /* tbuf(ix ,iy+1,iz+1) */
tpt -= t1dimx;
res += v6 * (*tpt); /* tbuf(ix+1 ,iy, iz+1) */
tpt --;
res += (dz-dydz-v6) * (*tpt); /* tbuf(ix ,iy ,iz+1) */
tpt -= toffset2;
res += v5 * (*tpt); /* tbuf(ix+1,iy+1,iz ) */
tpt --;
res += (dy-dydz-v5) * (*tpt); /* tbuf(ix ,iy+1,iz ) */
tpt -= t1dimx;
res += v4 * (*tpt); /* tbuf(ix+1,iy ,iz ) */
tpt --;
res += (1-dy-dz+dydz-v4) * (*tpt); /* tbuf(ix ,iy ,iz ) */
res = res * g + b;
*rbuf = (u8)_CONVERTI_( res );
continue;
}
/* here, we are sure we are on some border */
tpt += ix + iy * tdimx + iz * tdimxy;
if ( (x < 0.0) || (ix == t1dimx) ) {
if ( (y < 0.0) || (iy == t1dimy) ) {
if ( (z < 0.0) || (iz == t1dimz) ) {
res = (double)(*tpt) * g + b;
*rbuf = (u8)_CONVERTI_( res );
continue;
}
dz = z - iz;
res = (1-dz) * (*tpt); /* (1-dz)* tbuf(ix,iy,iz) */
tpt += tdimxy;
res += dz * (*tpt); /* dz * tbuf(ix,iy,iz+1) */
res = res * g + b;
*rbuf = (u8)_CONVERTI_( res );
continue;
}
dy = y - iy;
if ( (z < 0.0) || (iz == t1dimz) ) {
res = (1-dy) * (*tpt); /* (1-dy)* tbuf(ix,iy,iz) */
tpt += tdimx;
res += dy * (*tpt); /* dy * tbuf(ix,iy+1,iz) */
res = res * g + b;
*rbuf = (u8)_CONVERTI_( res );
continue;
}
dz = z - iz;
res = (1-dy)*(1-dz) * (*tpt); /* tbuf(ix,iy,iz) */
tpt += tdimx;
res += dy*(1-dz) * (*tpt); /* tbuf(ix,iy+1,iz) */
tpt += toffset2+1;
res += (1-dy)*dz * (*tpt); /* tbuf(ix,iy,iz+1) */
tpt += tdimx;
res += dy*dz * (*tpt); /* tbuf(ix,iy+1,iz+1) */
res = res * g + b;
*rbuf = (u8)_CONVERTI_( res );
continue;
}
/* here we are sure that the border is either
along the Y or the Z axis */
dx = x - ix;
if ( (y < 0.0) || (iy == t1dimy) ) {
if ( (z < 0.0) || (iz == t1dimz) ) {
res = (1-dx) * (*tpt); /* tbuf(ix,iy,iz) */
tpt ++;
res += dx * (*tpt); /* tbuf(ix+1,iy,iz) */
res = res * g + b;
*rbuf = (u8)_CONVERTI_( res );
continue;
}
dz = z - iz;
res = (1-dx)*(1-dz) * (*tpt); /* tbuf(ix,iy,iz) */
tpt ++;
res += dx*(1-dz) * (*tpt); /* tbuf(ix+1,iy,iz) */
tpt += tdimxy-1;
res += (1-dx)*dz * (*tpt); /* tbuf(ix,iy,iz+1) */
tpt ++;
res += dx*dz * (*tpt); /* tbuf(ix+1,iy,iz+1) */
res = res * g + b;
*rbuf = (u8)_CONVERTI_( res );
continue;
}
/* here we are sure that the border is along the Z axis */
dy = y - iy;
res = (1-dx)*(1-dy) * (*tpt); /* tbuf(ix,iy,iz) */
tpt ++;
res += dx*(1-dy) * (*tpt); /* tbuf(ix+1,iy,iz) */
tpt += t1dimx;
res += (1-dx)*dy * (*tpt); /* tbuf(ix,iy+1,iz) */
tpt ++;
res += dx*dy * (*tpt); /* tbuf(ix+1,iy+1,iz) */
res = res * g + b;
*rbuf = (u8)_CONVERTI_( res );
}
}
}
CGAL_INLINE_FUNCTION
void Reech3DNearest4x4_u8 ( void* theBuf, /* buffer to be resampled */
int *theDim, /* dimensions of this buffer */
void* resBuf, /* result buffer */
int *resDim, /* dimensions of this buffer */
double* mat /* transformation matrix */
)
{
int i, j, k, ix, iy, iz;
double x, y, z;
int rdimx=resDim[0], rdimy=resDim[1], rdimz=resDim[2];
int tdimx=theDim[0], tdimy=theDim[1], tdimz=theDim[2];
int tdimxy=tdimx*tdimy;
int t1dimx=tdimx-1, t1dimy=tdimy-1, t1dimz=tdimz-1;
u8 *tbuf = (u8*)theBuf;
u8 *rbuf = (u8*)resBuf;
for ( k = 0; k < rdimz; k ++ ) {
if ( get_static_verbose_reech4x4() != 0 )
fprintf( stderr, "Processing slice %d\r", k );
for ( j = 0; j < rdimy; j ++ )
for ( i = 0; i < rdimx; i ++, rbuf ++ ) {
/* computation of the corresponding point coordinates in theBuf */
x = mat[0] * i + mat[1] * j + mat[2] * k + mat[3];
ix = (int)(x+0.5);
if (( x < -0.5 ) || ( ix > t1dimx)) { *rbuf = 0; continue; }
y = mat[4] * i + mat[5] * j + mat[6] * k + mat[7];
iy = (int)(y+0.5);
if (( y < -0.5 ) || ( iy > t1dimy)) { *rbuf = 0; continue; }
z = mat[8] * i + mat[9] * j + mat[10] * k + mat[11];
iz = (int)(z+0.5);
if (( z < -0.5 ) || ( iz > t1dimz)) { *rbuf = 0; continue; }
*rbuf = tbuf[ ix + iy * tdimx + iz * tdimxy ];
}
}
}
CGAL_INLINE_FUNCTION
void Reech2DTriLin4x4_u8 ( void* theBuf, /* buffer to be resampled */
int *theDim, /* dimensions of this buffer */
void* resBuf, /* result buffer */
int *resDim, /* dimensions of this buffer */
double* mat /* transformation matrix */
)
{
int i, j, k, ix, iy;
double x, y, dx, dy, dxdy;
double res, v;
int rdimx=resDim[0], rdimy=resDim[1], rdimz=resDim[2];
int tdimx=theDim[0], tdimy=theDim[1];
int toffset=tdimx-1;
int t1dimx=tdimx-1, t1dimy=tdimy-1;
double ddimx = (double)tdimx-0.5, ddimy = (double)tdimy-0.5;
u8 *tbuf = (u8*)theBuf;
u8 *tpt;
u8 *rbuf = (u8*)resBuf;
for ( k = 0; k < rdimz; k ++ ) {
if ( get_static_verbose_reech4x4() != 0 )
fprintf( stderr, "Processing slice %d\r", k );
/* tbuf represente le premier point du plan */
tbuf = (u8*)theBuf;
tbuf += k*(tdimx * tdimy);
for ( j = 0; j < rdimy; j ++ )
for ( i = 0; i < rdimx; i ++, rbuf ++ ) {
/* computation of the corresponding point coordinates in theBuf */
x = mat[0] * i + mat[1] * j + mat[3];
if ((x < -0.5) || ( x > ddimx)) { *rbuf = 0; continue; }
y = mat[4] * i + mat[5] * j + mat[7];
if ((y < -0.5) || ( y > ddimy)) { *rbuf = 0; continue; }
/* here, the point lies on the borders or completely inside
the image */
ix = (int)x;
iy = (int)y;
tpt = (u8 *)tbuf;
tpt += ix + iy * tdimx;
/* are we on the border or not ? */
if ( (x > 0.0) && (ix < t1dimx) &&
(y > 0.0) && (iy < t1dimy) ) {
dx = x - ix;
dy = y - iy;
dxdy = dx*dy;
/* we have
v[5]=dxdy; coefficient of tbuf(ix+1,iy+1)
v[4]=dx-dxdy; coefficient of tbuf(ix+1,iy )
v[1]=dy-dxdy; coefficient of tbuf(ix ,iy+1)
v[0]=1-dx-dy+dxdy; coefficient of tbuf(ix ,iy )
*/
v = dy-dxdy;
res = 0;
res += (1-dx-v) * (*tpt); /* tbuf(ix ,iy ) */
tpt ++;
res += (dx-dxdy) * (*tpt); /* tbuf(ix+1,iy ) */
tpt += toffset;
res += v * (*tpt); /* tbuf(ix,iy+1 ) */
tpt ++;
res += dxdy * (*tpt); /* tbuf(ix+1,iy+1) */
*rbuf = (u8)_CONVERTI_( res );
continue;
}
/* here, we are sure we are on some border */
if ( (x < 0.0) || (ix == t1dimx) ) {
/* we just look at y */
if ( (y < 0.0) || (iy == t1dimy) ) {
*rbuf = *tpt;
continue;
}
dy = y - iy;
res = (1-dy) * (*tpt); /* (1-dy)* tbuf(ix,iy) */
tpt += tdimx;
res += dy * (*tpt); /* dy * tbuf(ix,iy+1) */
*rbuf = (u8)_CONVERTI_( res );
continue;
}
dx = x - ix;
res = (1-dx) * (*tpt); /* (1-dx)* tbuf(ix,iy) */
tpt ++;
res += dx * (*tpt); /* dx * tbuf(ix+1,iy) */
*rbuf = (u8)_CONVERTI_( res );
}
}
}
CGAL_INLINE_FUNCTION
void Reech2DTriLin4x4gb_u8 ( void* theBuf, /* buffer to be resampled */
int *theDim, /* dimensions of this buffer */
void* resBuf, /* result buffer */
int *resDim, /* dimensions of this buffer */
double* mat, /* transformation matrix */
float gain,
float bias )
{
int i, j, k, ix, iy;
double x, y, dx, dy, dxdy;
double res, v;
int rdimx=resDim[0], rdimy=resDim[1], rdimz=resDim[2];
int tdimx=theDim[0], tdimy=theDim[1];
int toffset=tdimx-1;
int t1dimx=tdimx-1, t1dimy=tdimy-1;
double ddimx = (double)tdimx-0.5, ddimy = (double)tdimy-0.5;
u8 *tbuf = (u8*)theBuf;
u8 *tpt;
u8 *rbuf = (u8*)resBuf;
double b=bias;
double g=gain;
for ( k = 0; k < rdimz; k ++ ) {
if ( get_static_verbose_reech4x4() != 0 )
fprintf( stderr, "Processing slice %d\r", k );
/* tbuf represente le premier point du plan */
tbuf = (u8*)theBuf;
tbuf += k*(tdimx * tdimy);
for ( j = 0; j < rdimy; j ++ )
for ( i = 0; i < rdimx; i ++, rbuf ++ ) {
/* computation of the corresponding point coordinates in theBuf */
x = mat[0] * i + mat[1] * j + mat[3];
if ((x < -0.5) || ( x > ddimx)) { *rbuf = 0; continue; }
y = mat[4] * i + mat[5] * j + mat[7];
if ((y < -0.5) || ( y > ddimy)) { *rbuf = 0; continue; }
/* here, the point lies on the borders or completely inside
the image */
ix = (int)x;
iy = (int)y;
tpt = (u8 *)tbuf;
tpt += ix + iy * tdimx;
/* are we on the border or not ? */
if ( (x > 0.0) && (ix < t1dimx) &&
(y > 0.0) && (iy < t1dimy) ) {
dx = x - ix;
dy = y - iy;
dxdy = dx*dy;
/* we have
v[5]=dxdy; coefficient of tbuf(ix+1,iy+1)
v[4]=dx-dxdy; coefficient of tbuf(ix+1,iy )
v[1]=dy-dxdy; coefficient of tbuf(ix ,iy+1)
v[0]=1-dx-dy+dxdy; coefficient of tbuf(ix ,iy )
*/
v = dy-dxdy;
res = 0;
res += (1-dx-v) * (*tpt); /* tbuf(ix ,iy ) */
tpt ++;
res += (dx-dxdy) * (*tpt); /* tbuf(ix+1,iy ) */
tpt += toffset;
res += v * (*tpt); /* tbuf(ix,iy+1 ) */
tpt ++;
res += dxdy * (*tpt); /* tbuf(ix+1,iy+1) */
res = res * g + b;
*rbuf = (u8)_CONVERTI_( res );
continue;
}
/* here, we are sure we are on some border */
if ( (x < 0.0) || (ix == t1dimx) ) {
/* we just look at y */
if ( (y < 0.0) || (iy == t1dimy) ) {
res = (double)(*tpt) * g + b;
*rbuf = (u8)_CONVERTI_( res );
continue;
}
dy = y - iy;
res = (1-dy) * (*tpt); /* (1-dy)* tbuf(ix,iy) */
tpt += tdimx;
res += dy * (*tpt); /* dy * tbuf(ix,iy+1) */
res = (double)(*tpt) * g + b;
*rbuf = (u8)_CONVERTI_( res );
continue;
}
dx = x - ix;
res = (1-dx) * (*tpt); /* (1-dx)* tbuf(ix,iy) */
tpt ++;
res += dx * (*tpt); /* dx * tbuf(ix+1,iy) */
res = res * g + b;
*rbuf = (u8)_CONVERTI_( res );
}
}
}
CGAL_INLINE_FUNCTION
void Reech2DNearest4x4_u8 ( void* theBuf, /* buffer to be resampled */
int *theDim, /* dimensions of this buffer */
void* resBuf, /* result buffer */
int *resDim, /* dimensions of this buffer */
double* mat /* transformation matrix */
)
{
int i, j, k, ix, iy;
double x, y;
int rdimx=resDim[0], rdimy=resDim[1], rdimz=resDim[2];
int tdimx=theDim[0], tdimy=theDim[1];
int t1dimx=tdimx-1, t1dimy=tdimy-1;
u8 *tbuf = (u8*)theBuf;
u8 *rbuf = (u8*)resBuf;
for ( k = 0; k < rdimz; k ++ ) {
if ( get_static_verbose_reech4x4() != 0 )
fprintf( stderr, "Processing slice %d\r", k );
/* tbuf represente le premier point du plan */
tbuf = (u8*)theBuf;
tbuf += k*(tdimx * tdimy);
for ( j = 0; j < rdimy; j ++ )
for ( i = 0; i < rdimx; i ++, rbuf ++ ) {
/* computation of the corresponding point coordinates in theBuf */
x = mat[0] * i + mat[1] * j + mat[3];
ix = (int)(x+0.5);
if (( x < -0.5 ) || ( ix > t1dimx)) { *rbuf = 0; continue; }
y = mat[4] * i + mat[5] * j + mat[7];
iy = (int)(y+0.5);
if (( y < -0.5 ) || ( iy > t1dimy)) { *rbuf = 0; continue; }
*rbuf = tbuf[ ix + iy * tdimx ];
}
}
}
/* Resampling procedure.
Work for 3D images, not for vectorial ones.
(double* mat) is the matrix which permits to get
from resBuf into theBuf.
If one only have the matrix from theBuf into resBuf,
it must be inverted first.
Soit x le point transforme et ix=(int)x;
nous allons distinguer les cas suivants :
x < -0.5 => resultat = 0
-0.5 <= x < 0.0 => ix=0, on n'interpole pas selon X
0.0 < x && ix < dimx-1 => on interpole selon X
x < dimx-0.5 => ix=dimx-1, on n'interpole pas selon X
x >= dimx-0.5 => resultat = 0
*/
CGAL_INLINE_FUNCTION
void Reech3DTriLin4x4_s8 ( void* theBuf, /* buffer to be resampled */
int *theDim, /* dimensions of this buffer */
void* resBuf, /* result buffer */
int *resDim, /* dimensions of this buffer */
double* mat /* transformation matrix */
)
{
int i, j, k, ix, iy, iz;
double x, y, z, dx, dy, dz, dxdy,dxdz,dydz,dxdydz;
double res;
double v6, v5, v4;
int rdimx=resDim[0], rdimy=resDim[1], rdimz=resDim[2];
int tdimx=theDim[0], tdimy=theDim[1], tdimz=theDim[2];
int tdimxy=tdimx*tdimy;
int toffset1=tdimxy+tdimx+1, toffset2=tdimxy-tdimx-1;
int t1dimx=tdimx-1, t1dimy=tdimy-1, t1dimz=tdimz-1;
double ddimx = (double)tdimx-0.5, ddimy = (double)tdimy-0.5;
double ddimz = (double)tdimz-0.5;
s8 *tbuf = (s8*)theBuf;
s8 *tpt;
s8 *rbuf = (s8*)resBuf;
for ( k = 0; k < rdimz; k ++ ) {
if ( get_static_verbose_reech4x4() != 0 )
fprintf( stderr, "Processing slice %d\r", k );
for ( j = 0; j < rdimy; j ++ )
for ( i = 0; i < rdimx; i ++, rbuf ++ ) {
/* computation of the corresponding point coordinates in theBuf */
x = mat[0] * i + mat[1] * j + mat[2] * k + mat[3];
if ((x < -0.5) || ( x > ddimx)) { *rbuf = 0; continue; }
y = mat[4] * i + mat[5] * j + mat[6] * k + mat[7];
if ((y < -0.5) || ( y > ddimy)) { *rbuf = 0; continue; }
z = mat[8] * i + mat[9] * j + mat[10] * k + mat[11];
if ((z < -0.5) || ( z > ddimz)) { *rbuf = 0; continue; }
/* here, the point lies on the borders or completely inside
the image */
ix = (int)x;
iy = (int)y;
iz = (int)z;
tpt = (s8 *)tbuf;
/* are we on the border or not ? */
if ( (x > 0.0) && (ix < t1dimx) &&
(y > 0.0) && (iy < t1dimy) &&
(z > 0.0) && (iz < t1dimz) ) {
/* the corresponding point is in the box defined
by (ix[+1],iy[+1],iz[+1]) */
dx = x - ix;
dy = y - iy;
dz = z - iz;
dxdy = dx*dy;
dxdz = dx*dz;
dydz = dy*dz;
dxdydz = dxdy*dz;
/* we have
v[7]=dxdydz; coefficient of tbuf(ix+1,iy+1,iz+1)
v[6]=dxdz-dxdydz; coefficient of tbuf(ix+1,iy, iz+1)
v[5]=dxdy-dxdydz; coefficient of tbuf(ix+1,iy+1,iz )
v[4]=dx-dxdy-v[6]; coefficient of tbuf(ix+1,iy ,iz )
v[3]=dydz-dxdydz; coefficient of tbuf(ix ,iy+1,iz+1)
v[2]=dz-dydz-v[6]; coefficient of tbuf(ix ,iy ,iz+1)
v[1]=dy-dydz-v[5]; coefficient of tbuf(ix ,iy+1,iz )
v[0]=1-dy-dz+dydz-v[4]; coefficient of tbuf(ix ,iy ,iz )
*/
tpt += ix + iy * tdimx + iz * tdimxy + toffset1;
v6 = dxdz-dxdydz;
v5 = dxdy-dxdydz;
v4 = dx-dxdy-v6;
res = 0;
res += dxdydz * (*tpt); /* tbuf(ix+1,iy+1,iz+1) */
tpt --;
res += (dydz-dxdydz) * (*tpt); /* tbuf(ix ,iy+1,iz+1) */
tpt -= t1dimx;
res += v6 * (*tpt); /* tbuf(ix+1 ,iy, iz+1) */
tpt --;
res += (dz-dydz-v6) * (*tpt); /* tbuf(ix ,iy ,iz+1) */
tpt -= toffset2;
res += v5 * (*tpt); /* tbuf(ix+1,iy+1,iz ) */
tpt --;
res += (dy-dydz-v5) * (*tpt); /* tbuf(ix ,iy+1,iz ) */
tpt -= t1dimx;
res += v4 * (*tpt); /* tbuf(ix+1,iy ,iz ) */
tpt --;
res += (1-dy-dz+dydz-v4) * (*tpt); /* tbuf(ix ,iy ,iz ) */
*rbuf = (s8)_CONVERTI_( res );
continue;
}
/* here, we are sure we are on some border */
tpt += ix + iy * tdimx + iz * tdimxy;
if ( (x < 0.0) || (ix == t1dimx) ) {
if ( (y < 0.0) || (iy == t1dimy) ) {
if ( (z < 0.0) || (iz == t1dimz) ) {
*rbuf = *tpt;
continue;
}
dz = z - iz;
res = (1-dz) * (*tpt); /* (1-dz)* tbuf(ix,iy,iz) */
tpt += tdimxy;
res += dz * (*tpt); /* dz * tbuf(ix,iy,iz+1) */
*rbuf = (s8)_CONVERTI_( res );
continue;
}
dy = y - iy;
if ( (z < 0.0) || (iz == t1dimz) ) {
res = (1-dy) * (*tpt); /* (1-dy)* tbuf(ix,iy,iz) */
tpt += tdimx;
res += dy * (*tpt); /* dy * tbuf(ix,iy+1,iz) */
*rbuf = (s8)_CONVERTI_( res );
continue;
}
dz = z - iz;
res = (1-dy)*(1-dz) * (*tpt); /* tbuf(ix,iy,iz) */
tpt += tdimx;
res += dy*(1-dz) * (*tpt); /* tbuf(ix,iy+1,iz) */
tpt += toffset2+1;
res += (1-dy)*dz * (*tpt); /* tbuf(ix,iy,iz+1) */
tpt += tdimx;
res += dy*dz * (*tpt); /* tbuf(ix,iy+1,iz+1) */
*rbuf = (s8)_CONVERTI_( res );
continue;
}
/* here we are sure that the border is either
along the Y or the Z axis */
dx = x - ix;
if ( (y < 0.0) || (iy == t1dimy) ) {
if ( (z < 0.0) || (iz == t1dimz) ) {
res = (1-dx) * (*tpt); /* tbuf(ix,iy,iz) */
tpt ++;
res += dx * (*tpt); /* tbuf(ix+1,iy,iz) */
*rbuf = (s8)_CONVERTI_( res );
continue;
}
dz = z - iz;
res = (1-dx)*(1-dz) * (*tpt); /* tbuf(ix,iy,iz) */
tpt ++;
res += dx*(1-dz) * (*tpt); /* tbuf(ix+1,iy,iz) */
tpt += tdimxy-1;
res += (1-dx)*dz * (*tpt); /* tbuf(ix,iy,iz+1) */
tpt ++;
res += dx*dz * (*tpt); /* tbuf(ix+1,iy,iz+1) */
*rbuf = (s8)_CONVERTI_( res );
continue;
}
/* here we are sure that the border is along the Z axis */
dy = y - iy;
res = (1-dx)*(1-dy) * (*tpt); /* tbuf(ix,iy,iz) */
tpt ++;
res += dx*(1-dy) * (*tpt); /* tbuf(ix+1,iy,iz) */
tpt += t1dimx;
res += (1-dx)*dy * (*tpt); /* tbuf(ix,iy+1,iz) */
tpt ++;
res += dx*dy * (*tpt); /* tbuf(ix+1,iy+1,iz) */
*rbuf = (s8)_CONVERTI_( res );
}
}
}
CGAL_INLINE_FUNCTION
void Reech3DTriLin4x4gb_s8 ( void* theBuf, /* buffer to be resampled */
int *theDim, /* dimensions of this buffer */
void* resBuf, /* result buffer */
int *resDim, /* dimensions of this buffer */
double* mat, /* transformation matrix */
float gain,
float bias )
{
int i, j, k, ix, iy, iz;
double x, y, z, dx, dy, dz, dxdy,dxdz,dydz,dxdydz;
double res;
double v6, v5, v4;
int rdimx=resDim[0], rdimy=resDim[1], rdimz=resDim[2];
int tdimx=theDim[0], tdimy=theDim[1], tdimz=theDim[2];
int tdimxy=tdimx*tdimy;
int toffset1=tdimxy+tdimx+1, toffset2=tdimxy-tdimx-1;
int t1dimx=tdimx-1, t1dimy=tdimy-1, t1dimz=tdimz-1;
double ddimx = (double)tdimx-0.5, ddimy = (double)tdimy-0.5;
double ddimz = (double)tdimz-0.5;
s8 *tbuf = (s8*)theBuf;
s8 *tpt;
s8 *rbuf = (s8*)resBuf;
double b=bias;
double g=gain;
for ( k = 0; k < rdimz; k ++ ) {
if ( get_static_verbose_reech4x4() != 0 )
fprintf( stderr, "Processing slice %d\r", k );
for ( j = 0; j < rdimy; j ++ )
for ( i = 0; i < rdimx; i ++, rbuf ++ ) {
/* computation of the corresponding point coordinates in theBuf */
x = mat[0] * i + mat[1] * j + mat[2] * k + mat[3];
if ((x < -0.5) || ( x > ddimx)) { *rbuf = 0; continue; }
y = mat[4] * i + mat[5] * j + mat[6] * k + mat[7];
if ((y < -0.5) || ( y > ddimy)) { *rbuf = 0; continue; }
z = mat[8] * i + mat[9] * j + mat[10] * k + mat[11];
if ((z < -0.5) || ( z > ddimz)) { *rbuf = 0; continue; }
/* here, the point lies on the borders or completely inside
the image */
ix = (int)x;
iy = (int)y;
iz = (int)z;
tpt = (s8 *)tbuf;
/* are we on the border or not ? */
if ( (x > 0.0) && (ix < t1dimx) &&
(y > 0.0) && (iy < t1dimy) &&
(z > 0.0) && (iz < t1dimz) ) {
/* the corresponding point is in the box defined
by (ix[+1],iy[+1],iz[+1]) */
dx = x - ix;
dy = y - iy;
dz = z - iz;
dxdy = dx*dy;
dxdz = dx*dz;
dydz = dy*dz;
dxdydz = dxdy*dz;
/* we have
v[7]=dxdydz; coefficient of tbuf(ix+1,iy+1,iz+1)
v[6]=dxdz-dxdydz; coefficient of tbuf(ix+1,iy, iz+1)
v[5]=dxdy-dxdydz; coefficient of tbuf(ix+1,iy+1,iz )
v[4]=dx-dxdy-v[6]; coefficient of tbuf(ix+1,iy ,iz )
v[3]=dydz-dxdydz; coefficient of tbuf(ix ,iy+1,iz+1)
v[2]=dz-dydz-v[6]; coefficient of tbuf(ix ,iy ,iz+1)
v[1]=dy-dydz-v[5]; coefficient of tbuf(ix ,iy+1,iz )
v[0]=1-dy-dz+dydz-v[4]; coefficient of tbuf(ix ,iy ,iz )
*/
tpt += ix + iy * tdimx + iz * tdimxy + toffset1;
v6 = dxdz-dxdydz;
v5 = dxdy-dxdydz;
v4 = dx-dxdy-v6;
res = 0;
res += dxdydz * (*tpt); /* tbuf(ix+1,iy+1,iz+1) */
tpt --;
res += (dydz-dxdydz) * (*tpt); /* tbuf(ix ,iy+1,iz+1) */
tpt -= t1dimx;
res += v6 * (*tpt); /* tbuf(ix+1 ,iy, iz+1) */
tpt --;
res += (dz-dydz-v6) * (*tpt); /* tbuf(ix ,iy ,iz+1) */
tpt -= toffset2;
res += v5 * (*tpt); /* tbuf(ix+1,iy+1,iz ) */
tpt --;
res += (dy-dydz-v5) * (*tpt); /* tbuf(ix ,iy+1,iz ) */
tpt -= t1dimx;
res += v4 * (*tpt); /* tbuf(ix+1,iy ,iz ) */
tpt --;
res += (1-dy-dz+dydz-v4) * (*tpt); /* tbuf(ix ,iy ,iz ) */
res = res * g + b;
*rbuf = (s8)_CONVERTI_( res );
continue;
}
/* here, we are sure we are on some border */
tpt += ix + iy * tdimx + iz * tdimxy;
if ( (x < 0.0) || (ix == t1dimx) ) {
if ( (y < 0.0) || (iy == t1dimy) ) {
if ( (z < 0.0) || (iz == t1dimz) ) {
res = (double)(*tpt) * g + b;
*rbuf = (s8)_CONVERTI_( res );
continue;
}
dz = z - iz;
res = (1-dz) * (*tpt); /* (1-dz)* tbuf(ix,iy,iz) */
tpt += tdimxy;
res += dz * (*tpt); /* dz * tbuf(ix,iy,iz+1) */
res = res * g + b;
*rbuf = (s8)_CONVERTI_( res );
continue;
}
dy = y - iy;
if ( (z < 0.0) || (iz == t1dimz) ) {
res = (1-dy) * (*tpt); /* (1-dy)* tbuf(ix,iy,iz) */
tpt += tdimx;
res += dy * (*tpt); /* dy * tbuf(ix,iy+1,iz) */
res = res * g + b;
*rbuf = (s8)_CONVERTI_( res );
continue;
}
dz = z - iz;
res = (1-dy)*(1-dz) * (*tpt); /* tbuf(ix,iy,iz) */
tpt += tdimx;
res += dy*(1-dz) * (*tpt); /* tbuf(ix,iy+1,iz) */
tpt += toffset2+1;
res += (1-dy)*dz * (*tpt); /* tbuf(ix,iy,iz+1) */
tpt += tdimx;
res += dy*dz * (*tpt); /* tbuf(ix,iy+1,iz+1) */
res = res * g + b;
*rbuf = (s8)_CONVERTI_( res );
continue;
}
/* here we are sure that the border is either
along the Y or the Z axis */
dx = x - ix;
if ( (y < 0.0) || (iy == t1dimy) ) {
if ( (z < 0.0) || (iz == t1dimz) ) {
res = (1-dx) * (*tpt); /* tbuf(ix,iy,iz) */
tpt ++;
res += dx * (*tpt); /* tbuf(ix+1,iy,iz) */
res = res * g + b;
*rbuf = (s8)_CONVERTI_( res );
continue;
}
dz = z - iz;
res = (1-dx)*(1-dz) * (*tpt); /* tbuf(ix,iy,iz) */
tpt ++;
res += dx*(1-dz) * (*tpt); /* tbuf(ix+1,iy,iz) */
tpt += tdimxy-1;
res += (1-dx)*dz * (*tpt); /* tbuf(ix,iy,iz+1) */
tpt ++;
res += dx*dz * (*tpt); /* tbuf(ix+1,iy,iz+1) */
res = res * g + b;
*rbuf = (s8)_CONVERTI_( res );
continue;
}
/* here we are sure that the border is along the Z axis */
dy = y - iy;
res = (1-dx)*(1-dy) * (*tpt); /* tbuf(ix,iy,iz) */
tpt ++;
res += dx*(1-dy) * (*tpt); /* tbuf(ix+1,iy,iz) */
tpt += t1dimx;
res += (1-dx)*dy * (*tpt); /* tbuf(ix,iy+1,iz) */
tpt ++;
res += dx*dy * (*tpt); /* tbuf(ix+1,iy+1,iz) */
res = res * g + b;
*rbuf = (s8)_CONVERTI_( res );
}
}
}
CGAL_INLINE_FUNCTION
void Reech3DNearest4x4_s8 ( void* theBuf, /* buffer to be resampled */
int *theDim, /* dimensions of this buffer */
void* resBuf, /* result buffer */
int *resDim, /* dimensions of this buffer */
double* mat /* transformation matrix */
)
{
int i, j, k, ix, iy, iz;
double x, y, z;
int rdimx=resDim[0], rdimy=resDim[1], rdimz=resDim[2];
int tdimx=theDim[0], tdimy=theDim[1], tdimz=theDim[2];
int tdimxy=tdimx*tdimy;
int t1dimx=tdimx-1, t1dimy=tdimy-1, t1dimz=tdimz-1;
s8 *tbuf = (s8*)theBuf;
s8 *rbuf = (s8*)resBuf;
for ( k = 0; k < rdimz; k ++ ) {
if ( get_static_verbose_reech4x4() != 0 )
fprintf( stderr, "Processing slice %d\r", k );
for ( j = 0; j < rdimy; j ++ )
for ( i = 0; i < rdimx; i ++, rbuf ++ ) {
/* computation of the corresponding point coordinates in theBuf */
x = mat[0] * i + mat[1] * j + mat[2] * k + mat[3];
ix = (int)(x+0.5);
if (( x < -0.5 ) || ( ix > t1dimx)) { *rbuf = 0; continue; }
y = mat[4] * i + mat[5] * j + mat[6] * k + mat[7];
iy = (int)(y+0.5);
if (( y < -0.5 ) || ( iy > t1dimy)) { *rbuf = 0; continue; }
z = mat[8] * i + mat[9] * j + mat[10] * k + mat[11];
iz = (int)(z+0.5);
if (( z < -0.5 ) || ( iz > t1dimz)) { *rbuf = 0; continue; }
*rbuf = tbuf[ ix + iy * tdimx + iz * tdimxy ];
}
}
}
CGAL_INLINE_FUNCTION
void Reech2DTriLin4x4_s8 ( void* theBuf, /* buffer to be resampled */
int *theDim, /* dimensions of this buffer */
void* resBuf, /* result buffer */
int *resDim, /* dimensions of this buffer */
double* mat /* transformation matrix */
)
{
int i, j, k, ix, iy;
double x, y, dx, dy, dxdy;
double res, v;
int rdimx=resDim[0], rdimy=resDim[1], rdimz=resDim[2];
int tdimx=theDim[0], tdimy=theDim[1];
int toffset=tdimx-1;
int t1dimx=tdimx-1, t1dimy=tdimy-1;
double ddimx = (double)tdimx-0.5, ddimy = (double)tdimy-0.5;
s8 *tbuf = (s8*)theBuf;
s8 *tpt;
s8 *rbuf = (s8*)resBuf;
for ( k = 0; k < rdimz; k ++ ) {
if ( get_static_verbose_reech4x4() != 0 )
fprintf( stderr, "Processing slice %d\r", k );
/* tbuf represente le premier point du plan */
tbuf = (s8*)theBuf;
tbuf += k*(tdimx * tdimy);
for ( j = 0; j < rdimy; j ++ )
for ( i = 0; i < rdimx; i ++, rbuf ++ ) {
/* computation of the corresponding point coordinates in theBuf */
x = mat[0] * i + mat[1] * j + mat[3];
if ((x < -0.5) || ( x > ddimx)) { *rbuf = 0; continue; }
y = mat[4] * i + mat[5] * j + mat[7];
if ((y < -0.5) || ( y > ddimy)) { *rbuf = 0; continue; }
/* here, the point lies on the borders or completely inside
the image */
ix = (int)x;
iy = (int)y;
tpt = (s8 *)tbuf;
tpt += ix + iy * tdimx;
/* are we on the border or not ? */
if ( (x > 0.0) && (ix < t1dimx) &&
(y > 0.0) && (iy < t1dimy) ) {
dx = x - ix;
dy = y - iy;
dxdy = dx*dy;
/* we have
v[5]=dxdy; coefficient of tbuf(ix+1,iy+1)
v[4]=dx-dxdy; coefficient of tbuf(ix+1,iy )
v[1]=dy-dxdy; coefficient of tbuf(ix ,iy+1)
v[0]=1-dx-dy+dxdy; coefficient of tbuf(ix ,iy )
*/
v = dy-dxdy;
res = 0;
res += (1-dx-v) * (*tpt); /* tbuf(ix ,iy ) */
tpt ++;
res += (dx-dxdy) * (*tpt); /* tbuf(ix+1,iy ) */
tpt += toffset;
res += v * (*tpt); /* tbuf(ix,iy+1 ) */
tpt ++;
res += dxdy * (*tpt); /* tbuf(ix+1,iy+1) */
*rbuf = (s8)_CONVERTI_( res );
continue;
}
/* here, we are sure we are on some border */
if ( (x < 0.0) || (ix == t1dimx) ) {
/* we just look at y */
if ( (y < 0.0) || (iy == t1dimy) ) {
*rbuf = *tpt;
continue;
}
dy = y - iy;
res = (1-dy) * (*tpt); /* (1-dy)* tbuf(ix,iy) */
tpt += tdimx;
res += dy * (*tpt); /* dy * tbuf(ix,iy+1) */
*rbuf = (s8)_CONVERTI_( res );
continue;
}
dx = x - ix;
res = (1-dx) * (*tpt); /* (1-dx)* tbuf(ix,iy) */
tpt ++;
res += dx * (*tpt); /* dx * tbuf(ix+1,iy) */
*rbuf = (s8)_CONVERTI_( res );
}
}
}
CGAL_INLINE_FUNCTION
void Reech2DTriLin4x4gb_s8 ( void* theBuf, /* buffer to be resampled */
int *theDim, /* dimensions of this buffer */
void* resBuf, /* result buffer */
int *resDim, /* dimensions of this buffer */
double* mat, /* transformation matrix */
float gain,
float bias )
{
int i, j, k, ix, iy;
double x, y, dx, dy, dxdy;
double res, v;
int rdimx=resDim[0], rdimy=resDim[1], rdimz=resDim[2];
int tdimx=theDim[0], tdimy=theDim[1];
int toffset=tdimx-1;
int t1dimx=tdimx-1, t1dimy=tdimy-1;
double ddimx = (double)tdimx-0.5, ddimy = (double)tdimy-0.5;
s8 *tbuf = (s8*)theBuf;
s8 *tpt;
s8 *rbuf = (s8*)resBuf;
double b=bias;
double g=gain;
for ( k = 0; k < rdimz; k ++ ) {
if ( get_static_verbose_reech4x4() != 0 )
fprintf( stderr, "Processing slice %d\r", k );
/* tbuf represente le premier point du plan */
tbuf = (s8*)theBuf;
tbuf += k*(tdimx * tdimy);
for ( j = 0; j < rdimy; j ++ )
for ( i = 0; i < rdimx; i ++, rbuf ++ ) {
/* computation of the corresponding point coordinates in theBuf */
x = mat[0] * i + mat[1] * j + mat[3];
if ((x < -0.5) || ( x > ddimx)) { *rbuf = 0; continue; }
y = mat[4] * i + mat[5] * j + mat[7];
if ((y < -0.5) || ( y > ddimy)) { *rbuf = 0; continue; }
/* here, the point lies on the borders or completely inside
the image */
ix = (int)x;
iy = (int)y;
tpt = (s8 *)tbuf;
tpt += ix + iy * tdimx;
/* are we on the border or not ? */
if ( (x > 0.0) && (ix < t1dimx) &&
(y > 0.0) && (iy < t1dimy) ) {
dx = x - ix;
dy = y - iy;
dxdy = dx*dy;
/* we have
v[5]=dxdy; coefficient of tbuf(ix+1,iy+1)
v[4]=dx-dxdy; coefficient of tbuf(ix+1,iy )
v[1]=dy-dxdy; coefficient of tbuf(ix ,iy+1)
v[0]=1-dx-dy+dxdy; coefficient of tbuf(ix ,iy )
*/
v = dy-dxdy;
res = 0;
res += (1-dx-v) * (*tpt); /* tbuf(ix ,iy ) */
tpt ++;
res += (dx-dxdy) * (*tpt); /* tbuf(ix+1,iy ) */
tpt += toffset;
res += v * (*tpt); /* tbuf(ix,iy+1 ) */
tpt ++;
res += dxdy * (*tpt); /* tbuf(ix+1,iy+1) */
res = res * g + b;
*rbuf = (s8)_CONVERTI_( res );
continue;
}
/* here, we are sure we are on some border */
if ( (x < 0.0) || (ix == t1dimx) ) {
/* we just look at y */
if ( (y < 0.0) || (iy == t1dimy) ) {
res = (double)(*tpt) * g + b;
*rbuf = (s8)_CONVERTI_( res );
continue;
}
dy = y - iy;
res = (1-dy) * (*tpt); /* (1-dy)* tbuf(ix,iy) */
tpt += tdimx;
res += dy * (*tpt); /* dy * tbuf(ix,iy+1) */
res = (double)(*tpt) * g + b;
*rbuf = (s8)_CONVERTI_( res );
continue;
}
dx = x - ix;
res = (1-dx) * (*tpt); /* (1-dx)* tbuf(ix,iy) */
tpt ++;
res += dx * (*tpt); /* dx * tbuf(ix+1,iy) */
res = res * g + b;
*rbuf = (s8)_CONVERTI_( res );
}
}
}
CGAL_INLINE_FUNCTION
void Reech2DNearest4x4_s8 ( void* theBuf, /* buffer to be resampled */
int *theDim, /* dimensions of this buffer */
void* resBuf, /* result buffer */
int *resDim, /* dimensions of this buffer */
double* mat /* transformation matrix */
)
{
int i, j, k, ix, iy;
double x, y;
int rdimx=resDim[0], rdimy=resDim[1], rdimz=resDim[2];
int tdimx=theDim[0], tdimy=theDim[1];
int t1dimx=tdimx-1, t1dimy=tdimy-1;
s8 *tbuf = (s8*)theBuf;
s8 *rbuf = (s8*)resBuf;
for ( k = 0; k < rdimz; k ++ ) {
if ( get_static_verbose_reech4x4() != 0 )
fprintf( stderr, "Processing slice %d\r", k );
/* tbuf represente le premier point du plan */
tbuf = (s8*)theBuf;
tbuf += k*(tdimx * tdimy);
for ( j = 0; j < rdimy; j ++ )
for ( i = 0; i < rdimx; i ++, rbuf ++ ) {
/* computation of the corresponding point coordinates in theBuf */
x = mat[0] * i + mat[1] * j + mat[3];
ix = (int)(x+0.5);
if (( x < -0.5 ) || ( ix > t1dimx)) { *rbuf = 0; continue; }
y = mat[4] * i + mat[5] * j + mat[7];
iy = (int)(y+0.5);
if (( y < -0.5 ) || ( iy > t1dimy)) { *rbuf = 0; continue; }
*rbuf = tbuf[ ix + iy * tdimx ];
}
}
}
/* Resampling procedure.
Work for 3D images, not for vectorial ones.
(double* mat) is the matrix which permits to get
from resBuf into theBuf.
If one only have the matrix from theBuf into resBuf,
it must be inverted first.
Soit x le point transforme et ix=(int)x;
nous allons distinguer les cas suivants :
x < -0.5 => resultat = 0
-0.5 <= x < 0.0 => ix=0, on n'interpole pas selon X
0.0 < x && ix < dimx-1 => on interpole selon X
x < dimx-0.5 => ix=dimx-1, on n'interpole pas selon X
x >= dimx-0.5 => resultat = 0
*/
CGAL_INLINE_FUNCTION
void Reech3DTriLin4x4_u16 ( void* theBuf, /* buffer to be resampled */
int *theDim, /* dimensions of this buffer */
void* resBuf, /* result buffer */
int *resDim, /* dimensions of this buffer */
double* mat /* transformation matrix */
)
{
int i, j, k, ix, iy, iz;
double x, y, z, dx, dy, dz, dxdy,dxdz,dydz,dxdydz;
double res;
double v6, v5, v4;
int rdimx=resDim[0], rdimy=resDim[1], rdimz=resDim[2];
int tdimx=theDim[0], tdimy=theDim[1], tdimz=theDim[2];
int tdimxy=tdimx*tdimy;
int toffset1=tdimxy+tdimx+1, toffset2=tdimxy-tdimx-1;
int t1dimx=tdimx-1, t1dimy=tdimy-1, t1dimz=tdimz-1;
double ddimx = (double)tdimx-0.5, ddimy = (double)tdimy-0.5;
double ddimz = (double)tdimz-0.5;
u16 *tbuf = (u16*)theBuf;
u16 *tpt;
u16 *rbuf = (u16*)resBuf;
for ( k = 0; k < rdimz; k ++ ) {
if ( get_static_verbose_reech4x4() != 0 )
fprintf( stderr, "Processing slice %d\r", k );
for ( j = 0; j < rdimy; j ++ )
for ( i = 0; i < rdimx; i ++, rbuf ++ ) {
/* computation of the corresponding point coordinates in theBuf */
x = mat[0] * i + mat[1] * j + mat[2] * k + mat[3];
if ((x < -0.5) || ( x > ddimx)) { *rbuf = 0; continue; }
y = mat[4] * i + mat[5] * j + mat[6] * k + mat[7];
if ((y < -0.5) || ( y > ddimy)) { *rbuf = 0; continue; }
z = mat[8] * i + mat[9] * j + mat[10] * k + mat[11];
if ((z < -0.5) || ( z > ddimz)) { *rbuf = 0; continue; }
/* here, the point lies on the borders or completely inside
the image */
ix = (int)x;
iy = (int)y;
iz = (int)z;
tpt = (u16 *)tbuf;
/* are we on the border or not ? */
if ( (x > 0.0) && (ix < t1dimx) &&
(y > 0.0) && (iy < t1dimy) &&
(z > 0.0) && (iz < t1dimz) ) {
/* the corresponding point is in the box defined
by (ix[+1],iy[+1],iz[+1]) */
dx = x - ix;
dy = y - iy;
dz = z - iz;
dxdy = dx*dy;
dxdz = dx*dz;
dydz = dy*dz;
dxdydz = dxdy*dz;
/* we have
v[7]=dxdydz; coefficient of tbuf(ix+1,iy+1,iz+1)
v[6]=dxdz-dxdydz; coefficient of tbuf(ix+1,iy, iz+1)
v[5]=dxdy-dxdydz; coefficient of tbuf(ix+1,iy+1,iz )
v[4]=dx-dxdy-v[6]; coefficient of tbuf(ix+1,iy ,iz )
v[3]=dydz-dxdydz; coefficient of tbuf(ix ,iy+1,iz+1)
v[2]=dz-dydz-v[6]; coefficient of tbuf(ix ,iy ,iz+1)
v[1]=dy-dydz-v[5]; coefficient of tbuf(ix ,iy+1,iz )
v[0]=1-dy-dz+dydz-v[4]; coefficient of tbuf(ix ,iy ,iz )
*/
tpt += ix + iy * tdimx + iz * tdimxy + toffset1;
v6 = dxdz-dxdydz;
v5 = dxdy-dxdydz;
v4 = dx-dxdy-v6;
res = 0;
res += dxdydz * (*tpt); /* tbuf(ix+1,iy+1,iz+1) */
tpt --;
res += (dydz-dxdydz) * (*tpt); /* tbuf(ix ,iy+1,iz+1) */
tpt -= t1dimx;
res += v6 * (*tpt); /* tbuf(ix+1 ,iy, iz+1) */
tpt --;
res += (dz-dydz-v6) * (*tpt); /* tbuf(ix ,iy ,iz+1) */
tpt -= toffset2;
res += v5 * (*tpt); /* tbuf(ix+1,iy+1,iz ) */
tpt --;
res += (dy-dydz-v5) * (*tpt); /* tbuf(ix ,iy+1,iz ) */
tpt -= t1dimx;
res += v4 * (*tpt); /* tbuf(ix+1,iy ,iz ) */
tpt --;
res += (1-dy-dz+dydz-v4) * (*tpt); /* tbuf(ix ,iy ,iz ) */
*rbuf = (u16)_CONVERTI_( res );
continue;
}
/* here, we are sure we are on some border */
tpt += ix + iy * tdimx + iz * tdimxy;
if ( (x < 0.0) || (ix == t1dimx) ) {
if ( (y < 0.0) || (iy == t1dimy) ) {
if ( (z < 0.0) || (iz == t1dimz) ) {
*rbuf = *tpt;
continue;
}
dz = z - iz;
res = (1-dz) * (*tpt); /* (1-dz)* tbuf(ix,iy,iz) */
tpt += tdimxy;
res += dz * (*tpt); /* dz * tbuf(ix,iy,iz+1) */
*rbuf = (u16)_CONVERTI_( res );
continue;
}
dy = y - iy;
if ( (z < 0.0) || (iz == t1dimz) ) {
res = (1-dy) * (*tpt); /* (1-dy)* tbuf(ix,iy,iz) */
tpt += tdimx;
res += dy * (*tpt); /* dy * tbuf(ix,iy+1,iz) */
*rbuf = (u16)_CONVERTI_( res );
continue;
}
dz = z - iz;
res = (1-dy)*(1-dz) * (*tpt); /* tbuf(ix,iy,iz) */
tpt += tdimx;
res += dy*(1-dz) * (*tpt); /* tbuf(ix,iy+1,iz) */
tpt += toffset2+1;
res += (1-dy)*dz * (*tpt); /* tbuf(ix,iy,iz+1) */
tpt += tdimx;
res += dy*dz * (*tpt); /* tbuf(ix,iy+1,iz+1) */
*rbuf = (u16)_CONVERTI_( res );
continue;
}
/* here we are sure that the border is either
along the Y or the Z axis */
dx = x - ix;
if ( (y < 0.0) || (iy == t1dimy) ) {
if ( (z < 0.0) || (iz == t1dimz) ) {
res = (1-dx) * (*tpt); /* tbuf(ix,iy,iz) */
tpt ++;
res += dx * (*tpt); /* tbuf(ix+1,iy,iz) */
*rbuf = (u16)_CONVERTI_( res );
continue;
}
dz = z - iz;
res = (1-dx)*(1-dz) * (*tpt); /* tbuf(ix,iy,iz) */
tpt ++;
res += dx*(1-dz) * (*tpt); /* tbuf(ix+1,iy,iz) */
tpt += tdimxy-1;
res += (1-dx)*dz * (*tpt); /* tbuf(ix,iy,iz+1) */
tpt ++;
res += dx*dz * (*tpt); /* tbuf(ix+1,iy,iz+1) */
*rbuf = (u16)_CONVERTI_( res );
continue;
}
/* here we are sure that the border is along the Z axis */
dy = y - iy;
res = (1-dx)*(1-dy) * (*tpt); /* tbuf(ix,iy,iz) */
tpt ++;
res += dx*(1-dy) * (*tpt); /* tbuf(ix+1,iy,iz) */
tpt += t1dimx;
res += (1-dx)*dy * (*tpt); /* tbuf(ix,iy+1,iz) */
tpt ++;
res += dx*dy * (*tpt); /* tbuf(ix+1,iy+1,iz) */
*rbuf = (u16)_CONVERTI_( res );
}
}
}
CGAL_INLINE_FUNCTION
void Reech3DTriLin4x4gb_u16 ( void* theBuf, /* buffer to be resampled */
int *theDim, /* dimensions of this buffer */
void* resBuf, /* result buffer */
int *resDim, /* dimensions of this buffer */
double* mat, /* transformation matrix */
float gain,
float bias )
{
int i, j, k, ix, iy, iz;
double x, y, z, dx, dy, dz, dxdy,dxdz,dydz,dxdydz;
double res;
double v6, v5, v4;
int rdimx=resDim[0], rdimy=resDim[1], rdimz=resDim[2];
int tdimx=theDim[0], tdimy=theDim[1], tdimz=theDim[2];
int tdimxy=tdimx*tdimy;
int toffset1=tdimxy+tdimx+1, toffset2=tdimxy-tdimx-1;
int t1dimx=tdimx-1, t1dimy=tdimy-1, t1dimz=tdimz-1;
double ddimx = (double)tdimx-0.5, ddimy = (double)tdimy-0.5;
double ddimz = (double)tdimz-0.5;
u16 *tbuf = (u16*)theBuf;
u16 *tpt;
u16 *rbuf = (u16*)resBuf;
double b=bias;
double g=gain;
for ( k = 0; k < rdimz; k ++ ) {
if ( get_static_verbose_reech4x4() != 0 )
fprintf( stderr, "Processing slice %d\r", k );
for ( j = 0; j < rdimy; j ++ )
for ( i = 0; i < rdimx; i ++, rbuf ++ ) {
/* computation of the corresponding point coordinates in theBuf */
x = mat[0] * i + mat[1] * j + mat[2] * k + mat[3];
if ((x < -0.5) || ( x > ddimx)) { *rbuf = 0; continue; }
y = mat[4] * i + mat[5] * j + mat[6] * k + mat[7];
if ((y < -0.5) || ( y > ddimy)) { *rbuf = 0; continue; }
z = mat[8] * i + mat[9] * j + mat[10] * k + mat[11];
if ((z < -0.5) || ( z > ddimz)) { *rbuf = 0; continue; }
/* here, the point lies on the borders or completely inside
the image */
ix = (int)x;
iy = (int)y;
iz = (int)z;
tpt = (u16 *)tbuf;
/* are we on the border or not ? */
if ( (x > 0.0) && (ix < t1dimx) &&
(y > 0.0) && (iy < t1dimy) &&
(z > 0.0) && (iz < t1dimz) ) {
/* the corresponding point is in the box defined
by (ix[+1],iy[+1],iz[+1]) */
dx = x - ix;
dy = y - iy;
dz = z - iz;
dxdy = dx*dy;
dxdz = dx*dz;
dydz = dy*dz;
dxdydz = dxdy*dz;
/* we have
v[7]=dxdydz; coefficient of tbuf(ix+1,iy+1,iz+1)
v[6]=dxdz-dxdydz; coefficient of tbuf(ix+1,iy, iz+1)
v[5]=dxdy-dxdydz; coefficient of tbuf(ix+1,iy+1,iz )
v[4]=dx-dxdy-v[6]; coefficient of tbuf(ix+1,iy ,iz )
v[3]=dydz-dxdydz; coefficient of tbuf(ix ,iy+1,iz+1)
v[2]=dz-dydz-v[6]; coefficient of tbuf(ix ,iy ,iz+1)
v[1]=dy-dydz-v[5]; coefficient of tbuf(ix ,iy+1,iz )
v[0]=1-dy-dz+dydz-v[4]; coefficient of tbuf(ix ,iy ,iz )
*/
tpt += ix + iy * tdimx + iz * tdimxy + toffset1;
v6 = dxdz-dxdydz;
v5 = dxdy-dxdydz;
v4 = dx-dxdy-v6;
res = 0;
res += dxdydz * (*tpt); /* tbuf(ix+1,iy+1,iz+1) */
tpt --;
res += (dydz-dxdydz) * (*tpt); /* tbuf(ix ,iy+1,iz+1) */
tpt -= t1dimx;
res += v6 * (*tpt); /* tbuf(ix+1 ,iy, iz+1) */
tpt --;
res += (dz-dydz-v6) * (*tpt); /* tbuf(ix ,iy ,iz+1) */
tpt -= toffset2;
res += v5 * (*tpt); /* tbuf(ix+1,iy+1,iz ) */
tpt --;
res += (dy-dydz-v5) * (*tpt); /* tbuf(ix ,iy+1,iz ) */
tpt -= t1dimx;
res += v4 * (*tpt); /* tbuf(ix+1,iy ,iz ) */
tpt --;
res += (1-dy-dz+dydz-v4) * (*tpt); /* tbuf(ix ,iy ,iz ) */
res = res * g + b;
*rbuf = (u16)_CONVERTI_( res );
continue;
}
/* here, we are sure we are on some border */
tpt += ix + iy * tdimx + iz * tdimxy;
if ( (x < 0.0) || (ix == t1dimx) ) {
if ( (y < 0.0) || (iy == t1dimy) ) {
if ( (z < 0.0) || (iz == t1dimz) ) {
res = (double)(*tpt) * g + b;
*rbuf = (u16)_CONVERTI_( res );
continue;
}
dz = z - iz;
res = (1-dz) * (*tpt); /* (1-dz)* tbuf(ix,iy,iz) */
tpt += tdimxy;
res += dz * (*tpt); /* dz * tbuf(ix,iy,iz+1) */
res = res * g + b;
*rbuf = (u16)_CONVERTI_( res );
continue;
}
dy = y - iy;
if ( (z < 0.0) || (iz == t1dimz) ) {
res = (1-dy) * (*tpt); /* (1-dy)* tbuf(ix,iy,iz) */
tpt += tdimx;
res += dy * (*tpt); /* dy * tbuf(ix,iy+1,iz) */
res = res * g + b;
*rbuf = (u16)_CONVERTI_( res );
continue;
}
dz = z - iz;
res = (1-dy)*(1-dz) * (*tpt); /* tbuf(ix,iy,iz) */
tpt += tdimx;
res += dy*(1-dz) * (*tpt); /* tbuf(ix,iy+1,iz) */
tpt += toffset2+1;
res += (1-dy)*dz * (*tpt); /* tbuf(ix,iy,iz+1) */
tpt += tdimx;
res += dy*dz * (*tpt); /* tbuf(ix,iy+1,iz+1) */
res = res * g + b;
*rbuf = (u16)_CONVERTI_( res );
continue;
}
/* here we are sure that the border is either
along the Y or the Z axis */
dx = x - ix;
if ( (y < 0.0) || (iy == t1dimy) ) {
if ( (z < 0.0) || (iz == t1dimz) ) {
res = (1-dx) * (*tpt); /* tbuf(ix,iy,iz) */
tpt ++;
res += dx * (*tpt); /* tbuf(ix+1,iy,iz) */
res = res * g + b;
*rbuf = (u16)_CONVERTI_( res );
continue;
}
dz = z - iz;
res = (1-dx)*(1-dz) * (*tpt); /* tbuf(ix,iy,iz) */
tpt ++;
res += dx*(1-dz) * (*tpt); /* tbuf(ix+1,iy,iz) */
tpt += tdimxy-1;
res += (1-dx)*dz * (*tpt); /* tbuf(ix,iy,iz+1) */
tpt ++;
res += dx*dz * (*tpt); /* tbuf(ix+1,iy,iz+1) */
res = res * g + b;
*rbuf = (u16)_CONVERTI_( res );
continue;
}
/* here we are sure that the border is along the Z axis */
dy = y - iy;
res = (1-dx)*(1-dy) * (*tpt); /* tbuf(ix,iy,iz) */
tpt ++;
res += dx*(1-dy) * (*tpt); /* tbuf(ix+1,iy,iz) */
tpt += t1dimx;
res += (1-dx)*dy * (*tpt); /* tbuf(ix,iy+1,iz) */
tpt ++;
res += dx*dy * (*tpt); /* tbuf(ix+1,iy+1,iz) */
res = res * g + b;
*rbuf = (u16)_CONVERTI_( res );
}
}
}
CGAL_INLINE_FUNCTION
void Reech3DNearest4x4_u16 ( void* theBuf, /* buffer to be resampled */
int *theDim, /* dimensions of this buffer */
void* resBuf, /* result buffer */
int *resDim, /* dimensions of this buffer */
double* mat /* transformation matrix */
)
{
int i, j, k, ix, iy, iz;
double x, y, z;
int rdimx=resDim[0], rdimy=resDim[1], rdimz=resDim[2];
int tdimx=theDim[0], tdimy=theDim[1], tdimz=theDim[2];
int tdimxy=tdimx*tdimy;
int t1dimx=tdimx-1, t1dimy=tdimy-1, t1dimz=tdimz-1;
u16 *tbuf = (u16*)theBuf;
u16 *rbuf = (u16*)resBuf;
for ( k = 0; k < rdimz; k ++ ) {
if ( get_static_verbose_reech4x4() != 0 )
fprintf( stderr, "Processing slice %d\r", k );
for ( j = 0; j < rdimy; j ++ )
for ( i = 0; i < rdimx; i ++, rbuf ++ ) {
/* computation of the corresponding point coordinates in theBuf */
x = mat[0] * i + mat[1] * j + mat[2] * k + mat[3];
ix = (int)(x+0.5);
if (( x < -0.5 ) || ( ix > t1dimx)) { *rbuf = 0; continue; }
y = mat[4] * i + mat[5] * j + mat[6] * k + mat[7];
iy = (int)(y+0.5);
if (( y < -0.5 ) || ( iy > t1dimy)) { *rbuf = 0; continue; }
z = mat[8] * i + mat[9] * j + mat[10] * k + mat[11];
iz = (int)(z+0.5);
if (( z < -0.5 ) || ( iz > t1dimz)) { *rbuf = 0; continue; }
*rbuf = tbuf[ ix + iy * tdimx + iz * tdimxy ];
}
}
}
CGAL_INLINE_FUNCTION
void Reech2DTriLin4x4_u16 ( void* theBuf, /* buffer to be resampled */
int *theDim, /* dimensions of this buffer */
void* resBuf, /* result buffer */
int *resDim, /* dimensions of this buffer */
double* mat /* transformation matrix */
)
{
int i, j, k, ix, iy;
double x, y, dx, dy, dxdy;
double res, v;
int rdimx=resDim[0], rdimy=resDim[1], rdimz=resDim[2];
int tdimx=theDim[0], tdimy=theDim[1];
int toffset=tdimx-1;
int t1dimx=tdimx-1, t1dimy=tdimy-1;
double ddimx = (double)tdimx-0.5, ddimy = (double)tdimy-0.5;
u16 *tbuf = (u16*)theBuf;
u16 *tpt;
u16 *rbuf = (u16*)resBuf;
for ( k = 0; k < rdimz; k ++ ) {
if ( get_static_verbose_reech4x4() != 0 )
fprintf( stderr, "Processing slice %d\r", k );
/* tbuf represente le premier point du plan */
tbuf = (u16*)theBuf;
tbuf += k*(tdimx * tdimy);
for ( j = 0; j < rdimy; j ++ )
for ( i = 0; i < rdimx; i ++, rbuf ++ ) {
/* computation of the corresponding point coordinates in theBuf */
x = mat[0] * i + mat[1] * j + mat[3];
if ((x < -0.5) || ( x > ddimx)) { *rbuf = 0; continue; }
y = mat[4] * i + mat[5] * j + mat[7];
if ((y < -0.5) || ( y > ddimy)) { *rbuf = 0; continue; }
/* here, the point lies on the borders or completely inside
the image */
ix = (int)x;
iy = (int)y;
tpt = (u16 *)tbuf;
tpt += ix + iy * tdimx;
/* are we on the border or not ? */
if ( (x > 0.0) && (ix < t1dimx) &&
(y > 0.0) && (iy < t1dimy) ) {
dx = x - ix;
dy = y - iy;
dxdy = dx*dy;
/* we have
v[5]=dxdy; coefficient of tbuf(ix+1,iy+1)
v[4]=dx-dxdy; coefficient of tbuf(ix+1,iy )
v[1]=dy-dxdy; coefficient of tbuf(ix ,iy+1)
v[0]=1-dx-dy+dxdy; coefficient of tbuf(ix ,iy )
*/
v = dy-dxdy;
res = 0;
res += (1-dx-v) * (*tpt); /* tbuf(ix ,iy ) */
tpt ++;
res += (dx-dxdy) * (*tpt); /* tbuf(ix+1,iy ) */
tpt += toffset;
res += v * (*tpt); /* tbuf(ix,iy+1 ) */
tpt ++;
res += dxdy * (*tpt); /* tbuf(ix+1,iy+1) */
*rbuf = (u16)_CONVERTI_( res );
continue;
}
/* here, we are sure we are on some border */
if ( (x < 0.0) || (ix == t1dimx) ) {
/* we just look at y */
if ( (y < 0.0) || (iy == t1dimy) ) {
*rbuf = *tpt;
continue;
}
dy = y - iy;
res = (1-dy) * (*tpt); /* (1-dy)* tbuf(ix,iy) */
tpt += tdimx;
res += dy * (*tpt); /* dy * tbuf(ix,iy+1) */
*rbuf = (u16)_CONVERTI_( res );
continue;
}
dx = x - ix;
res = (1-dx) * (*tpt); /* (1-dx)* tbuf(ix,iy) */
tpt ++;
res += dx * (*tpt); /* dx * tbuf(ix+1,iy) */
*rbuf = (u16)_CONVERTI_( res );
}
}
}
CGAL_INLINE_FUNCTION
void Reech2DTriLin4x4gb_u16 ( void* theBuf, /* buffer to be resampled */
int *theDim, /* dimensions of this buffer */
void* resBuf, /* result buffer */
int *resDim, /* dimensions of this buffer */
double* mat, /* transformation matrix */
float gain,
float bias )
{
int i, j, k, ix, iy;
double x, y, dx, dy, dxdy;
double res, v;
int rdimx=resDim[0], rdimy=resDim[1], rdimz=resDim[2];
int tdimx=theDim[0], tdimy=theDim[1];
int toffset=tdimx-1;
int t1dimx=tdimx-1, t1dimy=tdimy-1;
double ddimx = (double)tdimx-0.5, ddimy = (double)tdimy-0.5;
u16 *tbuf = (u16*)theBuf;
u16 *tpt;
u16 *rbuf = (u16*)resBuf;
double b=bias;
double g=gain;
for ( k = 0; k < rdimz; k ++ ) {
if ( get_static_verbose_reech4x4() != 0 )
fprintf( stderr, "Processing slice %d\r", k );
/* tbuf represente le premier point du plan */
tbuf = (u16*)theBuf;
tbuf += k*(tdimx * tdimy);
for ( j = 0; j < rdimy; j ++ )
for ( i = 0; i < rdimx; i ++, rbuf ++ ) {
/* computation of the corresponding point coordinates in theBuf */
x = mat[0] * i + mat[1] * j + mat[3];
if ((x < -0.5) || ( x > ddimx)) { *rbuf = 0; continue; }
y = mat[4] * i + mat[5] * j + mat[7];
if ((y < -0.5) || ( y > ddimy)) { *rbuf = 0; continue; }
/* here, the point lies on the borders or completely inside
the image */
ix = (int)x;
iy = (int)y;
tpt = (u16 *)tbuf;
tpt += ix + iy * tdimx;
/* are we on the border or not ? */
if ( (x > 0.0) && (ix < t1dimx) &&
(y > 0.0) && (iy < t1dimy) ) {
dx = x - ix;
dy = y - iy;
dxdy = dx*dy;
/* we have
v[5]=dxdy; coefficient of tbuf(ix+1,iy+1)
v[4]=dx-dxdy; coefficient of tbuf(ix+1,iy )
v[1]=dy-dxdy; coefficient of tbuf(ix ,iy+1)
v[0]=1-dx-dy+dxdy; coefficient of tbuf(ix ,iy )
*/
v = dy-dxdy;
res = 0;
res += (1-dx-v) * (*tpt); /* tbuf(ix ,iy ) */
tpt ++;
res += (dx-dxdy) * (*tpt); /* tbuf(ix+1,iy ) */
tpt += toffset;
res += v * (*tpt); /* tbuf(ix,iy+1 ) */
tpt ++;
res += dxdy * (*tpt); /* tbuf(ix+1,iy+1) */
res = res * g + b;
*rbuf = (u16)_CONVERTI_( res );
continue;
}
/* here, we are sure we are on some border */
if ( (x < 0.0) || (ix == t1dimx) ) {
/* we just look at y */
if ( (y < 0.0) || (iy == t1dimy) ) {
res = (double)(*tpt) * g + b;
*rbuf = (u16)_CONVERTI_( res );
continue;
}
dy = y - iy;
res = (1-dy) * (*tpt); /* (1-dy)* tbuf(ix,iy) */
tpt += tdimx;
res += dy * (*tpt); /* dy * tbuf(ix,iy+1) */
res = (double)(*tpt) * g + b;
*rbuf = (u16)_CONVERTI_( res );
continue;
}
dx = x - ix;
res = (1-dx) * (*tpt); /* (1-dx)* tbuf(ix,iy) */
tpt ++;
res += dx * (*tpt); /* dx * tbuf(ix+1,iy) */
res = res * g + b;
*rbuf = (u16)_CONVERTI_( res );
}
}
}
CGAL_INLINE_FUNCTION
void Reech2DNearest4x4_u16 ( void* theBuf, /* buffer to be resampled */
int *theDim, /* dimensions of this buffer */
void* resBuf, /* result buffer */
int *resDim, /* dimensions of this buffer */
double* mat /* transformation matrix */
)
{
int i, j, k, ix, iy;
double x, y;
int rdimx=resDim[0], rdimy=resDim[1], rdimz=resDim[2];
int tdimx=theDim[0], tdimy=theDim[1];
int t1dimx=tdimx-1, t1dimy=tdimy-1;
u16 *tbuf = (u16*)theBuf;
u16 *rbuf = (u16*)resBuf;
for ( k = 0; k < rdimz; k ++ ) {
if ( get_static_verbose_reech4x4() != 0 )
fprintf( stderr, "Processing slice %d\r", k );
/* tbuf represente le premier point du plan */
tbuf = (u16*)theBuf;
tbuf += k*(tdimx * tdimy);
for ( j = 0; j < rdimy; j ++ )
for ( i = 0; i < rdimx; i ++, rbuf ++ ) {
/* computation of the corresponding point coordinates in theBuf */
x = mat[0] * i + mat[1] * j + mat[3];
ix = (int)(x+0.5);
if (( x < -0.5 ) || ( ix > t1dimx)) { *rbuf = 0; continue; }
y = mat[4] * i + mat[5] * j + mat[7];
iy = (int)(y+0.5);
if (( y < -0.5 ) || ( iy > t1dimy)) { *rbuf = 0; continue; }
*rbuf = tbuf[ ix + iy * tdimx ];
}
}
}
/* Resampling procedure.
Work for 3D images, not for vectorial ones.
(double* mat) is the matrix which permits to get
from resBuf into theBuf.
If one only have the matrix from theBuf into resBuf,
it must be inverted first.
Soit x le point transforme et ix=(int)x;
nous allons distinguer les cas suivants :
x < -0.5 => resultat = 0
-0.5 <= x < 0.0 => ix=0, on n'interpole pas selon X
0.0 < x && ix < dimx-1 => on interpole selon X
x < dimx-0.5 => ix=dimx-1, on n'interpole pas selon X
x >= dimx-0.5 => resultat = 0
*/
CGAL_INLINE_FUNCTION
void Reech3DTriLin4x4_s16 ( void* theBuf, /* buffer to be resampled */
int *theDim, /* dimensions of this buffer */
void* resBuf, /* result buffer */
int *resDim, /* dimensions of this buffer */
double* mat /* transformation matrix */
)
{
int i, j, k, ix, iy, iz;
double x, y, z, dx, dy, dz, dxdy,dxdz,dydz,dxdydz;
double res;
double v6, v5, v4;
int rdimx=resDim[0], rdimy=resDim[1], rdimz=resDim[2];
int tdimx=theDim[0], tdimy=theDim[1], tdimz=theDim[2];
int tdimxy=tdimx*tdimy;
int toffset1=tdimxy+tdimx+1, toffset2=tdimxy-tdimx-1;
int t1dimx=tdimx-1, t1dimy=tdimy-1, t1dimz=tdimz-1;
double ddimx = (double)tdimx-0.5, ddimy = (double)tdimy-0.5;
double ddimz = (double)tdimz-0.5;
s16 *tbuf = (s16*)theBuf;
s16 *tpt;
s16 *rbuf = (s16*)resBuf;
for ( k = 0; k < rdimz; k ++ ) {
if ( get_static_verbose_reech4x4() != 0 )
fprintf( stderr, "Processing slice %d\r", k );
for ( j = 0; j < rdimy; j ++ )
for ( i = 0; i < rdimx; i ++, rbuf ++ ) {
/* computation of the corresponding point coordinates in theBuf */
x = mat[0] * i + mat[1] * j + mat[2] * k + mat[3];
if ((x < -0.5) || ( x > ddimx)) { *rbuf = 0; continue; }
y = mat[4] * i + mat[5] * j + mat[6] * k + mat[7];
if ((y < -0.5) || ( y > ddimy)) { *rbuf = 0; continue; }
z = mat[8] * i + mat[9] * j + mat[10] * k + mat[11];
if ((z < -0.5) || ( z > ddimz)) { *rbuf = 0; continue; }
/* here, the point lies on the borders or completely inside
the image */
ix = (int)x;
iy = (int)y;
iz = (int)z;
tpt = (s16 *)tbuf;
/* are we on the border or not ? */
if ( (x > 0.0) && (ix < t1dimx) &&
(y > 0.0) && (iy < t1dimy) &&
(z > 0.0) && (iz < t1dimz) ) {
/* the corresponding point is in the box defined
by (ix[+1],iy[+1],iz[+1]) */
dx = x - ix;
dy = y - iy;
dz = z - iz;
dxdy = dx*dy;
dxdz = dx*dz;
dydz = dy*dz;
dxdydz = dxdy*dz;
/* we have
v[7]=dxdydz; coefficient of tbuf(ix+1,iy+1,iz+1)
v[6]=dxdz-dxdydz; coefficient of tbuf(ix+1,iy, iz+1)
v[5]=dxdy-dxdydz; coefficient of tbuf(ix+1,iy+1,iz )
v[4]=dx-dxdy-v[6]; coefficient of tbuf(ix+1,iy ,iz )
v[3]=dydz-dxdydz; coefficient of tbuf(ix ,iy+1,iz+1)
v[2]=dz-dydz-v[6]; coefficient of tbuf(ix ,iy ,iz+1)
v[1]=dy-dydz-v[5]; coefficient of tbuf(ix ,iy+1,iz )
v[0]=1-dy-dz+dydz-v[4]; coefficient of tbuf(ix ,iy ,iz )
*/
tpt += ix + iy * tdimx + iz * tdimxy + toffset1;
v6 = dxdz-dxdydz;
v5 = dxdy-dxdydz;
v4 = dx-dxdy-v6;
res = 0;
res += dxdydz * (*tpt); /* tbuf(ix+1,iy+1,iz+1) */
tpt --;
res += (dydz-dxdydz) * (*tpt); /* tbuf(ix ,iy+1,iz+1) */
tpt -= t1dimx;
res += v6 * (*tpt); /* tbuf(ix+1 ,iy, iz+1) */
tpt --;
res += (dz-dydz-v6) * (*tpt); /* tbuf(ix ,iy ,iz+1) */
tpt -= toffset2;
res += v5 * (*tpt); /* tbuf(ix+1,iy+1,iz ) */
tpt --;
res += (dy-dydz-v5) * (*tpt); /* tbuf(ix ,iy+1,iz ) */
tpt -= t1dimx;
res += v4 * (*tpt); /* tbuf(ix+1,iy ,iz ) */
tpt --;
res += (1-dy-dz+dydz-v4) * (*tpt); /* tbuf(ix ,iy ,iz ) */
*rbuf = (s16)_CONVERTI_( res );
continue;
}
/* here, we are sure we are on some border */
tpt += ix + iy * tdimx + iz * tdimxy;
if ( (x < 0.0) || (ix == t1dimx) ) {
if ( (y < 0.0) || (iy == t1dimy) ) {
if ( (z < 0.0) || (iz == t1dimz) ) {
*rbuf = *tpt;
continue;
}
dz = z - iz;
res = (1-dz) * (*tpt); /* (1-dz)* tbuf(ix,iy,iz) */
tpt += tdimxy;
res += dz * (*tpt); /* dz * tbuf(ix,iy,iz+1) */
*rbuf = (s16)_CONVERTI_( res );
continue;
}
dy = y - iy;
if ( (z < 0.0) || (iz == t1dimz) ) {
res = (1-dy) * (*tpt); /* (1-dy)* tbuf(ix,iy,iz) */
tpt += tdimx;
res += dy * (*tpt); /* dy * tbuf(ix,iy+1,iz) */
*rbuf = (s16)_CONVERTI_( res );
continue;
}
dz = z - iz;
res = (1-dy)*(1-dz) * (*tpt); /* tbuf(ix,iy,iz) */
tpt += tdimx;
res += dy*(1-dz) * (*tpt); /* tbuf(ix,iy+1,iz) */
tpt += toffset2+1;
res += (1-dy)*dz * (*tpt); /* tbuf(ix,iy,iz+1) */
tpt += tdimx;
res += dy*dz * (*tpt); /* tbuf(ix,iy+1,iz+1) */
*rbuf = (s16)_CONVERTI_( res );
continue;
}
/* here we are sure that the border is either
along the Y or the Z axis */
dx = x - ix;
if ( (y < 0.0) || (iy == t1dimy) ) {
if ( (z < 0.0) || (iz == t1dimz) ) {
res = (1-dx) * (*tpt); /* tbuf(ix,iy,iz) */
tpt ++;
res += dx * (*tpt); /* tbuf(ix+1,iy,iz) */
*rbuf = (s16)_CONVERTI_( res );
continue;
}
dz = z - iz;
res = (1-dx)*(1-dz) * (*tpt); /* tbuf(ix,iy,iz) */
tpt ++;
res += dx*(1-dz) * (*tpt); /* tbuf(ix+1,iy,iz) */
tpt += tdimxy-1;
res += (1-dx)*dz * (*tpt); /* tbuf(ix,iy,iz+1) */
tpt ++;
res += dx*dz * (*tpt); /* tbuf(ix+1,iy,iz+1) */
*rbuf = (s16)_CONVERTI_( res );
continue;
}
/* here we are sure that the border is along the Z axis */
dy = y - iy;
res = (1-dx)*(1-dy) * (*tpt); /* tbuf(ix,iy,iz) */
tpt ++;
res += dx*(1-dy) * (*tpt); /* tbuf(ix+1,iy,iz) */
tpt += t1dimx;
res += (1-dx)*dy * (*tpt); /* tbuf(ix,iy+1,iz) */
tpt ++;
res += dx*dy * (*tpt); /* tbuf(ix+1,iy+1,iz) */
*rbuf = (s16)_CONVERTI_( res );
}
}
}
CGAL_INLINE_FUNCTION
void Reech3DTriLin4x4gb_s16 ( void* theBuf, /* buffer to be resampled */
int *theDim, /* dimensions of this buffer */
void* resBuf, /* result buffer */
int *resDim, /* dimensions of this buffer */
double* mat, /* transformation matrix */
float gain,
float bias )
{
int i, j, k, ix, iy, iz;
double x, y, z, dx, dy, dz, dxdy,dxdz,dydz,dxdydz;
double res;
double v6, v5, v4;
int rdimx=resDim[0], rdimy=resDim[1], rdimz=resDim[2];
int tdimx=theDim[0], tdimy=theDim[1], tdimz=theDim[2];
int tdimxy=tdimx*tdimy;
int toffset1=tdimxy+tdimx+1, toffset2=tdimxy-tdimx-1;
int t1dimx=tdimx-1, t1dimy=tdimy-1, t1dimz=tdimz-1;
double ddimx = (double)tdimx-0.5, ddimy = (double)tdimy-0.5;
double ddimz = (double)tdimz-0.5;
s16 *tbuf = (s16*)theBuf;
s16 *tpt;
s16 *rbuf = (s16*)resBuf;
double b=bias;
double g=gain;
for ( k = 0; k < rdimz; k ++ ) {
if ( get_static_verbose_reech4x4() != 0 )
fprintf( stderr, "Processing slice %d\r", k );
for ( j = 0; j < rdimy; j ++ )
for ( i = 0; i < rdimx; i ++, rbuf ++ ) {
/* computation of the corresponding point coordinates in theBuf */
x = mat[0] * i + mat[1] * j + mat[2] * k + mat[3];
if ((x < -0.5) || ( x > ddimx)) { *rbuf = 0; continue; }
y = mat[4] * i + mat[5] * j + mat[6] * k + mat[7];
if ((y < -0.5) || ( y > ddimy)) { *rbuf = 0; continue; }
z = mat[8] * i + mat[9] * j + mat[10] * k + mat[11];
if ((z < -0.5) || ( z > ddimz)) { *rbuf = 0; continue; }
/* here, the point lies on the borders or completely inside
the image */
ix = (int)x;
iy = (int)y;
iz = (int)z;
tpt = (s16 *)tbuf;
/* are we on the border or not ? */
if ( (x > 0.0) && (ix < t1dimx) &&
(y > 0.0) && (iy < t1dimy) &&
(z > 0.0) && (iz < t1dimz) ) {
/* the corresponding point is in the box defined
by (ix[+1],iy[+1],iz[+1]) */
dx = x - ix;
dy = y - iy;
dz = z - iz;
dxdy = dx*dy;
dxdz = dx*dz;
dydz = dy*dz;
dxdydz = dxdy*dz;
/* we have
v[7]=dxdydz; coefficient of tbuf(ix+1,iy+1,iz+1)
v[6]=dxdz-dxdydz; coefficient of tbuf(ix+1,iy, iz+1)
v[5]=dxdy-dxdydz; coefficient of tbuf(ix+1,iy+1,iz )
v[4]=dx-dxdy-v[6]; coefficient of tbuf(ix+1,iy ,iz )
v[3]=dydz-dxdydz; coefficient of tbuf(ix ,iy+1,iz+1)
v[2]=dz-dydz-v[6]; coefficient of tbuf(ix ,iy ,iz+1)
v[1]=dy-dydz-v[5]; coefficient of tbuf(ix ,iy+1,iz )
v[0]=1-dy-dz+dydz-v[4]; coefficient of tbuf(ix ,iy ,iz )
*/
tpt += ix + iy * tdimx + iz * tdimxy + toffset1;
v6 = dxdz-dxdydz;
v5 = dxdy-dxdydz;
v4 = dx-dxdy-v6;
res = 0;
res += dxdydz * (*tpt); /* tbuf(ix+1,iy+1,iz+1) */
tpt --;
res += (dydz-dxdydz) * (*tpt); /* tbuf(ix ,iy+1,iz+1) */
tpt -= t1dimx;
res += v6 * (*tpt); /* tbuf(ix+1 ,iy, iz+1) */
tpt --;
res += (dz-dydz-v6) * (*tpt); /* tbuf(ix ,iy ,iz+1) */
tpt -= toffset2;
res += v5 * (*tpt); /* tbuf(ix+1,iy+1,iz ) */
tpt --;
res += (dy-dydz-v5) * (*tpt); /* tbuf(ix ,iy+1,iz ) */
tpt -= t1dimx;
res += v4 * (*tpt); /* tbuf(ix+1,iy ,iz ) */
tpt --;
res += (1-dy-dz+dydz-v4) * (*tpt); /* tbuf(ix ,iy ,iz ) */
res = res * g + b;
*rbuf = (s16)_CONVERTI_( res );
continue;
}
/* here, we are sure we are on some border */
tpt += ix + iy * tdimx + iz * tdimxy;
if ( (x < 0.0) || (ix == t1dimx) ) {
if ( (y < 0.0) || (iy == t1dimy) ) {
if ( (z < 0.0) || (iz == t1dimz) ) {
res = (double)(*tpt) * g + b;
*rbuf = (s16)_CONVERTI_( res );
continue;
}
dz = z - iz;
res = (1-dz) * (*tpt); /* (1-dz)* tbuf(ix,iy,iz) */
tpt += tdimxy;
res += dz * (*tpt); /* dz * tbuf(ix,iy,iz+1) */
res = res * g + b;
*rbuf = (s16)_CONVERTI_( res );
continue;
}
dy = y - iy;
if ( (z < 0.0) || (iz == t1dimz) ) {
res = (1-dy) * (*tpt); /* (1-dy)* tbuf(ix,iy,iz) */
tpt += tdimx;
res += dy * (*tpt); /* dy * tbuf(ix,iy+1,iz) */
res = res * g + b;
*rbuf = (s16)_CONVERTI_( res );
continue;
}
dz = z - iz;
res = (1-dy)*(1-dz) * (*tpt); /* tbuf(ix,iy,iz) */
tpt += tdimx;
res += dy*(1-dz) * (*tpt); /* tbuf(ix,iy+1,iz) */
tpt += toffset2+1;
res += (1-dy)*dz * (*tpt); /* tbuf(ix,iy,iz+1) */
tpt += tdimx;
res += dy*dz * (*tpt); /* tbuf(ix,iy+1,iz+1) */
res = res * g + b;
*rbuf = (s16)_CONVERTI_( res );
continue;
}
/* here we are sure that the border is either
along the Y or the Z axis */
dx = x - ix;
if ( (y < 0.0) || (iy == t1dimy) ) {
if ( (z < 0.0) || (iz == t1dimz) ) {
res = (1-dx) * (*tpt); /* tbuf(ix,iy,iz) */
tpt ++;
res += dx * (*tpt); /* tbuf(ix+1,iy,iz) */
res = res * g + b;
*rbuf = (s16)_CONVERTI_( res );
continue;
}
dz = z - iz;
res = (1-dx)*(1-dz) * (*tpt); /* tbuf(ix,iy,iz) */
tpt ++;
res += dx*(1-dz) * (*tpt); /* tbuf(ix+1,iy,iz) */
tpt += tdimxy-1;
res += (1-dx)*dz * (*tpt); /* tbuf(ix,iy,iz+1) */
tpt ++;
res += dx*dz * (*tpt); /* tbuf(ix+1,iy,iz+1) */
res = res * g + b;
*rbuf = (s16)_CONVERTI_( res );
continue;
}
/* here we are sure that the border is along the Z axis */
dy = y - iy;
res = (1-dx)*(1-dy) * (*tpt); /* tbuf(ix,iy,iz) */
tpt ++;
res += dx*(1-dy) * (*tpt); /* tbuf(ix+1,iy,iz) */
tpt += t1dimx;
res += (1-dx)*dy * (*tpt); /* tbuf(ix,iy+1,iz) */
tpt ++;
res += dx*dy * (*tpt); /* tbuf(ix+1,iy+1,iz) */
res = res * g + b;
*rbuf = (s16)_CONVERTI_( res );
}
}
}
CGAL_INLINE_FUNCTION
void Reech3DNearest4x4_s16 ( void* theBuf, /* buffer to be resampled */
int *theDim, /* dimensions of this buffer */
void* resBuf, /* result buffer */
int *resDim, /* dimensions of this buffer */
double* mat /* transformation matrix */
)
{
int i, j, k, ix, iy, iz;
double x, y, z;
int rdimx=resDim[0], rdimy=resDim[1], rdimz=resDim[2];
int tdimx=theDim[0], tdimy=theDim[1], tdimz=theDim[2];
int tdimxy=tdimx*tdimy;
int t1dimx=tdimx-1, t1dimy=tdimy-1, t1dimz=tdimz-1;
s16 *tbuf = (s16*)theBuf;
s16 *rbuf = (s16*)resBuf;
for ( k = 0; k < rdimz; k ++ ) {
if ( get_static_verbose_reech4x4() != 0 )
fprintf( stderr, "Processing slice %d\r", k );
for ( j = 0; j < rdimy; j ++ )
for ( i = 0; i < rdimx; i ++, rbuf ++ ) {
/* computation of the corresponding point coordinates in theBuf */
x = mat[0] * i + mat[1] * j + mat[2] * k + mat[3];
ix = (int)(x+0.5);
if (( x < -0.5 ) || ( ix > t1dimx)) { *rbuf = 0; continue; }
y = mat[4] * i + mat[5] * j + mat[6] * k + mat[7];
iy = (int)(y+0.5);
if (( y < -0.5 ) || ( iy > t1dimy)) { *rbuf = 0; continue; }
z = mat[8] * i + mat[9] * j + mat[10] * k + mat[11];
iz = (int)(z+0.5);
if (( z < -0.5 ) || ( iz > t1dimz)) { *rbuf = 0; continue; }
*rbuf = tbuf[ ix + iy * tdimx + iz * tdimxy ];
}
}
}
CGAL_INLINE_FUNCTION
void Reech2DTriLin4x4_s16 ( void* theBuf, /* buffer to be resampled */
int *theDim, /* dimensions of this buffer */
void* resBuf, /* result buffer */
int *resDim, /* dimensions of this buffer */
double* mat /* transformation matrix */
)
{
int i, j, k, ix, iy;
double x, y, dx, dy, dxdy;
double res, v;
int rdimx=resDim[0], rdimy=resDim[1], rdimz=resDim[2];
int tdimx=theDim[0], tdimy=theDim[1];
int toffset=tdimx-1;
int t1dimx=tdimx-1, t1dimy=tdimy-1;
double ddimx = (double)tdimx-0.5, ddimy = (double)tdimy-0.5;
s16 *tbuf = (s16*)theBuf;
s16 *tpt;
s16 *rbuf = (s16*)resBuf;
for ( k = 0; k < rdimz; k ++ ) {
if ( get_static_verbose_reech4x4() != 0 )
fprintf( stderr, "Processing slice %d\r", k );
/* tbuf represente le premier point du plan */
tbuf = (s16*)theBuf;
tbuf += k*(tdimx * tdimy);
for ( j = 0; j < rdimy; j ++ )
for ( i = 0; i < rdimx; i ++, rbuf ++ ) {
/* computation of the corresponding point coordinates in theBuf */
x = mat[0] * i + mat[1] * j + mat[3];
if ((x < -0.5) || ( x > ddimx)) { *rbuf = 0; continue; }
y = mat[4] * i + mat[5] * j + mat[7];
if ((y < -0.5) || ( y > ddimy)) { *rbuf = 0; continue; }
/* here, the point lies on the borders or completely inside
the image */
ix = (int)x;
iy = (int)y;
tpt = (s16 *)tbuf;
tpt += ix + iy * tdimx;
/* are we on the border or not ? */
if ( (x > 0.0) && (ix < t1dimx) &&
(y > 0.0) && (iy < t1dimy) ) {
dx = x - ix;
dy = y - iy;
dxdy = dx*dy;
/* we have
v[5]=dxdy; coefficient of tbuf(ix+1,iy+1)
v[4]=dx-dxdy; coefficient of tbuf(ix+1,iy )
v[1]=dy-dxdy; coefficient of tbuf(ix ,iy+1)
v[0]=1-dx-dy+dxdy; coefficient of tbuf(ix ,iy )
*/
v = dy-dxdy;
res = 0;
res += (1-dx-v) * (*tpt); /* tbuf(ix ,iy ) */
tpt ++;
res += (dx-dxdy) * (*tpt); /* tbuf(ix+1,iy ) */
tpt += toffset;
res += v * (*tpt); /* tbuf(ix,iy+1 ) */
tpt ++;
res += dxdy * (*tpt); /* tbuf(ix+1,iy+1) */
*rbuf = (s16)_CONVERTI_( res );
continue;
}
/* here, we are sure we are on some border */
if ( (x < 0.0) || (ix == t1dimx) ) {
/* we just look at y */
if ( (y < 0.0) || (iy == t1dimy) ) {
*rbuf = *tpt;
continue;
}
dy = y - iy;
res = (1-dy) * (*tpt); /* (1-dy)* tbuf(ix,iy) */
tpt += tdimx;
res += dy * (*tpt); /* dy * tbuf(ix,iy+1) */
*rbuf = (s16)_CONVERTI_( res );
continue;
}
dx = x - ix;
res = (1-dx) * (*tpt); /* (1-dx)* tbuf(ix,iy) */
tpt ++;
res += dx * (*tpt); /* dx * tbuf(ix+1,iy) */
*rbuf = (s16)_CONVERTI_( res );
}
}
}
CGAL_INLINE_FUNCTION
void Reech2DTriLin4x4gb_s16 ( void* theBuf, /* buffer to be resampled */
int *theDim, /* dimensions of this buffer */
void* resBuf, /* result buffer */
int *resDim, /* dimensions of this buffer */
double* mat, /* transformation matrix */
float gain,
float bias )
{
int i, j, k, ix, iy;
double x, y, dx, dy, dxdy;
double res, v;
int rdimx=resDim[0], rdimy=resDim[1], rdimz=resDim[2];
int tdimx=theDim[0], tdimy=theDim[1];
int toffset=tdimx-1;
int t1dimx=tdimx-1, t1dimy=tdimy-1;
double ddimx = (double)tdimx-0.5, ddimy = (double)tdimy-0.5;
s16 *tbuf = (s16*)theBuf;
s16 *tpt;
s16 *rbuf = (s16*)resBuf;
double b=bias;
double g=gain;
for ( k = 0; k < rdimz; k ++ ) {
if ( get_static_verbose_reech4x4() != 0 )
fprintf( stderr, "Processing slice %d\r", k );
/* tbuf represente le premier point du plan */
tbuf = (s16*)theBuf;
tbuf += k*(tdimx * tdimy);
for ( j = 0; j < rdimy; j ++ )
for ( i = 0; i < rdimx; i ++, rbuf ++ ) {
/* computation of the corresponding point coordinates in theBuf */
x = mat[0] * i + mat[1] * j + mat[3];
if ((x < -0.5) || ( x > ddimx)) { *rbuf = 0; continue; }
y = mat[4] * i + mat[5] * j + mat[7];
if ((y < -0.5) || ( y > ddimy)) { *rbuf = 0; continue; }
/* here, the point lies on the borders or completely inside
the image */
ix = (int)x;
iy = (int)y;
tpt = (s16 *)tbuf;
tpt += ix + iy * tdimx;
/* are we on the border or not ? */
if ( (x > 0.0) && (ix < t1dimx) &&
(y > 0.0) && (iy < t1dimy) ) {
dx = x - ix;
dy = y - iy;
dxdy = dx*dy;
/* we have
v[5]=dxdy; coefficient of tbuf(ix+1,iy+1)
v[4]=dx-dxdy; coefficient of tbuf(ix+1,iy )
v[1]=dy-dxdy; coefficient of tbuf(ix ,iy+1)
v[0]=1-dx-dy+dxdy; coefficient of tbuf(ix ,iy )
*/
v = dy-dxdy;
res = 0;
res += (1-dx-v) * (*tpt); /* tbuf(ix ,iy ) */
tpt ++;
res += (dx-dxdy) * (*tpt); /* tbuf(ix+1,iy ) */
tpt += toffset;
res += v * (*tpt); /* tbuf(ix,iy+1 ) */
tpt ++;
res += dxdy * (*tpt); /* tbuf(ix+1,iy+1) */
res = res * g + b;
*rbuf = (s16)_CONVERTI_( res );
continue;
}
/* here, we are sure we are on some border */
if ( (x < 0.0) || (ix == t1dimx) ) {
/* we just look at y */
if ( (y < 0.0) || (iy == t1dimy) ) {
res = (double)(*tpt) * g + b;
*rbuf = (s16)_CONVERTI_( res );
continue;
}
dy = y - iy;
res = (1-dy) * (*tpt); /* (1-dy)* tbuf(ix,iy) */
tpt += tdimx;
res += dy * (*tpt); /* dy * tbuf(ix,iy+1) */
res = (double)(*tpt) * g + b;
*rbuf = (s16)_CONVERTI_( res );
continue;
}
dx = x - ix;
res = (1-dx) * (*tpt); /* (1-dx)* tbuf(ix,iy) */
tpt ++;
res += dx * (*tpt); /* dx * tbuf(ix+1,iy) */
res = res * g + b;
*rbuf = (s16)_CONVERTI_( res );
}
}
}
CGAL_INLINE_FUNCTION
void Reech2DNearest4x4_s16 ( void* theBuf, /* buffer to be resampled */
int *theDim, /* dimensions of this buffer */
void* resBuf, /* result buffer */
int *resDim, /* dimensions of this buffer */
double* mat /* transformation matrix */
)
{
int i, j, k, ix, iy;
double x, y;
int rdimx=resDim[0], rdimy=resDim[1], rdimz=resDim[2];
int tdimx=theDim[0], tdimy=theDim[1];
int t1dimx=tdimx-1, t1dimy=tdimy-1;
s16 *tbuf = (s16*)theBuf;
s16 *rbuf = (s16*)resBuf;
for ( k = 0; k < rdimz; k ++ ) {
if ( get_static_verbose_reech4x4() != 0 )
fprintf( stderr, "Processing slice %d\r", k );
/* tbuf represente le premier point du plan */
tbuf = (s16*)theBuf;
tbuf += k*(tdimx * tdimy);
for ( j = 0; j < rdimy; j ++ )
for ( i = 0; i < rdimx; i ++, rbuf ++ ) {
/* computation of the corresponding point coordinates in theBuf */
x = mat[0] * i + mat[1] * j + mat[3];
ix = (int)(x+0.5);
if (( x < -0.5 ) || ( ix > t1dimx)) { *rbuf = 0; continue; }
y = mat[4] * i + mat[5] * j + mat[7];
iy = (int)(y+0.5);
if (( y < -0.5 ) || ( iy > t1dimy)) { *rbuf = 0; continue; }
*rbuf = tbuf[ ix + iy * tdimx ];
}
}
}
/* Resampling procedure.
Work for 3D images, not for vectorial ones.
(double* mat) is the matrix which permits to get
from resBuf into theBuf.
If one only have the matrix from theBuf into resBuf,
it must be inverted first.
Soit x le point transforme et ix=(int)x;
nous allons distinguer les cas suivants :
x < -0.5 => resultat = 0
-0.5 <= x < 0.0 => ix=0, on n'interpole pas selon X
0.0 < x && ix < dimx-1 => on interpole selon X
x < dimx-0.5 => ix=dimx-1, on n'interpole pas selon X
x >= dimx-0.5 => resultat = 0
*/
CGAL_INLINE_FUNCTION
void Reech3DTriLin4x4_r32 ( void* theBuf, /* buffer to be resampled */
int *theDim, /* dimensions of this buffer */
void* resBuf, /* result buffer */
int *resDim, /* dimensions of this buffer */
double* mat /* transformation matrix */
)
{
int i, j, k, ix, iy, iz;
double x, y, z, dx, dy, dz, dxdy,dxdz,dydz,dxdydz;
double res;
double v6, v5, v4;
int rdimx=resDim[0], rdimy=resDim[1], rdimz=resDim[2];
int tdimx=theDim[0], tdimy=theDim[1], tdimz=theDim[2];
int tdimxy=tdimx*tdimy;
int toffset1=tdimxy+tdimx+1, toffset2=tdimxy-tdimx-1;
int t1dimx=tdimx-1, t1dimy=tdimy-1, t1dimz=tdimz-1;
double ddimx = (double)tdimx-0.5, ddimy = (double)tdimy-0.5;
double ddimz = (double)tdimz-0.5;
r32 *tbuf = (r32*)theBuf;
r32 *tpt;
r32 *rbuf = (r32*)resBuf;
for ( k = 0; k < rdimz; k ++ ) {
if ( get_static_verbose_reech4x4() != 0 )
fprintf( stderr, "Processing slice %d\r", k );
for ( j = 0; j < rdimy; j ++ )
for ( i = 0; i < rdimx; i ++, rbuf ++ ) {
/* computation of the corresponding point coordinates in theBuf */
x = mat[0] * i + mat[1] * j + mat[2] * k + mat[3];
if ((x < -0.5) || ( x > ddimx)) { *rbuf = 0; continue; }
y = mat[4] * i + mat[5] * j + mat[6] * k + mat[7];
if ((y < -0.5) || ( y > ddimy)) { *rbuf = 0; continue; }
z = mat[8] * i + mat[9] * j + mat[10] * k + mat[11];
if ((z < -0.5) || ( z > ddimz)) { *rbuf = 0; continue; }
/* here, the point lies on the borders or completely inside
the image */
ix = (int)x;
iy = (int)y;
iz = (int)z;
tpt = (r32 *)tbuf;
/* are we on the border or not ? */
if ( (x > 0.0) && (ix < t1dimx) &&
(y > 0.0) && (iy < t1dimy) &&
(z > 0.0) && (iz < t1dimz) ) {
/* the corresponding point is in the box defined
by (ix[+1],iy[+1],iz[+1]) */
dx = x - ix;
dy = y - iy;
dz = z - iz;
dxdy = dx*dy;
dxdz = dx*dz;
dydz = dy*dz;
dxdydz = dxdy*dz;
/* we have
v[7]=dxdydz; coefficient of tbuf(ix+1,iy+1,iz+1)
v[6]=dxdz-dxdydz; coefficient of tbuf(ix+1,iy, iz+1)
v[5]=dxdy-dxdydz; coefficient of tbuf(ix+1,iy+1,iz )
v[4]=dx-dxdy-v[6]; coefficient of tbuf(ix+1,iy ,iz )
v[3]=dydz-dxdydz; coefficient of tbuf(ix ,iy+1,iz+1)
v[2]=dz-dydz-v[6]; coefficient of tbuf(ix ,iy ,iz+1)
v[1]=dy-dydz-v[5]; coefficient of tbuf(ix ,iy+1,iz )
v[0]=1-dy-dz+dydz-v[4]; coefficient of tbuf(ix ,iy ,iz )
*/
tpt += ix + iy * tdimx + iz * tdimxy + toffset1;
v6 = dxdz-dxdydz;
v5 = dxdy-dxdydz;
v4 = dx-dxdy-v6;
res = 0;
res += dxdydz * (*tpt); /* tbuf(ix+1,iy+1,iz+1) */
tpt --;
res += (dydz-dxdydz) * (*tpt); /* tbuf(ix ,iy+1,iz+1) */
tpt -= t1dimx;
res += v6 * (*tpt); /* tbuf(ix+1 ,iy, iz+1) */
tpt --;
res += (dz-dydz-v6) * (*tpt); /* tbuf(ix ,iy ,iz+1) */
tpt -= toffset2;
res += v5 * (*tpt); /* tbuf(ix+1,iy+1,iz ) */
tpt --;
res += (dy-dydz-v5) * (*tpt); /* tbuf(ix ,iy+1,iz ) */
tpt -= t1dimx;
res += v4 * (*tpt); /* tbuf(ix+1,iy ,iz ) */
tpt --;
res += (1-dy-dz+dydz-v4) * (*tpt); /* tbuf(ix ,iy ,iz ) */
*rbuf = (r32)_CONVERTR_( res );
continue;
}
/* here, we are sure we are on some border */
tpt += ix + iy * tdimx + iz * tdimxy;
if ( (x < 0.0) || (ix == t1dimx) ) {
if ( (y < 0.0) || (iy == t1dimy) ) {
if ( (z < 0.0) || (iz == t1dimz) ) {
*rbuf = *tpt;
continue;
}
dz = z - iz;
res = (1-dz) * (*tpt); /* (1-dz)* tbuf(ix,iy,iz) */
tpt += tdimxy;
res += dz * (*tpt); /* dz * tbuf(ix,iy,iz+1) */
*rbuf = (r32)_CONVERTR_( res );
continue;
}
dy = y - iy;
if ( (z < 0.0) || (iz == t1dimz) ) {
res = (1-dy) * (*tpt); /* (1-dy)* tbuf(ix,iy,iz) */
tpt += tdimx;
res += dy * (*tpt); /* dy * tbuf(ix,iy+1,iz) */
*rbuf = (r32)_CONVERTR_( res );
continue;
}
dz = z - iz;
res = (1-dy)*(1-dz) * (*tpt); /* tbuf(ix,iy,iz) */
tpt += tdimx;
res += dy*(1-dz) * (*tpt); /* tbuf(ix,iy+1,iz) */
tpt += toffset2+1;
res += (1-dy)*dz * (*tpt); /* tbuf(ix,iy,iz+1) */
tpt += tdimx;
res += dy*dz * (*tpt); /* tbuf(ix,iy+1,iz+1) */
*rbuf = (r32)_CONVERTR_( res );
continue;
}
/* here we are sure that the border is either
along the Y or the Z axis */
dx = x - ix;
if ( (y < 0.0) || (iy == t1dimy) ) {
if ( (z < 0.0) || (iz == t1dimz) ) {
res = (1-dx) * (*tpt); /* tbuf(ix,iy,iz) */
tpt ++;
res += dx * (*tpt); /* tbuf(ix+1,iy,iz) */
*rbuf = (r32)_CONVERTR_( res );
continue;
}
dz = z - iz;
res = (1-dx)*(1-dz) * (*tpt); /* tbuf(ix,iy,iz) */
tpt ++;
res += dx*(1-dz) * (*tpt); /* tbuf(ix+1,iy,iz) */
tpt += tdimxy-1;
res += (1-dx)*dz * (*tpt); /* tbuf(ix,iy,iz+1) */
tpt ++;
res += dx*dz * (*tpt); /* tbuf(ix+1,iy,iz+1) */
*rbuf = (r32)_CONVERTR_( res );
continue;
}
/* here we are sure that the border is along the Z axis */
dy = y - iy;
res = (1-dx)*(1-dy) * (*tpt); /* tbuf(ix,iy,iz) */
tpt ++;
res += dx*(1-dy) * (*tpt); /* tbuf(ix+1,iy,iz) */
tpt += t1dimx;
res += (1-dx)*dy * (*tpt); /* tbuf(ix,iy+1,iz) */
tpt ++;
res += dx*dy * (*tpt); /* tbuf(ix+1,iy+1,iz) */
*rbuf = (r32)_CONVERTR_( res );
}
}
}
CGAL_INLINE_FUNCTION
void Reech3DTriLin4x4gb_r32 ( void* theBuf, /* buffer to be resampled */
int *theDim, /* dimensions of this buffer */
void* resBuf, /* result buffer */
int *resDim, /* dimensions of this buffer */
double* mat, /* transformation matrix */
float gain,
float bias )
{
int i, j, k, ix, iy, iz;
double x, y, z, dx, dy, dz, dxdy,dxdz,dydz,dxdydz;
double res;
double v6, v5, v4;
int rdimx=resDim[0], rdimy=resDim[1], rdimz=resDim[2];
int tdimx=theDim[0], tdimy=theDim[1], tdimz=theDim[2];
int tdimxy=tdimx*tdimy;
int toffset1=tdimxy+tdimx+1, toffset2=tdimxy-tdimx-1;
int t1dimx=tdimx-1, t1dimy=tdimy-1, t1dimz=tdimz-1;
double ddimx = (double)tdimx-0.5, ddimy = (double)tdimy-0.5;
double ddimz = (double)tdimz-0.5;
r32 *tbuf = (r32*)theBuf;
r32 *tpt;
r32 *rbuf = (r32*)resBuf;
double b=bias;
double g=gain;
for ( k = 0; k < rdimz; k ++ ) {
if ( get_static_verbose_reech4x4() != 0 )
fprintf( stderr, "Processing slice %d\r", k );
for ( j = 0; j < rdimy; j ++ )
for ( i = 0; i < rdimx; i ++, rbuf ++ ) {
/* computation of the corresponding point coordinates in theBuf */
x = mat[0] * i + mat[1] * j + mat[2] * k + mat[3];
if ((x < -0.5) || ( x > ddimx)) { *rbuf = 0; continue; }
y = mat[4] * i + mat[5] * j + mat[6] * k + mat[7];
if ((y < -0.5) || ( y > ddimy)) { *rbuf = 0; continue; }
z = mat[8] * i + mat[9] * j + mat[10] * k + mat[11];
if ((z < -0.5) || ( z > ddimz)) { *rbuf = 0; continue; }
/* here, the point lies on the borders or completely inside
the image */
ix = (int)x;
iy = (int)y;
iz = (int)z;
tpt = (r32 *)tbuf;
/* are we on the border or not ? */
if ( (x > 0.0) && (ix < t1dimx) &&
(y > 0.0) && (iy < t1dimy) &&
(z > 0.0) && (iz < t1dimz) ) {
/* the corresponding point is in the box defined
by (ix[+1],iy[+1],iz[+1]) */
dx = x - ix;
dy = y - iy;
dz = z - iz;
dxdy = dx*dy;
dxdz = dx*dz;
dydz = dy*dz;
dxdydz = dxdy*dz;
/* we have
v[7]=dxdydz; coefficient of tbuf(ix+1,iy+1,iz+1)
v[6]=dxdz-dxdydz; coefficient of tbuf(ix+1,iy, iz+1)
v[5]=dxdy-dxdydz; coefficient of tbuf(ix+1,iy+1,iz )
v[4]=dx-dxdy-v[6]; coefficient of tbuf(ix+1,iy ,iz )
v[3]=dydz-dxdydz; coefficient of tbuf(ix ,iy+1,iz+1)
v[2]=dz-dydz-v[6]; coefficient of tbuf(ix ,iy ,iz+1)
v[1]=dy-dydz-v[5]; coefficient of tbuf(ix ,iy+1,iz )
v[0]=1-dy-dz+dydz-v[4]; coefficient of tbuf(ix ,iy ,iz )
*/
tpt += ix + iy * tdimx + iz * tdimxy + toffset1;
v6 = dxdz-dxdydz;
v5 = dxdy-dxdydz;
v4 = dx-dxdy-v6;
res = 0;
res += dxdydz * (*tpt); /* tbuf(ix+1,iy+1,iz+1) */
tpt --;
res += (dydz-dxdydz) * (*tpt); /* tbuf(ix ,iy+1,iz+1) */
tpt -= t1dimx;
res += v6 * (*tpt); /* tbuf(ix+1 ,iy, iz+1) */
tpt --;
res += (dz-dydz-v6) * (*tpt); /* tbuf(ix ,iy ,iz+1) */
tpt -= toffset2;
res += v5 * (*tpt); /* tbuf(ix+1,iy+1,iz ) */
tpt --;
res += (dy-dydz-v5) * (*tpt); /* tbuf(ix ,iy+1,iz ) */
tpt -= t1dimx;
res += v4 * (*tpt); /* tbuf(ix+1,iy ,iz ) */
tpt --;
res += (1-dy-dz+dydz-v4) * (*tpt); /* tbuf(ix ,iy ,iz ) */
res = res * g + b;
*rbuf = (r32)_CONVERTR_( res );
continue;
}
/* here, we are sure we are on some border */
tpt += ix + iy * tdimx + iz * tdimxy;
if ( (x < 0.0) || (ix == t1dimx) ) {
if ( (y < 0.0) || (iy == t1dimy) ) {
if ( (z < 0.0) || (iz == t1dimz) ) {
res = (double)(*tpt) * g + b;
*rbuf = (r32)_CONVERTR_( res );
continue;
}
dz = z - iz;
res = (1-dz) * (*tpt); /* (1-dz)* tbuf(ix,iy,iz) */
tpt += tdimxy;
res += dz * (*tpt); /* dz * tbuf(ix,iy,iz+1) */
res = res * g + b;
*rbuf = (r32)_CONVERTR_( res );
continue;
}
dy = y - iy;
if ( (z < 0.0) || (iz == t1dimz) ) {
res = (1-dy) * (*tpt); /* (1-dy)* tbuf(ix,iy,iz) */
tpt += tdimx;
res += dy * (*tpt); /* dy * tbuf(ix,iy+1,iz) */
res = res * g + b;
*rbuf = (r32)_CONVERTR_( res );
continue;
}
dz = z - iz;
res = (1-dy)*(1-dz) * (*tpt); /* tbuf(ix,iy,iz) */
tpt += tdimx;
res += dy*(1-dz) * (*tpt); /* tbuf(ix,iy+1,iz) */
tpt += toffset2+1;
res += (1-dy)*dz * (*tpt); /* tbuf(ix,iy,iz+1) */
tpt += tdimx;
res += dy*dz * (*tpt); /* tbuf(ix,iy+1,iz+1) */
res = res * g + b;
*rbuf = (r32)_CONVERTR_( res );
continue;
}
/* here we are sure that the border is either
along the Y or the Z axis */
dx = x - ix;
if ( (y < 0.0) || (iy == t1dimy) ) {
if ( (z < 0.0) || (iz == t1dimz) ) {
res = (1-dx) * (*tpt); /* tbuf(ix,iy,iz) */
tpt ++;
res += dx * (*tpt); /* tbuf(ix+1,iy,iz) */
res = res * g + b;
*rbuf = (r32)_CONVERTR_( res );
continue;
}
dz = z - iz;
res = (1-dx)*(1-dz) * (*tpt); /* tbuf(ix,iy,iz) */
tpt ++;
res += dx*(1-dz) * (*tpt); /* tbuf(ix+1,iy,iz) */
tpt += tdimxy-1;
res += (1-dx)*dz * (*tpt); /* tbuf(ix,iy,iz+1) */
tpt ++;
res += dx*dz * (*tpt); /* tbuf(ix+1,iy,iz+1) */
res = res * g + b;
*rbuf = (r32)_CONVERTR_( res );
continue;
}
/* here we are sure that the border is along the Z axis */
dy = y - iy;
res = (1-dx)*(1-dy) * (*tpt); /* tbuf(ix,iy,iz) */
tpt ++;
res += dx*(1-dy) * (*tpt); /* tbuf(ix+1,iy,iz) */
tpt += t1dimx;
res += (1-dx)*dy * (*tpt); /* tbuf(ix,iy+1,iz) */
tpt ++;
res += dx*dy * (*tpt); /* tbuf(ix+1,iy+1,iz) */
res = res * g + b;
*rbuf = (r32)_CONVERTR_( res );
}
}
}
CGAL_INLINE_FUNCTION
void Reech3DNearest4x4_r32 ( void* theBuf, /* buffer to be resampled */
int *theDim, /* dimensions of this buffer */
void* resBuf, /* result buffer */
int *resDim, /* dimensions of this buffer */
double* mat /* transformation matrix */
)
{
int i, j, k, ix, iy, iz;
double x, y, z;
int rdimx=resDim[0], rdimy=resDim[1], rdimz=resDim[2];
int tdimx=theDim[0], tdimy=theDim[1], tdimz=theDim[2];
int tdimxy=tdimx*tdimy;
int t1dimx=tdimx-1, t1dimy=tdimy-1, t1dimz=tdimz-1;
r32 *tbuf = (r32*)theBuf;
r32 *rbuf = (r32*)resBuf;
for ( k = 0; k < rdimz; k ++ ) {
if ( get_static_verbose_reech4x4() != 0 )
fprintf( stderr, "Processing slice %d\r", k );
for ( j = 0; j < rdimy; j ++ )
for ( i = 0; i < rdimx; i ++, rbuf ++ ) {
/* computation of the corresponding point coordinates in theBuf */
x = mat[0] * i + mat[1] * j + mat[2] * k + mat[3];
ix = (int)(x+0.5);
if (( x < -0.5 ) || ( ix > t1dimx)) { *rbuf = 0; continue; }
y = mat[4] * i + mat[5] * j + mat[6] * k + mat[7];
iy = (int)(y+0.5);
if (( y < -0.5 ) || ( iy > t1dimy)) { *rbuf = 0; continue; }
z = mat[8] * i + mat[9] * j + mat[10] * k + mat[11];
iz = (int)(z+0.5);
if (( z < -0.5 ) || ( iz > t1dimz)) { *rbuf = 0; continue; }
*rbuf = tbuf[ ix + iy * tdimx + iz * tdimxy ];
}
}
}
CGAL_INLINE_FUNCTION
void Reech2DTriLin4x4_r32 ( void* theBuf, /* buffer to be resampled */
int *theDim, /* dimensions of this buffer */
void* resBuf, /* result buffer */
int *resDim, /* dimensions of this buffer */
double* mat /* transformation matrix */
)
{
int i, j, k, ix, iy;
double x, y, dx, dy, dxdy;
double res, v;
int rdimx=resDim[0], rdimy=resDim[1], rdimz=resDim[2];
int tdimx=theDim[0], tdimy=theDim[1];
int toffset=tdimx-1;
int t1dimx=tdimx-1, t1dimy=tdimy-1;
double ddimx = (double)tdimx-0.5, ddimy = (double)tdimy-0.5;
r32 *tbuf = (r32*)theBuf;
r32 *tpt;
r32 *rbuf = (r32*)resBuf;
for ( k = 0; k < rdimz; k ++ ) {
if ( get_static_verbose_reech4x4() != 0 )
fprintf( stderr, "Processing slice %d\r", k );
/* tbuf represente le premier point du plan */
tbuf = (r32*)theBuf;
tbuf += k*(tdimx * tdimy);
for ( j = 0; j < rdimy; j ++ )
for ( i = 0; i < rdimx; i ++, rbuf ++ ) {
/* computation of the corresponding point coordinates in theBuf */
x = mat[0] * i + mat[1] * j + mat[3];
if ((x < -0.5) || ( x > ddimx)) { *rbuf = 0; continue; }
y = mat[4] * i + mat[5] * j + mat[7];
if ((y < -0.5) || ( y > ddimy)) { *rbuf = 0; continue; }
/* here, the point lies on the borders or completely inside
the image */
ix = (int)x;
iy = (int)y;
tpt = (r32 *)tbuf;
tpt += ix + iy * tdimx;
/* are we on the border or not ? */
if ( (x > 0.0) && (ix < t1dimx) &&
(y > 0.0) && (iy < t1dimy) ) {
dx = x - ix;
dy = y - iy;
dxdy = dx*dy;
/* we have
v[5]=dxdy; coefficient of tbuf(ix+1,iy+1)
v[4]=dx-dxdy; coefficient of tbuf(ix+1,iy )
v[1]=dy-dxdy; coefficient of tbuf(ix ,iy+1)
v[0]=1-dx-dy+dxdy; coefficient of tbuf(ix ,iy )
*/
v = dy-dxdy;
res = 0;
res += (1-dx-v) * (*tpt); /* tbuf(ix ,iy ) */
tpt ++;
res += (dx-dxdy) * (*tpt); /* tbuf(ix+1,iy ) */
tpt += toffset;
res += v * (*tpt); /* tbuf(ix,iy+1 ) */
tpt ++;
res += dxdy * (*tpt); /* tbuf(ix+1,iy+1) */
*rbuf = (r32)_CONVERTR_( res );
continue;
}
/* here, we are sure we are on some border */
if ( (x < 0.0) || (ix == t1dimx) ) {
/* we just look at y */
if ( (y < 0.0) || (iy == t1dimy) ) {
*rbuf = *tpt;
continue;
}
dy = y - iy;
res = (1-dy) * (*tpt); /* (1-dy)* tbuf(ix,iy) */
tpt += tdimx;
res += dy * (*tpt); /* dy * tbuf(ix,iy+1) */
*rbuf = (r32)_CONVERTR_( res );
continue;
}
dx = x - ix;
res = (1-dx) * (*tpt); /* (1-dx)* tbuf(ix,iy) */
tpt ++;
res += dx * (*tpt); /* dx * tbuf(ix+1,iy) */
*rbuf = (r32)_CONVERTR_( res );
}
}
}
CGAL_INLINE_FUNCTION
void Reech2DTriLin4x4gb_r32 ( void* theBuf, /* buffer to be resampled */
int *theDim, /* dimensions of this buffer */
void* resBuf, /* result buffer */
int *resDim, /* dimensions of this buffer */
double* mat, /* transformation matrix */
float gain,
float bias )
{
int i, j, k, ix, iy;
double x, y, dx, dy, dxdy;
double res, v;
int rdimx=resDim[0], rdimy=resDim[1], rdimz=resDim[2];
int tdimx=theDim[0], tdimy=theDim[1];
int toffset=tdimx-1;
int t1dimx=tdimx-1, t1dimy=tdimy-1;
double ddimx = (double)tdimx-0.5, ddimy = (double)tdimy-0.5;
r32 *tbuf = (r32*)theBuf;
r32 *tpt;
r32 *rbuf = (r32*)resBuf;
double b=bias;
double g=gain;
for ( k = 0; k < rdimz; k ++ ) {
if ( get_static_verbose_reech4x4() != 0 )
fprintf( stderr, "Processing slice %d\r", k );
/* tbuf represente le premier point du plan */
tbuf = (r32*)theBuf;
tbuf += k*(tdimx * tdimy);
for ( j = 0; j < rdimy; j ++ )
for ( i = 0; i < rdimx; i ++, rbuf ++ ) {
/* computation of the corresponding point coordinates in theBuf */
x = mat[0] * i + mat[1] * j + mat[3];
if ((x < -0.5) || ( x > ddimx)) { *rbuf = 0; continue; }
y = mat[4] * i + mat[5] * j + mat[7];
if ((y < -0.5) || ( y > ddimy)) { *rbuf = 0; continue; }
/* here, the point lies on the borders or completely inside
the image */
ix = (int)x;
iy = (int)y;
tpt = (r32 *)tbuf;
tpt += ix + iy * tdimx;
/* are we on the border or not ? */
if ( (x > 0.0) && (ix < t1dimx) &&
(y > 0.0) && (iy < t1dimy) ) {
dx = x - ix;
dy = y - iy;
dxdy = dx*dy;
/* we have
v[5]=dxdy; coefficient of tbuf(ix+1,iy+1)
v[4]=dx-dxdy; coefficient of tbuf(ix+1,iy )
v[1]=dy-dxdy; coefficient of tbuf(ix ,iy+1)
v[0]=1-dx-dy+dxdy; coefficient of tbuf(ix ,iy )
*/
v = dy-dxdy;
res = 0;
res += (1-dx-v) * (*tpt); /* tbuf(ix ,iy ) */
tpt ++;
res += (dx-dxdy) * (*tpt); /* tbuf(ix+1,iy ) */
tpt += toffset;
res += v * (*tpt); /* tbuf(ix,iy+1 ) */
tpt ++;
res += dxdy * (*tpt); /* tbuf(ix+1,iy+1) */
res = res * g + b;
*rbuf = (r32)_CONVERTR_( res );
continue;
}
/* here, we are sure we are on some border */
if ( (x < 0.0) || (ix == t1dimx) ) {
/* we just look at y */
if ( (y < 0.0) || (iy == t1dimy) ) {
res = (double)(*tpt) * g + b;
*rbuf = (r32)_CONVERTR_( res );
continue;
}
dy = y - iy;
res = (1-dy) * (*tpt); /* (1-dy)* tbuf(ix,iy) */
tpt += tdimx;
res += dy * (*tpt); /* dy * tbuf(ix,iy+1) */
res = (double)(*tpt) * g + b;
*rbuf = (r32)_CONVERTR_( res );
continue;
}
dx = x - ix;
res = (1-dx) * (*tpt); /* (1-dx)* tbuf(ix,iy) */
tpt ++;
res += dx * (*tpt); /* dx * tbuf(ix+1,iy) */
res = res * g + b;
*rbuf = (r32)_CONVERTR_( res );
}
}
}
CGAL_INLINE_FUNCTION
void Reech2DNearest4x4_r32 ( void* theBuf, /* buffer to be resampled */
int *theDim, /* dimensions of this buffer */
void* resBuf, /* result buffer */
int *resDim, /* dimensions of this buffer */
double* mat /* transformation matrix */
)
{
int i, j, k, ix, iy;
double x, y;
int rdimx=resDim[0], rdimy=resDim[1], rdimz=resDim[2];
int tdimx=theDim[0], tdimy=theDim[1];
int t1dimx=tdimx-1, t1dimy=tdimy-1;
r32 *tbuf = (r32*)theBuf;
r32 *rbuf = (r32*)resBuf;
for ( k = 0; k < rdimz; k ++ ) {
if ( get_static_verbose_reech4x4() != 0 )
fprintf( stderr, "Processing slice %d\r", k );
/* tbuf represente le premier point du plan */
tbuf = (r32*)theBuf;
tbuf += k*(tdimx * tdimy);
for ( j = 0; j < rdimy; j ++ )
for ( i = 0; i < rdimx; i ++, rbuf ++ ) {
/* computation of the corresponding point coordinates in theBuf */
x = mat[0] * i + mat[1] * j + mat[3];
ix = (int)(x+0.5);
if (( x < -0.5 ) || ( ix > t1dimx)) { *rbuf = 0; continue; }
y = mat[4] * i + mat[5] * j + mat[7];
iy = (int)(y+0.5);
if (( y < -0.5 ) || ( iy > t1dimy)) { *rbuf = 0; continue; }
*rbuf = tbuf[ ix + iy * tdimx ];
}
}
}
CGAL_INLINE_FUNCTION
void Reech4x4_verbose ( )
{
get_static_verbose_reech4x4() = 1;
}
CGAL_INLINE_FUNCTION
void Reech4x4_noverbose ( )
{
get_static_verbose_reech4x4() = 0;
}