diff --git a/src/node.cpp b/src/node.cpp new file mode 100644 --- /dev/null +++ b/src/node.cpp @@ -0,0 +1,225 @@ +/* + * + * 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. + * + */ + +#include +#include +#ifdef QTGRAPHICS +#include +#include +#endif +#include "node.h" +#include "cell.h" +#include "mesh.h" +#include "random.h" +#include "parameter.h" +#include "sqr.h" +#include "pi.h" +#include "warning.h" + +static const std::string _module_id("$Id$"); + +extern Parameter par; + +int Node::nnodes=0; +double Node::target_length=1; + +ostream &Edge::print(ostream &os) const { + return os << "{ " << first->Index() << ", " << second->Index() << " }"; +} + +ostream &Neighbor::print(ostream &os) const { + + os << " {" << cell->Index() << " " << nb1->Index() << " " << nb2->Index() << "}"; + return os; + +} + +ostream &operator<<(ostream &os, const Neighbor &n) { + n.print(os); + return os; +} + + +Node::Node(void) : Vector() { + + index=(nnodes++); + node_set =0; + fixed=false; + boundary=false; + sam=false; + dead=false; +} + +Node::Node(int ind) : Vector() { + node_set =0; + index=ind; + fixed=false; + boundary=false; + sam=false; + dead=false; +} + +Node::Node(const Vector &src) : Vector(src) { + + node_set = 0; + index=(nnodes++); + fixed=false; + boundary=false; + sam=false; + dead = false; +} + +Node::Node(double x,double y, double z) : Vector (x,y,z) { + + node_set = 0; + index=(nnodes++); + fixed=false; + boundary=false; + sam=false; + dead = false; +} + +Node::Node(const Node &src) : Vector(src) { + + node_set=0; + owners=src.owners; + m=src.m; + index=src.index; + fixed = src.fixed; + boundary = src.boundary; + sam=src.sam; + dead = src.dead; +} + + +Cell &Node::getCell(const Neighbor &i) { + return *i.getCell(); // use accessor! +} + + +ostream &Node::print(ostream &os) const { + + if (!dead) + os << "Node "; + else + os << "DEAD NODE "; + + os << index << "[ {" << x << ", " << y << ", " << z << "}: {"; + + os << "Neighbors = { "; + + for (list::const_iterator i = owners.begin(); i!=owners.end(); i++) { + os << " {" << i->cell->Index() << " " << i->nb1->Index() << " " << i->nb2->Index() << "} "; + } + os << " } " << endl; + + return os; + +} + + +#ifdef QTGRAPHICS +void Node::DrawIndex(QGraphicsScene *c) const { + + //return DrawOwners(c); + stringstream text; + text << index; + QGraphicsSimpleTextItem *number = new QGraphicsSimpleTextItem ( QString (text.str().c_str()), 0, c ); + number->setFont( QFont( "Helvetica", par.nodenumsize, QFont::Bold) ); + number->setPen( QPen (par.textcolor) ); + number->setZValue(20); + number->show(); + Vector offs=Cell::Offset(); + number -> setPos( + ((offs.x+x)*Cell::Factor()), + ((offs.y+y)*Cell::Factor()) ); +} + +void Node::DrawOwners(QGraphicsScene *c) const { + + stringstream text; + + + + text << owners.size(); + + + QGraphicsSimpleTextItem *number = new QGraphicsSimpleTextItem ( QString (text.str().c_str()), 0, c ); + number->setFont( QFont( "Helvetica", par.nodenumsize, QFont::Bold) ); + number->setPen( QPen(par.textcolor) ); + number->setZValue(20); + number->show(); + Vector offs=Cell::Offset(); + + number ->setPos(((offs.x+x)*Cell::Factor()), + ((offs.y+y)*Cell::Factor()) ); +} + + + +QVector Node::NeighbourAngles(void) { + + QVector angles; + for (list::iterator i=owners.begin(); + i!=owners.end(); + i++) { + + Vector v1 = (*this - *i->nb1).Normalised(); + Vector v2 = (*this - *i->nb2).Normalised(); + + //angles.push_back(atan2(v2.y,v2.x)-atan2(v1.y,v1.x)); + //angles.push_back(atan2(v2.y,v2.x)-atan2(v1.y,v1.x)); + double angle = v1.SignedAngle(v2); + if (angle<0) { + //cerr << "Changing sign of angle " << angle << endl; + angle = angle + 2*Pi; + } + angles.push_back(angle); + + //cerr << "Cell " << i->cell->Index() << ": " << v1 << " and " << v2 << ": angle = " << angles.back() << ", " << v1.Angle(v2) << endl; + + } + + double sum=0.; + for (QVector::iterator i=angles.begin(); + i!=angles.end(); + i++) { + sum+=*i; + } + //cerr << "Angle sum = " << sum << endl; + // Check if the summed angle is different from 2 Pi + if (fabs(sum-(2*Pi))>0.0001) { + + MyWarning::warning("sum = %f",sum); + } + return angles; +} + + + +#endif + + +ostream &operator<<(ostream &os, const Node &n) { + n.print(os); + return os; +} +