00001
00027 #ifndef ABSTRACTNODE_H_
00028 #define ABSTRACTNODE_H_
00029
00030 #include"Point3.h"
00031 #include<vector>
00032 #include<stdlib.h>
00033 #include<assert.h>
00034 #include<limits>
00035 #include<iostream>
00036 using namespace std;
00037 class AbstractNode {
00038 public:
00039 static int globalNumReps;
00040 static vector<vector<double>*>repRandomNums;
00041 static bool globalMultitime;
00042 protected:
00043 Point3 myLoc;
00044 Point3 intensity;
00045 int startTime, endTime;
00046 vector<double> timeVector;
00047 public:
00048 AbstractNode(double x, double y, double z) :
00049 myLoc(x, y, z), intensity(0) {
00050 startTime = -1;
00051 }
00052 AbstractNode() :
00053 myLoc(0), intensity(0) {
00054 startTime = -1;
00055 }
00056 double getScalarTotalIntensity() {
00057 return (1.0f / 3.0f) * intensity.getSum();
00058 }
00059 double getRelativeIntensity(int time) {
00060 if (time < startTime || time > endTime)
00061 return 0;
00062 return timeVector[time - startTime];
00063 }
00064
00065 void setIntensity(double inScaleFactor, int inTime) {
00066 intensity.set(inScaleFactor);
00067 if (inTime == -1) {
00068 inTime = 0;
00069 }
00070 if (inTime >= 0) {
00071 startTime = inTime;
00072 endTime = inTime;
00073 timeVector.clear();
00074 timeVector.push_back(1.0f);
00075 } else {
00076
00077 int len = -inTime;
00078 startTime = 0;
00079 endTime = (int) (len - 1);
00080 timeVector.clear();
00081 timeVector.resize(len);
00082 for (int i = 0; i < len; i++)
00083 timeVector[i] = 1.0f / len;
00084 scaleIntensity(len);
00085 }
00086 }
00087 void setSummedIntensity(AbstractNode &inA, AbstractNode &inB) {
00088 intensity.set(inA.intensity);
00089 intensity.add(inB.intensity);
00090 startTime = inA.startTime < inB.startTime ? inA.startTime : inB.endTime;
00091 endTime = inA.startTime < inB.startTime ? inB.startTime : inA.endTime;
00092
00093 if (startTime != endTime) {
00094 int len = endTime - startTime + 1;
00095 if ((timeVector.size() == 0) || timeVector.size() < (unsigned int)len) {
00096 timeVector.resize(len);
00097 } else {
00098 for (unsigned int i = 0; i < timeVector.size(); i++) {
00099 timeVector[i] = 0;
00100 }
00101 }
00102 double weightA = inA.getScalarTotalIntensity();
00103 double weightB = inB.getScalarTotalIntensity();
00104 double invDenom = 1.0f / (weightA + weightB);
00105 weightA *= invDenom;
00106 weightB *= invDenom;
00107 for (int i = inA.startTime; i <= inA.endTime; i++) {
00108 timeVector[i - startTime] += weightA * inA.timeVector[i
00109 - inA.startTime];
00110 }
00111 for (int i = inB.startTime; i <= inB.endTime; i++) {
00112 timeVector[i - startTime] += weightB * inB.timeVector[i
00113 - inB.startTime];
00114 }
00115 } else {
00116 timeVector.clear();
00117 timeVector.push_back(1.0f);
00118 }
00119 }
00120
00122 void scaleIntensity(double inScale) {
00123 intensity.scale(inScale);
00124 }
00125
00126 static void setGlobalNumReps() {
00127 if (globalNumReps == 1) {
00128 return;
00129 }
00130
00131 globalNumReps = 1;
00132 double inc = 1.0f/1;
00133 for (int i = 0; i < 256; i++) {
00134 for (unsigned int i = 0; i < repRandomNums.size(); i++) {
00135 vector<double> * ranVec = new vector<double> (1);
00136 for (int j = ranVec->size()-1; j > 0; j++) {
00137 int index = (int) (j + 1) * (inc*(double) rand())
00138 / (std::numeric_limits<int>::max());
00139 if (index > j) {
00140 assert(false && "Badness : " + index);
00141 }
00142 double temp = (*ranVec)[j];
00143 (*ranVec)[j] = (*ranVec)[index];
00144 (*ranVec)[index] = temp;
00145 }
00146 if(AbstractNode::repRandomNums[i] !=NULL)
00147 delete AbstractNode::repRandomNums[i];
00148 AbstractNode::repRandomNums[i] = ranVec;
00149 }
00150 }
00151 }
00152
00153 static void setGlobalMultitime() {
00154
00155 globalMultitime = false;
00156 }
00157
00158 Point3 & getPoint() {
00159 return myLoc;
00160 }
00161
00162 virtual bool isLeaf()=0;
00163
00164 virtual int size()=0;
00165 static void cleanup() {
00166 for (unsigned int i = 0; i < repRandomNums.size(); i++)
00167 delete AbstractNode::repRandomNums[i];
00168 }
00169 friend ostream & operator<<(ostream & s, AbstractNode & pt);
00170
00171 };
00172 ostream & operator<<(ostream & s, AbstractNode & pt) {
00173 s << "Abs Node :: Loc " << pt.myLoc << " , Int ::" << pt.intensity
00174 << " Time:: [" << pt.startTime << " - " << pt.endTime << "]";
00175 return s;
00176 }
00177 const int numRepRandomNums= 256;
00178 vector<vector<double>*> AbstractNode::repRandomNums(256);
00179 int AbstractNode::globalNumReps = -1;
00180 bool AbstractNode::globalMultitime = false;
00181 #endif