/**
*
*/
package edu.stanford.rsl.conrad.phantom;
import edu.stanford.rsl.conrad.data.numeric.Grid3D;
/**
* @author febmeng
*
*/
public class NumericalSheppLogan3D {
boolean init = false;
int nx = 0;
int ny = 0;
int nz = 0;
double wx, wy, wz;
double dx, dy, dz;
Grid3D image;
SheppLogan3D phan;
public NumericalSheppLogan3D( int maxI, int maxJ, int maxK ){
initSheppLogan3D( maxI, maxJ, maxK);
if (nx == 0 || ny == 0 || nz == 0 ){
System.out.println("Errpr: Wrong volume image size!");
}
this.image = new Grid3D(nx, ny, nz);
}
public NumericalSheppLogan3D( Grid3D grid ){
this.image = grid;
initSheppLogan3D( image.getSize()[0], image.getSize()[1], image.getSize()[2] );
}
void initSheppLogan3D( int maxI, int maxJ, int maxK){
this.nx = maxI;
this.ny = maxJ;
this.nz = maxK;
wx = ( nx - 1 ) / 2.0 ;
wy = ( ny - 1 ) / 2.0 ;
wz = ( nz - 1 ) / 2.0 ;
dx = 2.0 / ( nx - 1 );
dy = 2.0 / ( ny - 1 );
dz = 2.0 / ( nz - 1 );
phan = new SheppLogan3D( ellipsoidsModifid );
init = true;
}
void computeNumericalPhantom( ){
//System.out.print("nx = " + nx + ", ny = " + ny + ", nz = " + nz + " .\n");
//System.out.print("dx = " + dx + ", dy = " + dy + ", dz = " + dz + " .\n");
//System.out.print("wx = " + wx + ", wy = " + wy + ", wz = " + wz + " .\n");
for( int ix = 0; ix < nx; ix++ ){
double x = ( ix - wx ) * dx ;
for( int iy = 0; iy < ny; iy++ ){
double y = ( iy - wy ) * dy ;
for( int iz = 0; iz < nz; iz++ ){
double z = ( iz - wz ) * dz ;
image.setAtIndex(ix, iy, iz, (float)phan.ImageDomainSignal(x, y, z));
}
}
}
}
public Grid3D getNumericalSheppLoganPhantom(){
if( init)
computeNumericalPhantom();
return image;
}
private static double[][] ellipsoidsModifid =
// { delta_x, delta_y, delta_z, a, b, c, phi, theta, psi, rho }
{ { 0, 0, 0, 0.69, 0.92, 0.81, 0, 0, 0, 1 },
{ 0, -0.0184, 0, 0.6624, 0.874, 0.78, 0, 0, 0, -0.8 },
{ 0.22, 0, 0, 0.11, 0.31, 0.22, -(Math.PI)/10., 0, 0, -0.2 },
{ -0.22, 0, 0, 0.16, 0.41, 0.28, (Math.PI)/10., 0, 0, -0.2 },
{ 0, 0.35, -0.15, 0.21, 0.25, 0.41, 0, 0, 0, 0.1 },
{ 0, 0.1, 0.25, 0.046, 0.046, 0.05, 0, 0, 0, 0.1 },
{ 0, -0.1, 0.25, 0.046, 0.046, 0.05, 0, 0, 0, 0.1 },
{ -0.08, -0.605, 0, 0.046, 0.023, 0.05, 0, 0, 0, 0.1 },
{ 0, -0.605, 0, 0.023, 0.023, 0.02, 0, 0, 0, 0.1 },
{ 0.06, -0.605, 0, 0.023, 0.046, 0.02, 0, 0, 0, 0.1 }};
private static double[][] sphere =
// { delta_x, delta_y, delta_z, a, b, c, phi, theta, psi, rho }
{ { 0, 0, 0, 0.69, 0.69, 0.69, 0, 0, 0, 1 }};
private static double[][] point =
// { delta_x, delta_y, delta_z, a, b, c, phi, theta, psi, rho }
{ { 0.6, 0.4, 0, 0.19, 0.19, 0.19, 0, 0, 0, 1 }};
private static double[][] cylinder =
// { delta_x, delta_y, delta_z, a, b, c, phi, theta, psi, rho }
{ { 0, 0, 0, 0.69, 0.69, 10, 0, 0, 0, 1 }};
}
/*
* Copyright (C) 2010-2014 Andreas Maier
* CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
*/