diff --git a/src/cell.h b/src/cell.h
new file mode 100644
--- /dev/null
+++ b/src/cell.h
@@ -0,0 +1,209 @@
+/*
+ *
+ * $Id$
+ *
+ * This file is part of the Virtual Leaf.
+ *
+ * The Virtual Leaf is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * The Virtual Leaf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the Virtual Leaf. If not, see .
+ *
+ * Copyright 2010 Roeland Merks.
+ *
+ */
+
+#ifndef _CELL_H_
+#define _CELL_H_
+
+#include
+#include
+#include
+#include
+#include "vector.h"
+#include "parameter.h"
+#include "wall.h"
+#include "warning.h"
+#include "cellbase.h"
+#include "cell.h"
+
+#include
+#include
+#include
+
+#include
+#include
+#include
+
+class Cell : public CellBase
+{
+
+ Q_OBJECT
+ friend class Mesh;
+ friend class FigureEditor;
+
+public:
+ Cell(double x, double y, double z = 0.);
+ Cell(void);
+ Cell(const Cell &src);
+ Cell operator=(const Cell &src);
+ bool Cmp(Cell*) const;
+ bool Eq(Cell*) const;
+
+ inline bool IndexEquals(int i) { return i == index; }
+
+ static void SetMagnification(const double &magn) {
+ factor=magn;
+ }
+ static Vector Offset(void) {
+ Vector offs;
+ offs.x=offset[0];
+ offs.y=offset[1];
+ return offs;
+ }
+
+ static void Translate(const double &tx,const double &ty) {
+ offset[0]+=tx;
+ offset[1]+=ty;
+ }
+
+ inline static double Factor(void) {
+ return factor;
+ }
+ static void setOffset(double ox, double oy) {
+ offset[0]=ox;
+ offset[1]=oy;
+ }
+ static double Magnification(void) {
+ return factor;
+ }
+
+ static double Scale(const double scale) {
+ factor*=scale;
+ return factor;
+ }
+
+ // return node "i"
+ // wrapped around, i.e. node n==node 0
+ // will not work if i < -nodes.size()
+ //Node &getNode(int i) const;
+ void DivideOverAxis(Vector axis); // divide cell over axis
+ bool DivideOverGivenLine(const Vector v1, const Vector v2, bool wall_fixed = false, NodeSet *node_set = 0); // divide over the line (if line and cell intersect)
+
+ void Divide(void) { // Divide cell over short axis
+
+ Vector long_axis;
+ Length(&long_axis);
+ DivideOverAxis(long_axis.Perp2D());
+
+ }
+
+ //void CheckForGFDrivenDivision(void);
+ inline int NNodes(void) const { return nodes.size(); }
+
+ void Move(Vector T);
+ void Move(double dx, double dy, double dz=0) {
+ Move( Vector (dx, dy, dz) );
+ }
+
+ double Displace(double dx, double dy, double dh);
+ void Displace(void);
+ double Energy(void) const;
+ bool SelfIntersect(void);
+ bool MoveSelfIntersectsP(Node *nid, Vector new_pos);
+ bool IntersectsWithLineP(const Vector v1, const Vector v2);
+
+ void XMLAdd(xmlNodePtr cells_node) const;
+
+ void ConstructWalls(void);
+ void Flux(double *flux, double *D);
+
+ /*! \brief Method called if a cell is clicked.
+
+ Define this in the end-user code (e.g. meinhardt.cpp).
+
+ */
+ void OnClick(QMouseEvent *e);
+ inline Mesh& getMesh(void) const { return *m; }
+ double MeanArea(void);
+
+ void Apoptose(void); // Cell kills itself
+ list::iterator RemoveWall( Wall *w );
+ void AddWall( Wall *w );
+
+ void Draw(QGraphicsScene *c, QString tooltip = QString::Null());
+
+ // Draw a text in the cell's center
+ void DrawText(QGraphicsScene *c, const QString &text) const;
+ void DrawIndex(QGraphicsScene *c) const;
+ void DrawCenter(QGraphicsScene *c) const;
+ void DrawNodes(QGraphicsScene *c) const;
+
+ void DrawAxis(QGraphicsScene *c) const;
+ void DrawStrain(QGraphicsScene *c) const;
+ void DrawFluxes(QGraphicsScene *c, double arrowsize = 1.);
+ void DrawWalls(QGraphicsScene *c) const;
+ void DrawValence(QGraphicsScene *c) const;
+ void EmitValues(double t);
+
+signals:
+ void ChemMonValue(double t, double *x);
+
+
+protected:
+ void XMLAddCore(xmlNodePtr xmlcell) const;
+ int XMLRead(xmlNode *cur);
+ void DivideWalls(ItList new_node_locations, const Vector from, const Vector to, bool wall_fixed = false, NodeSet *node_set = 0);
+
+private:
+
+ static QPen *cell_outline_pen;
+ static double offset[3];
+ static double factor;
+ Mesh *m;
+ void ConstructConnections(void);
+ void SetWallLengths(void);
+
+};
+
+
+// Boundarypolygon is a special cell; will not increase ncells
+// and will not be part of Mesh::cells
+class BoundaryPolygon : public Cell {
+
+public:
+ BoundaryPolygon(void) : Cell() {
+ NCells()--;
+ index=-1;
+ }
+
+ BoundaryPolygon(double x,double y,double z=0) : Cell (x,y,z) {
+ NCells()--;
+ index=-1;
+ }
+
+ BoundaryPolygon &operator=(Cell &src) {
+ Cell::operator=(src);
+ index=-1;
+ return *this;
+ }
+ virtual void Draw(QGraphicsScene *c, QString tooltip = QString::Null());
+
+ virtual void XMLAdd(xmlNodePtr parent_node) const;
+
+ virtual bool BoundaryPolP(void) const { return true; }
+
+
+};
+
+
+
+#endif