00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <CompuCell3D/Simulator.h>
00026 #include <CompuCell3D/Potts3D/Potts3D.h>
00027 #include <CompuCell3D/Field3D/Field3D.h>
00028 #include <CompuCell3D/Field3D/WatchableField3D.h>
00029 using namespace CompuCell3D;
00030
00031
00032 #include <iostream>
00033 using namespace std;
00034
00035 #define EXP_STL
00036 #include "BoxWatcher.h"
00037
00038 BoxWatcher::BoxWatcher() : cellFieldG(0),sim(0),potts(0),xMargin(0),yMargin(0),zMargin(0) {}
00039
00040 BoxWatcher::~BoxWatcher() {
00041 }
00042
00043 Point3D BoxWatcher::getMinCoordinates(){return minCoordinates;}
00044 Point3D BoxWatcher::getMaxCoordinates(){return minCoordinates;}
00045
00046 Point3D BoxWatcher::getMargins(){return Point3D(xMargin,yMargin,zMargin);}
00047
00048 void BoxWatcher::init(Simulator *simulator, CC3DXMLElement *_xmlData) {
00049
00050 potts = simulator->getPotts();
00051 sim=simulator;
00052 cellFieldG = (WatchableField3D<CellG *> *)potts->getCellFieldG();
00053 fieldDim=cellFieldG->getDim();
00054
00055
00056 minCoordinates=Point3D(fieldDim.x,fieldDim.y,fieldDim.z);
00057 maxCoordinates=Point3D(0,0,0);
00058
00059 simulator->registerSteerableObject(this);
00060
00061 update(_xmlData,true);
00062
00063 }
00064
00066
00067 void BoxWatcher::extraInit(Simulator *simulator){
00068 frozenTypeVector=potts->getFrozenTypeVector();
00069 }
00071
00072
00073
00074
00076
00077
00078
00079
00080
00082
00083
00084
00085
00086
00088 void BoxWatcher::start(){
00089 minCoordinates=Point3D(fieldDim.x,fieldDim.y,fieldDim.z);
00090 maxCoordinates=Point3D(0,0,0);
00091
00092
00093 adjustBox();
00094
00095
00096
00097 }
00098
00100
00101 void BoxWatcher::step(const unsigned int currentStep){
00102
00103 minCoordinates=Point3D(fieldDim.x,fieldDim.y,fieldDim.z);
00104 maxCoordinates=Point3D(0,0,0);
00105
00106 adjustBox();
00107 cerr<<"minCoordinates="<<minCoordinates<<endl;
00108 cerr<<"maxCoordinates="<<maxCoordinates<<endl;
00109 }
00110
00111
00112
00113
00114 void BoxWatcher::adjustBox(){
00115 Point3D pt;
00116 CellG * cell;
00117 for (int x = 0 ; x < fieldDim.x ; ++x)
00118 for (int y = 0 ; y < fieldDim.y ; ++y)
00119 for (int z = 0 ; z < fieldDim.z ; ++z){
00120 pt=Point3D(x,y,z);
00121 cell=cellFieldG->get(pt);
00122 if(!cell) continue;
00123 if(checkIfFrozen(cell->type)) continue;
00124 adjustCoordinates(pt);
00125 }
00126
00127 int a;
00128 if(minCoordinates.x>maxCoordinates.x){
00129 a=minCoordinates.x;
00130 minCoordinates.x=maxCoordinates.x;
00131 maxCoordinates.x=a;
00132
00133 }
00134 if(minCoordinates.y>maxCoordinates.y){
00135 a=minCoordinates.y;
00136 minCoordinates.y=maxCoordinates.y;
00137 maxCoordinates.y=a;
00138
00139 }
00140 if(minCoordinates.z>maxCoordinates.z){
00141 a=minCoordinates.z;
00142 minCoordinates.z=maxCoordinates.z;
00143 maxCoordinates.z=a;
00144
00145 }
00146
00147
00148 minCoordinates.x = ((int)minCoordinates.x-(int)xMargin<=0 ? 0 :minCoordinates.x-xMargin);
00149 minCoordinates.y = ((int)minCoordinates.y-(int)yMargin<=0 ? 0 :minCoordinates.y-yMargin);
00150 minCoordinates.z = ((int)minCoordinates.z-(int)zMargin<=0 ? 0 :minCoordinates.z-zMargin);
00151
00152
00153 maxCoordinates.x = (maxCoordinates.x+xMargin>=fieldDim.x-1 ? fieldDim.x :maxCoordinates.x+xMargin+1);
00154 maxCoordinates.y = (maxCoordinates.y+yMargin>=fieldDim.y-1 ? fieldDim.y :maxCoordinates.y+yMargin+1);
00155 maxCoordinates.z = (maxCoordinates.z+zMargin>=fieldDim.z-1 ? fieldDim.z :maxCoordinates.z+zMargin+1);
00156
00157 potts->setMinCoordinates(minCoordinates);
00158 potts->setMaxCoordinates(maxCoordinates);
00159 cerr<<"SETTING minCoordinates="<<minCoordinates<<" maxCoordinates="<<maxCoordinates<<endl;
00160
00161 }
00162
00164
00165 void BoxWatcher::adjustCoordinates(Point3D _pt){
00166
00167 if(_pt.x>maxCoordinates.x)
00168 maxCoordinates.x=_pt.x;
00169 if(_pt.y>maxCoordinates.y)
00170 maxCoordinates.y=_pt.y;
00171 if(_pt.z>maxCoordinates.z)
00172 maxCoordinates.z=_pt.z;
00173
00174 if(_pt.x<minCoordinates.x)
00175 minCoordinates.x=_pt.x;
00176 if(_pt.y<minCoordinates.y)
00177 minCoordinates.y=_pt.y;
00178 if(_pt.z<minCoordinates.z)
00179 minCoordinates.z=_pt.z;
00180
00181
00182 }
00183
00184
00185 bool BoxWatcher::checkIfFrozen(unsigned char _type){
00186
00187 for (unsigned int i = 0 ; i< frozenTypeVector.size(); ++i ){
00188 if(frozenTypeVector[i]==_type)
00189 return true;
00190 }
00191 return false;
00192
00193 }
00194
00195 void BoxWatcher::update(CC3DXMLElement *_xmlData, bool _fullInitFlag){
00196
00197 if(_xmlData->findElement("XMargin"))
00198 xMargin=_xmlData->getFirstElement("XMargin")->getUInt();
00199 if(_xmlData->findElement("YMargin"))
00200 yMargin=_xmlData->getFirstElement("YMargin")->getUInt();
00201 if(_xmlData->findElement("ZMargin"))
00202 zMargin=_xmlData->getFirstElement("ZMargin")->getUInt();
00203
00204 }
00205
00206 std::string BoxWatcher::toString(){
00207 return "BoxWatcher";
00208 }
00209
00210
00211 std::string BoxWatcher::steerableName(){
00212 return toString();
00213 }
00214
00215