// $Id: DataSet.cpp,v 1.2 2006/08/02 03:39:28 pkaz Exp $ // // DataSet class that handles reading of points from input file. Note that a point can be // "hidden" by editing the input file and changing its name to one that is not present // in the list maintained by the Phantom class. // system includes #include using namespace std; #include "DataSet.h" #include "Phantom.h" // DataSet constructor: allocate arrays DataSet::DataSet(int maxpts) { maxPts = maxpts; nrpoints = 0; data[0] = new vctDouble3[maxpts]; data[1] = new vctDouble3[maxpts]; isValid[0] = new bool[maxpts]; isValid[1] = new bool[maxpts]; nameIndex = new int[maxpts]; for (int i=0; i < maxpts; i++) { isValid[0][i] = false; isValid[1][i] = false; } } // DataSet destructor: free memory DataSet::~DataSet() { delete [] data[0]; delete [] data[1]; delete [] isValid[0]; delete [] isValid[1]; delete [] nameIndex; } // ReadFromFile: read the coordinates of the points bool DataSet::ReadFromFile(int dnum, const char* fname) { FILE *fp; char line[100]; char name[20]; double x,y,z; int i,num; if ((fp=fopen(fname, "rt"))==NULL) { cout << "Cannot open input file '" << fname << "'" << endl; return false; } cout << "Reading point set " << dnum+1 << " from file " << fname << endl; fgets(line, sizeof(line), fp); // skip header for (i = 0; i < maxPts; i++) isValid[dnum][i] = false; while (fgets(line, sizeof(line), fp) != NULL) { if (sscanf(line, "%s %lf %lf %lf", name, &x, &y, &z) != 4) { cout << "Error processing: " << line << endl; fclose(fp); return false; } num = Phantom::LookupName(name); if ((num >= 0) && (num < Phantom::GetNumPts())) { data[dnum][num] = vctDouble3(x,y,z); isValid[dnum][num] = true; } } fclose(fp); return true; } // ReadFromArray: read the coordinates from the specified array void DataSet::ReadFromArray(int dnum, const vctDouble3* array) { cout << "Using CNC data for point set " << dnum+1 << endl; for (int i = 0; i < maxPts; i++) { data[dnum][i] = array[i]; isValid[dnum][i] = true; } } // FinalizeInput: this must be called after the 2 data sets are read. // It goes through the input data and eliminates all points that are // not defined in both data sets. void DataSet::FinalizeInput() { nrpoints = 0; for (int i = 0; i < maxPts; i++) { if (isValid[0][i] && isValid[1][i]) { data[0][nrpoints] = data[0][i]; data[1][nrpoints] = data[1][i]; nameIndex[nrpoints] = i; nrpoints++; } } cout << "Total number of points = " << nrpoints << endl; }