00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef CELLBOUNDARYTRACKERPLUGIN_H
00024 #define CELLBOUNDARYTRACKERPLUGIN_H
00025
00026 #include <CompuCell3D/Plugin.h>
00027
00028 #include <CompuCell3D/Potts3D/Cell.h>
00029 #include <CompuCell3D/Potts3D/CellGChangeWatcher.h>
00030 #include <BasicUtils/BasicClassAccessor.h>
00031 #include <BasicUtils/BasicClassGroup.h>
00032 #include "CellBoundaryTracker.h"
00033 #include <CompuCell3D/Field3D/AdjacentNeighbor.h>
00034
00035 namespace CompuCell3D {
00036
00037 class Cell;
00038 class Field3DIndex;
00039 template <class T> class Field3D;
00040
00041
00042 class CellBoundaryTrackerPlugin : public Plugin, public CellGChangeWatcher {
00043
00044
00045
00046 Field3D<CellG *> *cellFieldG;
00047 Dim3D fieldDim;
00048
00049 BasicClassAccessor<CellBoundaryTracker> cellBoundaryTrackerAccessor;
00050 Simulator *simulator;
00051 bool periodicX,periodicY,periodicZ;
00052
00053 public:
00054 CellBoundaryTrackerPlugin();
00055 virtual ~CellBoundaryTrackerPlugin();
00056
00057
00058
00059
00060 virtual void init(Simulator *simulator);
00061
00062
00063 virtual void field3DChange(const Point3D &pt, CellG *newCell,
00064 CellG *oldCell);
00065
00066
00067 virtual void readXML(XMLPullParser &in);
00068 virtual void writeXML(XMLSerializer &out);
00069 virtual void initializeBoundaries() ;
00070 BasicClassAccessor<CellBoundaryTracker> * getCellBoundaryTrackerAccessorPtr(){return & cellBoundaryTrackerAccessor;}
00071
00072
00073 protected:
00074 double distance(double,double,double,double,double,double);
00075
00076 virtual void testLatticeSanity();
00077 virtual void testLatticeSanityFull();
00078 bool isBoundaryPixel(Point3D pt);
00079 bool isTouchingLatticeBoundary(Point3D pt,Point3D ptAdj);
00080 bool watchingAllowed;
00081 AdjacentNeighbor adjNeighbor;
00082 long maxIndex;
00083 long changeCounter;
00084 };
00085 };
00086 #endif