/*
*
* $Id$
*
* This file is part of the Virtual Leaf.
*
* VirtualLeaf 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.
*
* VirtualLeaf 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 _NODE_H_
#define _NODE_H_
#include
//#include
#include
#include
#ifdef QTGRAPHICS
#include
#include
#include
#endif
#include "vector.h"
#include "random.h"
#include "parameter.h"
#include "cell.h"
#include "modelelement.h"
#include
#include "Neighbor.h"
extern Parameter par;
class Edge {
public:
Edge(void) {
first=0;
second=0;
}
Edge(Node *f, Node *s) {
first=f;
second=s;
}
// Copy Constructor
Edge(const Edge &src) {
first=src.first;
second=src.second;
}
// Ambidextrous equivalence
inline bool operator==(const Edge &e) {
return ( (first==e.first && second==e.second) ||
(first==e.second && second==e.first) );
}
// Output the Edge
ostream &print(ostream &os) const;
Node *first, *second;
};
class NodeSet;
// this class is a node in a cell wall
class Node : public Vector {
friend class Mesh;
friend class CellBase;
friend class Cell;
friend class WallBase;
friend class Wall;
friend class NodeSet;
friend class FigureEditor;
public:
Node(void);
Node(int index); // if want to construct a node, and not increase nnodes
Node(double x,double y, double z=0);
Node(const Node &src);
explicit Node(const Vector &src); // "nonconverting" - explicit constructor syntax required
virtual ~Node() {}
inline int Index(void) const { return index; }
inline bool IndexEquals(int i) { return i == index; }
inline bool BoundaryP(void) const { return boundary; }
inline void SetBoundary(void) { boundary = true; }
inline void UnsetBoundary(void) { boundary = false; }
inline void SetSAM(void) { sam = true; }
inline void toggleBoundary(void) {
boundary = !boundary;
}
Cell &getCell(const Neighbor &i);
ostream &print(ostream &os) const;
void XMLAdd(xmlNodePtr nodes_node) const;
#ifdef QTGRAPHICS
void Draw(QGraphicsScene &c, QColor color=QColor("black"), int size = 10) const;
void DrawIndex(QGraphicsScene *c) const;
void DrawOwners(QGraphicsScene *c) const;
#endif
// temporary function for easier debugging
inline int CellsSize(void) const { return owners.size(); }
inline int Value(void) const { return owners.size(); }
void Fix(void) { fixed=true; }
inline bool Fixed(void) const { return fixed; }
inline void Unfix(void) { fixed=false; }
inline void MarkDead(void) { dead=true; }
inline bool DeadP(void) { return dead; }
inline void Mark(void) { marked=true; }
inline void Unmark(void) { marked=false; }
inline bool Marked(void) const { return marked; }
inline void setPos( Vector p ) {
x = p.x;
y = p.y;
z = p.z;
}
inline bool SamP(void) const { return sam; }
//!\brief Calculate angles with neighboring vertices
//! Sum of angles should be 2*Pi
QVector NeighbourAngles(void);
private:
// "owners" lists the cells to which this cell belong
// and the two neighboring nodes relative to each cell
list< Neighbor > owners;
Mesh *m;
int index;
static int nnodes;
static double target_length;
// if the node belongs to a NodeSet, node_set contains the pointer. Otherwise it is 0.
NodeSet *node_set;
// fixed nodes cannot move. E.g. to represent the petiole
bool fixed;
bool boundary; // true if node is at the edge of the leaf
bool sam; // true if node is connected to the shoot
bool dead;
bool marked;
};
ostream &operator<<(ostream &os, const Node &n);
inline ostream &operator<<(ostream &os, const Edge &e) {
e.print(os);
return os;
}
#endif
/* finis */