** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: phantom.cpp,v 1.17 2000/08/27 20:32:55 kevin Exp $
+** $Id: phantom.cpp,v 1.19 2000/11/09 00:12:25 kevin Exp $
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License (version 2) as
bool
Phantom::createFromFile (const char* const fname)
{
- bool stoploop = false;
- bool retval = false;
+ bool bGoodFile = true;
FILE *fp;
if ((fp = fopen (fname, "r")) == NULL)
return (false);
m_name = fname;
- do {
- if (! feof(fp)) {
- double cx, cy, u, v, rot, dens;
- char pelemtype[80];
- char str[1024];
- fgets (str, sizeof(str), fp);
- int n = sscanf (str, "%79s %lf %lf %lf %lf %lf %lf", pelemtype, &cx, &cy, &u, &v, &rot, &dens);
+
+ while (1) {
+ double cx, cy, u, v, rot, dens;
+ char pelemtype[80];
+
+ int status = fscanf (fp, "%79s %lf %lf %lf %lf %lf %lf", pelemtype, &cx, &cy, &u, &v, &rot, &dens);
- if (n == EOF || n == 0) { /* end of file */
- stoploop = true;
- retval = false;
- } else if (n != 7) {
- stoploop = true;
- retval = false;
- } else {
- addPElem (pelemtype, cx, cy, u, v, rot, dens);
- retval = true;
- }
- } else {
- stoploop = true;
- retval = true;
+ if (status == static_cast<int>(EOF))
+ break;
+ else if (status != 7) {
+ sys_error (ERR_WARNING, "Insufficient fields reading phantom file %s [Phantom::createFromFile]", fname);
+ bGoodFile = false;
}
- } while (stoploop == false);
+ addPElem (pelemtype, cx, cy, u, v, rot, dens);
+ }
fclose (fp);
- return (retval);
+ return (bGoodFile);
}
void
Phantom::convertToImagefile (ImageFile& im, const int in_nsample, const int trace) const
{
- convertToImagefile (im, in_nsample, trace, 0, im.nx());
+ convertToImagefile (im, in_nsample, trace, 0, im.nx(), true);
}
void
-Phantom::convertToImagefile (ImageFile& im, const int in_nsample, const int trace, const int colStart, const int colCount) const
+Phantom::convertToImagefile (ImageFile& im, const int in_nsample, const int trace, const int colStart, const int colCount, bool bStoreAtColumnPos) const
{
int nx = im.nx();
int ny = im.ny();
ImageFileArray v = im.getArray();
for (int ix = 0; ix < colCount; ix++)
- for (int iy = 0; iy < ny; iy++)
- v[ix][iy] = 0;
+ for (int iy = 0; iy < ny; iy++) {
+ int iColStore = ix;
+ if (bStoreAtColumnPos)
+ iColStore += colStart;
+ v[iColStore][iy] = 0;
+ }
double x_start = xmin + (colStart * xinc);
for (PElemConstIterator pelem = m_listPElem.begin(); pelem != m_listPElem.end(); pelem++) {
double x, y, xi, yi;
int ix, iy, kx, ky;
for (ix = 0, x = x_start; ix < colCount; ix++, x += xinc) {
- for (iy = 0, y = ymin; iy < ny; iy++, y += yinc) {
- for (kx = 0, xi = x + kxofs; kx < nsample; kx++, xi += kxinc) {
- for (ky = 0, yi = y + kyofs; ky < nsample; ky++, yi += kyinc)
- if (rPElem.isPointInside (xi, yi, PHM_COORD) == TRUE)
- v[ix][iy] += rPElem.atten();
+ int iColStore = ix;
+ if (bStoreAtColumnPos)
+ iColStore += colStart;
+ for (iy = 0, y = ymin; iy < ny; iy++, y += yinc) {
+ for (kx = 0, xi = x + kxofs; kx < nsample; kx++, xi += kxinc) {
+ for (ky = 0, yi = y + kyofs; ky < nsample; ky++, yi += kyinc)
+ if (rPElem.isPointInside (xi, yi, PHM_COORD) == TRUE)
+ v[iColStore][iy] += rPElem.atten();
} // for kx
} /* for iy */
} /* for ix */