Changes in / [a7c344:b32dbb]


Ignore:
Location:
src
Files:
5 deleted
24 edited

Legend:

Unmodified
Added
Removed
  • src/Legacy/oldmenu.cpp

    ra7c344 rb32dbb  
    2727#include "vector_ops.hpp"
    2828#include "Plane.hpp"
    29 #include "Line.hpp"
    3029
    3130#include "UIElements/UIFactory.hpp"
     
    186185          // rotate vector around first angle
    187186          first->x = x;
    188           first->x = Line(zeroVec,z).rotateVector(first->x,b - M_PI);
     187          first->x = RotateVector(first->x,z,b - M_PI);
    189188          Log() << Verbose(0) << "Rotated vector: " << first->x << endl,
    190189          // remove the projection onto the rotation plane of the second angle
     
    202201          // rotate another vector around second angle
    203202          n = y;
    204           n = Line(zeroVec,x).rotateVector(n,c - M_PI);
     203          n = RotateVector(n,x,c - M_PI);
    205204          Log() << Verbose(0) << "2nd Rotated vector: " << n << endl;
    206205
  • src/Line.cpp

    ra7c344 rb32dbb  
    1111
    1212#include "vector.hpp"
    13 #include "log.hpp"
    14 #include "verbose.hpp"
    15 #include "gslmatrix.hpp"
    16 #include "info.hpp"
    17 #include "Exceptions/LinearDependenceException.hpp"
    18 #include "Exceptions/SkewException.hpp"
    19 #include "Plane.hpp"
    2013
    21 using namespace std;
    22 
    23 Line::Line(const Vector &_origin, const Vector &_direction) :
     14Line::Line(Vector &_origin, Vector &_direction) :
     15  origin(new Vector(_origin)),
    2416  direction(new Vector(_direction))
    2517{
    2618  direction->Normalize();
    27   origin.reset(new Vector(_origin.partition(*direction).second));
    2819}
    29 
    30 Line::Line(const Line &src) :
    31   origin(new Vector(*src.origin)),
    32   direction(new Vector(*src.direction))
    33 {}
    3420
    3521Line::~Line()
     
    3824
    3925double Line::distance(const Vector &point) const{
    40   // get any vector from line to point
    41   Vector helper = point - *origin;
    42   // partition this vector along direction
    43   // the residue points from the line to the point
    44   return helper.partition(*direction).second.Norm();
     26  return fabs(point.ScalarProduct(*direction) - origin->ScalarProduct(*direction));
    4527}
    4628
    4729Vector Line::getClosestPoint(const Vector &point) const{
    48   // get any vector from line to point
    49   Vector helper = point - *origin;
    50   // partition this vector along direction
    51   // add only the part along the direction
    52   return *origin + helper.partition(*direction).first;
     30  double factor = point.ScalarProduct(*direction) - origin->ScalarProduct(*direction);
     31  return (point - (factor * (*direction)));
    5332}
    54 
    55 Vector Line::getDirection() const{
    56   return *direction;
    57 }
    58 
    59 Vector Line::getOrigin() const{
    60   return *origin;
    61 }
    62 
    63 vector<Vector> Line::getPointsOnLine() const{
    64   vector<Vector> res;
    65   res.reserve(2);
    66   res.push_back(*origin);
    67   res.push_back(*origin+*direction);
    68   return res;
    69 }
    70 
    71 /** Calculates the intersection of the two lines that are both on the same plane.
    72  * This is taken from Weisstein, Eric W. "Line-Line Intersection." From MathWorld--A Wolfram Web Resource. http://mathworld.wolfram.com/Line-LineIntersection.html
    73  * \param *out output stream for debugging
    74  * \param *Line1a first vector of first line
    75  * \param *Line1b second vector of first line
    76  * \param *Line2a first vector of second line
    77  * \param *Line2b second vector of second line
    78  * \return true - \a this will contain the intersection on return, false - lines are parallel
    79  */
    80 Vector Line::getIntersection(const Line& otherLine) const{
    81   Info FunctionInfo(__func__);
    82 
    83   pointset line1Points = getPointsOnLine();
    84 
    85   Vector Line1a = line1Points[0];
    86   Vector Line1b = line1Points[1];
    87 
    88   pointset line2Points = otherLine.getPointsOnLine();
    89 
    90   Vector Line2a = line2Points[0];
    91   Vector Line2b = line2Points[1];
    92 
    93   Vector res;
    94 
    95   auto_ptr<GSLMatrix> M = auto_ptr<GSLMatrix>(new GSLMatrix(4,4));
    96 
    97   M->SetAll(1.);
    98   for (int i=0;i<3;i++) {
    99     M->Set(0, i, Line1a[i]);
    100     M->Set(1, i, Line1b[i]);
    101     M->Set(2, i, Line2a[i]);
    102     M->Set(3, i, Line2b[i]);
    103   }
    104 
    105   //Log() << Verbose(1) << "Coefficent matrix is:" << endl;
    106   //for (int i=0;i<4;i++) {
    107   //  for (int j=0;j<4;j++)
    108   //    cout << "\t" << M->Get(i,j);
    109   //  cout << endl;
    110   //}
    111   if (fabs(M->Determinant()) > MYEPSILON) {
    112     Log() << Verbose(1) << "Determinant of coefficient matrix is NOT zero." << endl;
    113     throw SkewException(__FILE__,__LINE__);
    114   }
    115 
    116   Log() << Verbose(1) << "INFO: Line1a = " << Line1a << ", Line1b = " << Line1b << ", Line2a = " << Line2a << ", Line2b = " << Line2b << "." << endl;
    117 
    118 
    119   // constuct a,b,c
    120   Vector a = Line1b - Line1a;
    121   Vector b = Line2b - Line2a;
    122   Vector c = Line2a - Line1a;
    123   Vector d = Line2b - Line1b;
    124   Log() << Verbose(1) << "INFO: a = " << a << ", b = " << b << ", c = " << c << "." << endl;
    125   if ((a.NormSquared() < MYEPSILON) || (b.NormSquared() < MYEPSILON)) {
    126    res.Zero();
    127    Log() << Verbose(1) << "At least one of the lines is ill-defined, i.e. offset equals second vector." << endl;
    128    throw LinearDependenceException(__FILE__,__LINE__);
    129   }
    130 
    131   // check for parallelity
    132   Vector parallel;
    133   double factor = 0.;
    134   if (fabs(a.ScalarProduct(b)*a.ScalarProduct(b)/a.NormSquared()/b.NormSquared() - 1.) < MYEPSILON) {
    135     parallel = Line1a - Line2a;
    136     factor = parallel.ScalarProduct(a)/a.Norm();
    137     if ((factor >= -MYEPSILON) && (factor - 1. < MYEPSILON)) {
    138       res = Line2a;
    139       Log() << Verbose(1) << "Lines conincide." << endl;
    140       return res;
    141     } else {
    142       parallel = Line1a - Line2b;
    143       factor = parallel.ScalarProduct(a)/a.Norm();
    144       if ((factor >= -MYEPSILON) && (factor - 1. < MYEPSILON)) {
    145         res = Line2b;
    146         Log() << Verbose(1) << "Lines conincide." << endl;
    147         return res;
    148       }
    149     }
    150     Log() << Verbose(1) << "Lines are parallel." << endl;
    151     res.Zero();
    152     throw LinearDependenceException(__FILE__,__LINE__);
    153   }
    154 
    155   // obtain s
    156   double s;
    157   Vector temp1, temp2;
    158   temp1 = c;
    159   temp1.VectorProduct(b);
    160   temp2 = a;
    161   temp2.VectorProduct(b);
    162   Log() << Verbose(1) << "INFO: temp1 = " << temp1 << ", temp2 = " << temp2 << "." << endl;
    163   if (fabs(temp2.NormSquared()) > MYEPSILON)
    164     s = temp1.ScalarProduct(temp2)/temp2.NormSquared();
    165   else
    166     s = 0.;
    167   Log() << Verbose(1) << "Factor s is " << temp1.ScalarProduct(temp2) << "/" << temp2.NormSquared() << " = " << s << "." << endl;
    168 
    169   // construct intersection
    170   res = a;
    171   res.Scale(s);
    172   res += Line1a;
    173   Log() << Verbose(1) << "Intersection is at " << res << "." << endl;
    174 
    175   return res;
    176 }
    177 
    178 /** Rotates the vector by an angle of \a alpha around this line.
    179  * \param rhs Vector to rotate
    180  * \param alpha rotation angle in radian
    181  */
    182 Vector Line::rotateVector(const Vector &rhs, double alpha) const{
    183   Vector helper = rhs;
    184 
    185   // translate the coordinate system so that the line goes through (0,0,0)
    186   helper -= *origin;
    187 
    188   // partition the vector into a part that gets rotated and a part that lies along the line
    189   pair<Vector,Vector> parts = helper.partition(*direction);
    190 
    191   // we just keep anything that is along the axis
    192   Vector res = parts.first;
    193 
    194   // the rest has to be rotated
    195   Vector a = parts.second;
    196   // we only have to do the rest, if we actually could partition the vector
    197   if(!a.IsZero()){
    198     // construct a vector that is orthogonal to a and direction and has length |a|
    199     Vector y = a;
    200     // direction is normalized, so the result has length |a|
    201     y.VectorProduct(*direction);
    202 
    203     res += cos(alpha) * a + sin(alpha) * y;
    204   }
    205 
    206   // translate the coordinate system back
    207   res += *origin;
    208   return res;
    209 }
    210 
    211 Plane Line::getOrthogonalPlane(const Vector &origin) const{
    212   return Plane(getDirection(),origin);
    213 }
    214 
    215 Line makeLineThrough(const Vector &x1, const Vector &x2){
    216   if(x1==x2){
    217     throw LinearDependenceException(__FILE__,__LINE__);
    218   }
    219   return Line(x1,x1-x2);
    220 }
  • src/Line.hpp

    ra7c344 rb32dbb  
    1212
    1313#include <memory>
    14 #include <vector>
    1514
    1615class Vector;
    17 class Plane;
    1816
    1917class Line : public Space
    2018{
    2119public:
    22   Line(const Vector &_origin, const Vector &_direction);
    23   Line(const Line& _src);
     20  Line(Vector &_origin, Vector &_direction);
    2421  virtual ~Line();
    2522
    26   virtual double distance(const Vector &point) const;
    27   virtual Vector getClosestPoint(const Vector &point) const;
    28 
    29   Vector getDirection() const;
    30   Vector getOrigin() const;
    31 
    32   std::vector<Vector> getPointsOnLine() const;
    33 
    34   Vector getIntersection(const Line& otherLine) const;
    35 
    36   Vector rotateVector(const Vector &rhs, double alpha) const;
    37 
    38   Plane getOrthogonalPlane(const Vector &origin) const;
     23  virtual double distance(const Vector &point) const=0;
     24  virtual Vector getClosestPoint(const Vector &point) const=0;
    3925
    4026private:
     
    4329};
    4430
    45 /**
    46  * Named constructor to make a line through two points
    47  */
    48 Line makeLineThrough(const Vector &x1, const Vector &x2);
    49 
    5031#endif /* LINE_HPP_ */
  • src/Makefile.am

    ra7c344 rb32dbb  
    8888                                  Exceptions/LinearDependenceException.cpp \
    8989                                  Exceptions/MathException.cpp \
    90                                   Exceptions/SkewException.cpp \
    9190                                  Exceptions/ZeroVectorException.cpp
    9291                                 
     
    9493                                  Exceptions/LinearDependenceException.hpp \
    9594                                  Exceptions/MathException.hpp \
    96                                   Exceptions/SkewException.hpp \
    9795                                  Exceptions/ZeroVectorException.hpp
    9896
  • src/Plane.cpp

    ra7c344 rb32dbb  
    1414#include "Helpers/Assert.hpp"
    1515#include <cmath>
    16 #include "Line.hpp"
    17 #include "Exceptions/MultipleSolutionsException.hpp"
    1816
    1917/**
     
    4442/**
    4543 * Constructs a plane from two direction vectors and a offset.
     44 * If no offset is given a plane through origin is assumed
    4645 */
    4746Plane::Plane(const Vector &y1, const Vector &y2, double _offset) throw(ZeroVectorException,LinearDependenceException) :
     
    114113}
    115114
    116 Vector Plane::getOffsetVector() const {
     115Vector Plane::getOffsetVector() {
    117116  return getOffset()*getNormal();
    118117}
    119118
    120 vector<Vector> Plane::getPointsOnPlane() const{
     119vector<Vector> Plane::getPointsOnPlane(){
    121120  std::vector<Vector> res;
    122121  res.reserve(3);
     
    148147 * \return true -  \a this contains intersection point on return, false - line is parallel to plane (even if in-plane)
    149148 */
    150 Vector Plane::GetIntersection(const Line& line) const
     149Vector Plane::GetIntersection(const Vector &Origin, const Vector &LineVector)
    151150{
    152151  Info FunctionInfo(__func__);
    153152  Vector res;
    154153
    155   double factor1 = getNormal().ScalarProduct(line.getDirection());
    156   if(fabs(factor1)<MYEPSILON){
    157     // the plane is parallel... under all circumstances this is bad luck
    158     // we no have either no or infinite solutions
    159     if(isContained(line.getOrigin())){
    160       throw MultipleSolutionsException<Vector>(__FILE__,__LINE__,line.getOrigin());
    161     }
    162     else{
    163       throw LinearDependenceException(__FILE__,__LINE__);
    164     }
    165   }
    166 
    167   double factor2 = getNormal().ScalarProduct(line.getOrigin());
     154  // find intersection of a line defined by Offset and Direction with a  plane defined by triangle
     155  Vector Direction = LineVector - Origin;
     156  Direction.Normalize();
     157  Log() << Verbose(1) << "INFO: Direction is " << Direction << "." << endl;
     158  //Log() << Verbose(1) << "INFO: PlaneNormal is " << *PlaneNormal << " and PlaneOffset is " << *PlaneOffset << "." << endl;
     159  double factor1 = Direction.ScalarProduct(*normalVector.get());
     160  if (fabs(factor1) < MYEPSILON) { // Uniqueness: line parallel to plane?
     161    Log() << Verbose(1) << "BAD: Line is parallel to plane, no intersection." << endl;
     162    throw LinearDependenceException(__FILE__,__LINE__);
     163  }
     164
     165  double factor2 = Origin.ScalarProduct(*normalVector.get());
     166  if (fabs(factor2-offset) < MYEPSILON) { // Origin is in-plane
     167    Log() << Verbose(1) << "GOOD: Origin of line is in-plane." << endl;
     168    res = Origin;
     169    return res;
     170  }
     171
    168172  double scaleFactor = (offset-factor2)/factor1;
    169173
    170   res = line.getOrigin() + scaleFactor * line.getDirection();
    171 
    172   // tests to make sure the resulting vector really is on plane and line
    173   ASSERT(isContained(res),"Calculated line-Plane intersection does not lie on plane.");
    174   ASSERT(line.isContained(res),"Calculated line-Plane intersection does not lie on line.");
     174  //factor = Origin->ScalarProduct(PlaneNormal)*(-PlaneOffset->ScalarProduct(PlaneNormal))/(Direction.ScalarProduct(PlaneNormal));
     175  Direction.Scale(scaleFactor);
     176  res = Origin + Direction;
     177  Log() << Verbose(1) << "INFO: Scaled direction is " << Direction << "." << endl;
     178
     179  // test whether resulting vector really is on plane
     180  ASSERT(fabs(res.ScalarProduct(*normalVector) - offset) < MYEPSILON,
     181         "Calculated line-Plane intersection does not lie on plane.");
    175182  return res;
    176183};
    177 
    178 Vector Plane::mirrorVector(const Vector &rhs) const {
    179   Vector helper = getVectorToPoint(rhs);
    180   // substract twice the Vector to the plane
    181   return rhs+2*helper;
    182 }
    183 
    184 Line Plane::getOrthogonalLine(const Vector &origin) const{
    185   return Line(origin,getNormal());
    186 }
    187184
    188185/************ Methods inherited from Space ****************/
  • src/Plane.hpp

    ra7c344 rb32dbb  
    1717
    1818class Vector;
    19 class Line;
    2019
    2120class Plane : public Space
     
    4342   * Same as getOffset()*getNormal();
    4443   */
    45   Vector getOffsetVector() const;
     44  Vector getOffsetVector();
    4645
    4746  /**
    4847   * returns three seperate points on this plane
    4948   */
    50   std::vector<Vector> getPointsOnPlane() const;
     49  std::vector<Vector> getPointsOnPlane();
    5150
    5251  // some calculations
    53   Vector GetIntersection(const Line &Line) const;
    54 
    55   Vector mirrorVector(const Vector &rhs) const;
    56 
    57   /**
    58    * get a Line that is orthogonal to this plane, going through a chosen
    59    * point.
    60    *
    61    * The point does not have to lie on the plane itself.
    62    */
    63   Line getOrthogonalLine(const Vector &origin) const;
     52  Vector GetIntersection(const Vector &Origin, const Vector &LineVector);
    6453
    6554  /****** Methods inherited from Space ***********/
  • src/Space.cpp

    ra7c344 rb32dbb  
    1919}
    2020
    21 Vector Space::getVectorToPoint(const Vector &origin) const{
    22   Vector support = getClosestPoint(origin);
    23   return support-origin;
    24 }
    25 
    2621bool Space::isContained(const Vector &point) const{
    2722  return (distance(point)) < MYEPSILON;
  • src/Space.hpp

    ra7c344 rb32dbb  
    1717  virtual ~Space();
    1818
    19   /**
    20    * Calculates the distance between a Space and a Vector.
    21    */
    2219  virtual double distance(const Vector &point) const=0;
    23 
    24   /**
    25    * get the closest point inside the space to another point
    26    */
    2720  virtual Vector getClosestPoint(const Vector &point) const=0;
    28 
    29   /**
    30    * get the shortest Vector from a point to a Space.
    31    *
    32    * The Vector always points from the given Vector to the point in space
    33    * returned by Plane::getClosestPoint().
    34    */
    35   virtual Vector getVectorToPoint(const Vector &point) const;
    36 
    37   /**
    38    * Test wether a point is contained in the space.
    39    *
    40    * returns true, when the point lies inside and false
    41    * otherwise.
    42    */
    4321  virtual bool isContained(const Vector &point) const;
    44 
    45   /**
    46    * Tests if this space contains the center of the coordinate system.
    47    */
    4822  virtual bool hasZero() const;
    4923
  • src/atom.cpp

    ra7c344 rb32dbb  
    6868atom *atom::GetTrueFather()
    6969{
    70   if(father == this){ // top most father is the one that points on itself
    71     return this;
    72   }
    73   else if(!father) {
    74     return 0;
    75   }
    76   else {
    77     return father->GetTrueFather();
    78   }
     70  atom *walker = this;
     71  do {
     72    if (walker == walker->father) // top most father is the one that points on itself
     73      break;
     74    walker = walker->father;
     75  } while (walker != NULL);
     76  return walker;
    7977};
    8078
  • src/boundary.cpp

    ra7c344 rb32dbb  
    620620  for (TriangleMap::iterator runner = TesselStruct->TrianglesOnBoundary.begin(); runner != TesselStruct->TrianglesOnBoundary.end(); runner++)
    621621    { // go through every triangle, calculate volume of its pyramid with CoG as peak
    622       x = runner->second->getEndpoint(0) - runner->second->getEndpoint(1);
    623       y = runner->second->getEndpoint(0) - runner->second->getEndpoint(2);
    624       const double a = x.Norm();
    625       const double b = y.Norm();
    626       const double c = runner->second->getEndpoint(2).distance(runner->second->getEndpoint(1));
     622      x = (*runner->second->endpoints[0]->node->node) - (*runner->second->endpoints[1]->node->node);
     623      y = (*runner->second->endpoints[0]->node->node) - (*runner->second->endpoints[2]->node->node);
     624      const double a = sqrt(runner->second->endpoints[0]->node->node->DistanceSquared(*runner->second->endpoints[1]->node->node));
     625      const double b = sqrt(runner->second->endpoints[0]->node->node->DistanceSquared(*runner->second->endpoints[2]->node->node));
     626      const double c = sqrt(runner->second->endpoints[2]->node->node->DistanceSquared(*runner->second->endpoints[1]->node->node));
    627627      const double G = sqrt(((a + b + c) * (a + b + c) - 2 * (a * a + b * b + c * c)) / 16.); // area of tesselated triangle
    628       x = runner->second->getPlane().getNormal();
    629       x.Scale(runner->second->getEndpoint(1).ScalarProduct(x));
     628      x = Plane(*(runner->second->endpoints[0]->node->node),
     629                *(runner->second->endpoints[1]->node->node),
     630                *(runner->second->endpoints[2]->node->node)).getNormal();
     631      x.Scale(runner->second->endpoints[1]->node->node->ScalarProduct(x));
    630632      const double h = x.Norm(); // distance of CoG to triangle
    631633      const double PyramidVolume = (1. / 3.) * G * h; // this formula holds for _all_ pyramids (independent of n-edge base or (not) centered peak)
  • src/molecule_geometry.cpp

    ra7c344 rb32dbb  
    1616#include "molecule.hpp"
    1717#include "World.hpp"
    18 #include "Plane.hpp"
    1918
    2019/************************************* Functions for class molecule *********************************/
     
    252251void molecule::Mirror(const Vector *n)
    253252{
    254   Plane p(*n,0);
    255   // TODO: replace with simpler construct (e.g. Boost::foreach)
    256   // once the structure of the atom list is fully reworked
    257   atom *Walker = start;
    258   while (Walker->next != end) {
    259     Walker = Walker->next;
    260     (*Walker->node) = p.mirrorVector(*Walker->node);
    261   }
     253  ActOnAllVectors( &Vector::Mirror, *n );
    262254};
    263255
  • src/periodentafel.cpp

    ra7c344 rb32dbb  
    212212
    213213  // fill elements DB
    214   snprintf(filename,MAXSTRINGSIZE,"%s/%s",path,STANDARDELEMENTSDB);
     214  strncpy(filename, path, MAXSTRINGSIZE);
     215  strncat(filename, "/", MAXSTRINGSIZE-strlen(filename));
     216  strncat(filename, STANDARDELEMENTSDB, MAXSTRINGSIZE-strlen(filename));
    215217  infile.open(filename);
    216218  if (infile != NULL) {
     
    256258
    257259  // fill valence DB per element
    258   snprintf(filename,MAXSTRINGSIZE,"%s/%s",path,STANDARDVALENCEDB);
     260  strncpy(filename, path, MAXSTRINGSIZE);
     261  strncat(filename, "/", MAXSTRINGSIZE-strlen(filename));
     262  strncat(filename, STANDARDVALENCEDB, MAXSTRINGSIZE-strlen(filename));
    259263  infile.open(filename);
    260264  if (infile != NULL) {
     
    273277
    274278  // fill valence DB per element
    275   snprintf(filename,MAXSTRINGSIZE,"%s/%s",path,STANDARDORBITALDB);
     279  strncpy(filename, path, MAXSTRINGSIZE);
     280  strncat(filename, "/", MAXSTRINGSIZE-strlen(filename));
     281  strncat(filename, STANDARDORBITALDB, MAXSTRINGSIZE-strlen(filename));
    276282  infile.open(filename);
    277283  if (infile != NULL) {
     
    290296
    291297  // fill H-BondDistance DB per element
    292   snprintf(filename,MAXSTRINGSIZE,"%s/%s",path,STANDARDHBONDDISTANCEDB);
     298  strncpy(filename, path, MAXSTRINGSIZE);
     299  strncat(filename, "/", MAXSTRINGSIZE-strlen(filename));
     300  strncat(filename, STANDARDHBONDDISTANCEDB, MAXSTRINGSIZE-strlen(filename));
    293301  infile.open(filename);
    294302  if (infile != NULL) {
     
    310318
    311319  // fill H-BondAngle DB per element
    312   snprintf(filename,MAXSTRINGSIZE,"%s/%s",path,STANDARDHBONDANGLEDB);
     320  strncpy(filename, path, MAXSTRINGSIZE);
     321  strncat(filename, "/", MAXSTRINGSIZE-strlen(filename));
     322  strncat(filename, STANDARDHBONDANGLEDB, MAXSTRINGSIZE-strlen(filename));
    313323  infile.open(filename);
    314324  if (infile != NULL) {
     
    353363  char filename[MAXSTRINGSIZE];
    354364
    355   snprintf(filename,MAXSTRINGSIZE,"%s/%s",path,STANDARDELEMENTSDB);
     365  strncpy(filename, path, MAXSTRINGSIZE);
     366  strncat(filename, "/", MAXSTRINGSIZE-strlen(filename));
     367  strncat(filename, STANDARDELEMENTSDB, MAXSTRINGSIZE-strlen(filename));
    356368  f.open(filename);
    357369  if (f != NULL) {
  • src/tesselation.cpp

    ra7c344 rb32dbb  
    1717#include "triangleintersectionlist.hpp"
    1818#include "vector.hpp"
    19 #include "Line.hpp"
    2019#include "vector_ops.hpp"
    2120#include "verbose.hpp"
     
    470469
    471470  try {
    472     Line centerLine = makeLineThrough(*MolCenter, *x);
    473     *Intersection = Plane(NormalVector, *(endpoints[0]->node->node)).GetIntersection(centerLine);
    474 
    475     DoLog(1) && (Log() << Verbose(1) << "INFO: Triangle is " << *this << "." << endl);
    476     DoLog(1) && (Log() << Verbose(1) << "INFO: Line is from " << *MolCenter << " to " << *x << "." << endl);
    477     DoLog(1) && (Log() << Verbose(1) << "INFO: Intersection is " << *Intersection << "." << endl);
    478 
    479     if (Intersection->DistanceSquared(*endpoints[0]->node->node) < MYEPSILON) {
    480       DoLog(1) && (Log() << Verbose(1) << "Intersection coindices with first endpoint." << endl);
    481       return true;
    482     }   else if (Intersection->DistanceSquared(*endpoints[1]->node->node) < MYEPSILON) {
    483       DoLog(1) && (Log() << Verbose(1) << "Intersection coindices with second endpoint." << endl);
    484       return true;
    485     }   else if (Intersection->DistanceSquared(*endpoints[2]->node->node) < MYEPSILON) {
    486       DoLog(1) && (Log() << Verbose(1) << "Intersection coindices with third endpoint." << endl);
    487       return true;
    488     }
    489     // Calculate cross point between one baseline and the line from the third endpoint to intersection
    490     int i = 0;
    491     do {
    492       Line line1 = makeLineThrough(*(endpoints[i%3]->node->node),*(endpoints[(i+1)%3]->node->node));
    493       Line line2 = makeLineThrough(*(endpoints[(i+2)%3]->node->node),*Intersection);
    494       CrossPoint = line1.getIntersection(line2);
     471    *Intersection = Plane(NormalVector, *(endpoints[0]->node->node)).GetIntersection(*MolCenter, *x);
     472  }
     473  catch (LinearDependenceException &excp) {
     474    Log() << Verbose(1) << excp;
     475    DoeLog(1) && (eLog() << Verbose(1) << "Alas! Intersection with plane failed - at least numerically - the intersection is not on the plane!" << endl);
     476    return false;
     477  }
     478
     479  DoLog(1) && (Log() << Verbose(1) << "INFO: Triangle is " << *this << "." << endl);
     480  DoLog(1) && (Log() << Verbose(1) << "INFO: Line is from " << *MolCenter << " to " << *x << "." << endl);
     481  DoLog(1) && (Log() << Verbose(1) << "INFO: Intersection is " << *Intersection << "." << endl);
     482
     483  if (Intersection->DistanceSquared(*endpoints[0]->node->node) < MYEPSILON) {
     484    DoLog(1) && (Log() << Verbose(1) << "Intersection coindices with first endpoint." << endl);
     485    return true;
     486  }   else if (Intersection->DistanceSquared(*endpoints[1]->node->node) < MYEPSILON) {
     487    DoLog(1) && (Log() << Verbose(1) << "Intersection coindices with second endpoint." << endl);
     488    return true;
     489  }   else if (Intersection->DistanceSquared(*endpoints[2]->node->node) < MYEPSILON) {
     490    DoLog(1) && (Log() << Verbose(1) << "Intersection coindices with third endpoint." << endl);
     491    return true;
     492  }
     493  // Calculate cross point between one baseline and the line from the third endpoint to intersection
     494  int i = 0;
     495  do {
     496    try {
     497      CrossPoint = GetIntersectionOfTwoLinesOnPlane(*(endpoints[i%3]->node->node),
     498                                                    *(endpoints[(i+1)%3]->node->node),
     499                                                    *(endpoints[(i+2)%3]->node->node),
     500                                                    *Intersection);
    495501      helper = (*endpoints[(i+1)%3]->node->node) - (*endpoints[i%3]->node->node);
    496502      CrossPoint -= (*endpoints[i%3]->node->node);  // cross point was returned as absolute vector
     
    499505      if ((s < -MYEPSILON) || ((s-1.) > MYEPSILON)) {
    500506        DoLog(1) && (Log() << Verbose(1) << "INFO: Crosspoint " << CrossPoint << "outside of triangle." << endl);
    501         return false;
     507        i=4;
     508        break;
    502509      }
    503510      i++;
    504     } while (i < 3);
     511    } catch (LinearDependenceException &excp){
     512      break;
     513    }
     514  } while (i < 3);
     515  if (i == 3) {
    505516    DoLog(1) && (Log() << Verbose(1) << "INFO: Crosspoint " << CrossPoint << " inside of triangle." << endl);
    506517    return true;
    507   }
    508   catch (MathException &excp) {
    509     Log() << Verbose(1) << excp;
    510     DoeLog(1) && (eLog() << Verbose(1) << "Alas! Intersection with plane failed - at least numerically - the intersection is not on the plane!" << endl);
     518  } else {
     519    DoLog(1) && (Log() << Verbose(1) << "INFO: Crosspoint " << CrossPoint << " outside of triangle." << endl);
    511520    return false;
    512521  }
     
    535544  GetCenter(&Direction);
    536545  try {
    537     Line l = makeLineThrough(*x, Direction);
    538     *ClosestPoint = Plane(NormalVector, *(endpoints[0]->node->node)).GetIntersection(l);
    539   }
    540   catch (MathException &excp) {
     546    *ClosestPoint = Plane(NormalVector, *(endpoints[0]->node->node)).GetIntersection(*x, Direction);
     547  }
     548  catch (LinearDependenceException &excp) {
    541549    (*ClosestPoint) = (*x);
    542550  }
     
    561569    Direction = (*endpoints[(i+1)%3]->node->node) - (*endpoints[i%3]->node->node);
    562570    // calculate intersection, line can never be parallel to Direction (is the same vector as PlaneNormal);
    563     Line l = makeLineThrough(*(endpoints[i%3]->node->node), *(endpoints[(i+1)%3]->node->node));
    564     CrossPoint[i] = Plane(Direction, InPlane).GetIntersection(l);
     571    CrossPoint[i] = Plane(Direction, InPlane).GetIntersection(*(endpoints[i%3]->node->node), *(endpoints[(i+1)%3]->node->node));
    565572    CrossDirection[i] = CrossPoint[i] - InPlane;
    566573    CrossPoint[i] -= (*endpoints[i%3]->node->node);  // cross point was returned as absolute vector
     
    733740}
    734741
    735 Vector BoundaryTriangleSet::getEndpoint(int i) const{
    736   ASSERT(i>=0 && i<3,"Index of Endpoint out of Range");
    737 
    738   return *endpoints[i]->node->node;
    739 }
    740 
    741 string BoundaryTriangleSet::getEndpointName(int i) const{
    742   ASSERT(i>=0 && i<3,"Index of Endpoint out of Range");
    743 
    744   return endpoints[i]->node->getName();
    745 }
    746 
    747742/** output operator for BoundaryTriangleSet.
    748743 * \param &ost output stream
     
    751746ostream &operator <<(ostream &ost, const BoundaryTriangleSet &a)
    752747{
    753   ost << "[" << a.Nr << "|" << a.getEndpointName(0) << "," << a.getEndpointName(1) << "," << a.getEndpointName(2) << "]";
     748  ost << "[" << a.Nr << "|" << a.endpoints[0]->node->getName() << "," << a.endpoints[1]->node->getName() << "," << a.endpoints[2]->node->getName() << "]";
    754749  //  ost << "[" << a.Nr << "|" << a.endpoints[0]->node->Name << " at " << *a.endpoints[0]->node->node << ","
    755750  //      << a.endpoints[1]->node->Name << " at " << *a.endpoints[1]->node->node << "," << a.endpoints[2]->node->Name << " at " << *a.endpoints[2]->node->node << "]";
     
    15191514        CenterVector.Zero();
    15201515        for (int i = 0; i < 3; i++)
    1521           CenterVector += BTS->getEndpoint(i);
     1516          CenterVector += (*BTS->endpoints[i]->node->node);
    15221517        CenterVector.Scale(1. / 3.);
    15231518        DoLog(2) && (Log() << Verbose(2) << "CenterVector of base triangle is " << CenterVector << endl);
     
    48734868  if (LastTriangle != NULL) {
    48744869    stringstream sstr;
    4875     sstr << "-"<< TrianglesOnBoundary.size() << "-" << LastTriangle->getEndpointName(0) << "_" << LastTriangle->getEndpointName(1) << "_" << LastTriangle->getEndpointName(2);
     4870    sstr << "-"<< TrianglesOnBoundary.size() << "-" << LastTriangle->endpoints[0]->node->getName() << "_" << LastTriangle->endpoints[1]->node->getName() << "_" << LastTriangle->endpoints[2]->node->getName();
    48764871    NumberName = sstr.str();
    48774872    if (DoTecplotOutput) {
  • src/tesselation.hpp

    ra7c344 rb32dbb  
    171171
    172172    Plane getPlane() const;
    173     Vector getEndpoint(int) const;
    174     std::string getEndpointName(int) const;
    175173
    176174    class BoundaryPointSet *endpoints[3];
     
    179177    Vector SphereCenter;
    180178    int Nr;
    181 
    182   private:
    183 
    184179};
    185180
  • src/tesselationhelpers.cpp

    ra7c344 rb32dbb  
    1515#include "tesselationhelpers.hpp"
    1616#include "vector.hpp"
    17 #include "Line.hpp"
    1817#include "vector_ops.hpp"
    1918#include "verbose.hpp"
     
    725724  // calculate the intersection between this projected baseline and Base
    726725  Vector *Intersection = new Vector;
    727   Line line1 = makeLineThrough(*(Base->endpoints[0]->node->node),*(Base->endpoints[1]->node->node));
    728   Line line2 = makeLineThrough(NewOffset, NewDirection);
    729   *Intersection = line1.getIntersection(line2);
     726  *Intersection = GetIntersectionOfTwoLinesOnPlane(*(Base->endpoints[0]->node->node),
     727                                                   *(Base->endpoints[1]->node->node),
     728                                                     NewOffset, NewDirection);
    730729  Normal = (*Intersection) - (*Base->endpoints[0]->node->node);
    731730  DoLog(1) && (Log() << Verbose(1) << "Found closest point on " << *Base << " at " << *Intersection << ", factor in line is " << fabs(Normal.ScalarProduct(Baseline)/Baseline.NormSquared()) << "." << endl);
  • src/unittests/Makefile.am

    ra7c344 rb32dbb  
    2323  InfoUnitTest \
    2424  LinearSystemOfEquationsUnitTest \
    25   LineUnittest \
    2625  LinkedCellUnitTest \
    2726  ListOfBondsUnitTest \
     
    6564  infounittest.cpp \
    6665  linearsystemofequationsunittest.cpp \
    67   LineUnittest.cpp \
    6866  LinkedCellUnitTest.cpp \
    6967  listofbondsunittest.cpp \
     
    9997  infounittest.hpp \
    10098  linearsystemofequationsunittest.hpp \
    101   LineUnittest.hpp \
    10299  LinkedCellUnitTest.hpp \
    103100  listofbondsunittest.hpp \
     
    156153LinearSystemOfEquationsUnitTest_LDADD = ${ALLLIBS}
    157154
    158 LineUnittest_SOURCES = UnitTestMain.cpp LineUnittest.cpp LineUnittest.hpp
    159 LineUnittest_LDADD = ${ALLLIBS}
    160 
    161155LinkedCellUnitTest_SOURCES = UnitTestMain.cpp LinkedCellUnitTest.cpp LinkedCellUnitTest.hpp
    162156LinkedCellUnitTest_LDADD = ${ALLLIBS}
  • src/unittests/PlaneUnittest.cpp

    ra7c344 rb32dbb  
    1717
    1818#include "vector.hpp"
    19 #include "Line.hpp"
    2019
    2120CPPUNIT_TEST_SUITE_REGISTRATION( PlaneUnittest );
     
    154153  CPPUNIT_ASSERT(fabs(p4->distance(e1)-1) < MYEPSILON);
    155154  CPPUNIT_ASSERT_EQUAL(zeroVec,p4->getClosestPoint(e1));
     155
     156
    156157}
    157 
    158 void PlaneUnittest::mirrorTest(){
    159   Vector fixture;
    160 
    161   // some Vectors that lie on the planes
    162   fixture = p1->mirrorVector(e1);
    163   CPPUNIT_ASSERT_EQUAL(fixture,e1);
    164   fixture = p1->mirrorVector(e2);
    165   CPPUNIT_ASSERT_EQUAL(fixture,e2);
    166   fixture = p1->mirrorVector(e3);
    167   CPPUNIT_ASSERT_EQUAL(fixture,e3);
    168 
    169   fixture = p2->mirrorVector(zeroVec);
    170   CPPUNIT_ASSERT_EQUAL(fixture,zeroVec);
    171   fixture = p2->mirrorVector(e1);
    172   CPPUNIT_ASSERT_EQUAL(fixture,e1);
    173   fixture = p2->mirrorVector(e2);
    174   CPPUNIT_ASSERT_EQUAL(fixture,e2);
    175 
    176   fixture = p3->mirrorVector(zeroVec);
    177   CPPUNIT_ASSERT_EQUAL(fixture,zeroVec);
    178   fixture = p3->mirrorVector(e1);
    179   CPPUNIT_ASSERT_EQUAL(fixture,e1);
    180   fixture = p3->mirrorVector(e3);
    181   CPPUNIT_ASSERT_EQUAL(fixture,e3);
    182 
    183   fixture = p4->mirrorVector(zeroVec);
    184   CPPUNIT_ASSERT_EQUAL(fixture,zeroVec);
    185   fixture = p4->mirrorVector(e2);
    186   CPPUNIT_ASSERT_EQUAL(fixture,e2);
    187   fixture = p4->mirrorVector(e3);
    188   CPPUNIT_ASSERT_EQUAL(fixture,e3);
    189 
    190   // some Vectors outside of the planes
    191   {
    192     Vector t = (2./3.)*(e1+e2+e3);
    193     fixture = p1->mirrorVector(zeroVec);
    194     CPPUNIT_ASSERT_EQUAL(fixture,t);
    195   }
    196 
    197   fixture = p2->mirrorVector(e3);
    198   CPPUNIT_ASSERT_EQUAL(fixture,-1*e3);
    199   fixture = p3->mirrorVector(e2);
    200   CPPUNIT_ASSERT_EQUAL(fixture,-1*e2);
    201   fixture = p4->mirrorVector(e1);
    202   CPPUNIT_ASSERT_EQUAL(fixture,-1*e1);
    203 }
    204 
    205 void PlaneUnittest::LineIntersectionTest(){
    206   Vector fixture;
    207   // plane at (0,0,0) normal to (1,0,0) cuts line from (0,0,0) to (2,1,0) at ???
    208   Line l1 = makeLineThrough(zeroVec,Vector(2,1,0));
    209   CPPUNIT_ASSERT_NO_THROW(fixture = Plane(e1, zeroVec).GetIntersection(l1) );
    210   CPPUNIT_ASSERT_EQUAL( zeroVec, fixture );
    211 
    212   // plane at (2,1,0) normal to (0,1,0) cuts line from (1,0,0) to (0,1,1) at ???
    213   Line l2 = makeLineThrough(e1,Vector(0,1,1));
    214   CPPUNIT_ASSERT_NO_THROW(fixture = Plane(e2, Vector(2,1,0)).GetIntersection(l2) );
    215   CPPUNIT_ASSERT_EQUAL( Vector(0., 1., 1.), fixture );
    216 }
  • src/unittests/PlaneUnittest.hpp

    ra7c344 rb32dbb  
    2020  CPPUNIT_TEST ( pointsTest );
    2121  CPPUNIT_TEST ( operationsTest );
    22   CPPUNIT_TEST ( mirrorTest );
    23   CPPUNIT_TEST ( LineIntersectionTest );
    2422  CPPUNIT_TEST_SUITE_END();
    2523
     
    3230  void pointsTest();
    3331  void operationsTest();
    34   void mirrorTest();
    35   void LineIntersectionTest();
    3632
    3733private:
  • src/unittests/vectorunittest.cpp

    ra7c344 rb32dbb  
    216216}
    217217
     218/** UnitTest for line intersections.
     219 */
     220void VectorTest::LineIntersectionTest()
     221{
     222  // plane at (0,0,0) normal to (1,0,0) cuts line from (0,0,0) to (2,1,0) at ???
     223  CPPUNIT_ASSERT_NO_THROW(fixture = Plane(unit, zero).GetIntersection(zero, two) );
     224  CPPUNIT_ASSERT_EQUAL( zero, fixture );
     225
     226  // plane at (2,1,0) normal to (0,1,0) cuts line from (1,0,0) to (0,1,1) at ???
     227  CPPUNIT_ASSERT_NO_THROW(fixture = Plane(otherunit, two).GetIntersection( unit, notunit) );
     228  CPPUNIT_ASSERT_EQUAL( Vector(0., 1., 1.), fixture );
     229
     230  // four vectors equal to zero
     231  CPPUNIT_ASSERT_THROW(fixture = GetIntersectionOfTwoLinesOnPlane(zero, zero, zero, zero), LinearDependenceException);
     232  //CPPUNIT_ASSERT_EQUAL( zero, fixture );
     233
     234  // four vectors equal to unit
     235  CPPUNIT_ASSERT_THROW(fixture = GetIntersectionOfTwoLinesOnPlane(unit, unit, unit, unit), LinearDependenceException);
     236  //CPPUNIT_ASSERT_EQUAL( zero, fixture );
     237
     238  // two equal lines
     239  CPPUNIT_ASSERT_NO_THROW(fixture = GetIntersectionOfTwoLinesOnPlane(unit, two, unit, two));
     240  CPPUNIT_ASSERT_EQUAL( unit, fixture );
     241
     242  // line from (1,0,0) to (2,1,0) cuts line from (1,0,0) to (0,1,0) at ???
     243  CPPUNIT_ASSERT_NO_THROW( fixture = GetIntersectionOfTwoLinesOnPlane(unit, two, unit, otherunit) );
     244  CPPUNIT_ASSERT_EQUAL( unit, fixture );
     245
     246  // line from (1,0,0) to (0,0,0) cuts line from (0,0,0) to (2,1,0) at ???
     247  CPPUNIT_ASSERT_NO_THROW( fixture = GetIntersectionOfTwoLinesOnPlane(unit, zero, zero, two) );
     248  CPPUNIT_ASSERT_EQUAL( zero, fixture );
     249
     250  // line from (1,0,0) to (2,1,0) cuts line from (0,0,0) to (0,1,0) at ???
     251  CPPUNIT_ASSERT_NO_THROW(fixture = GetIntersectionOfTwoLinesOnPlane(unit, two, zero, otherunit) );
     252  CPPUNIT_ASSERT_EQUAL( Vector(0., -1., 0.), fixture );
     253};
     254
     255/** UnitTest for vector rotations.
     256 */
     257void VectorTest::VectorRotationTest()
     258{
     259  fixture = Vector(-1.,0.,0.);
     260
     261  // zero vector does not change
     262  fixture = RotateVector(zero,unit, 1.);
     263  CPPUNIT_ASSERT_EQUAL( zero, fixture );
     264
     265  fixture = RotateVector(zero, two, 1.);
     266  CPPUNIT_ASSERT_EQUAL( zero,  fixture);
     267
     268  // vector on axis does not change
     269  fixture = RotateVector(unit,unit, 1.);
     270  CPPUNIT_ASSERT_EQUAL( unit, fixture );
     271
     272  // rotations
     273  fixture = RotateVector(otherunit, unit, M_PI);
     274  CPPUNIT_ASSERT_EQUAL( Vector(0.,-1.,0.), fixture );
     275
     276  fixture = RotateVector(otherunit, unit, 2. * M_PI);
     277  CPPUNIT_ASSERT_EQUAL( otherunit, fixture );
     278
     279  fixture = RotateVector(otherunit,unit, 0);
     280  CPPUNIT_ASSERT_EQUAL( otherunit, fixture );
     281
     282  fixture = RotateVector(Vector(0.,0.,1.), notunit, M_PI);
     283  CPPUNIT_ASSERT_EQUAL( otherunit, fixture );
     284}
    218285
    219286/**
  • src/unittests/vectorunittest.hpp

    ra7c344 rb32dbb  
    2727    CPPUNIT_TEST ( ProjectionTest );
    2828    CPPUNIT_TEST ( NormalsTest );
     29    CPPUNIT_TEST ( LineIntersectionTest );
     30    CPPUNIT_TEST ( VectorRotationTest );
    2931    CPPUNIT_TEST ( IsInParallelepipedTest );
    3032    CPPUNIT_TEST_SUITE_END();
  • src/vector.cpp

    ra7c344 rb32dbb  
    213213{
    214214  Vector tmp;
    215   tmp[0] = x[1]* y[2] - x[2]* y[1];
    216   tmp[1] = x[2]* y[0] - x[0]* y[2];
    217   tmp[2] = x[0]* y[1] - x[1]* y[0];
     215  tmp[0] = x[1]* (y[2]) - x[2]* (y[1]);
     216  tmp[1] = x[2]* (y[0]) - x[0]* (y[2]);
     217  tmp[2] = x[0]* (y[1]) - x[1]* (y[0]);
    218218  (*this) = tmp;
    219219};
     
    232232  *this -= tmp;
    233233};
     234
     235/** Calculates the minimum distance vector of this vector to the plane.
     236 * \param *out output stream for debugging
     237 * \param *PlaneNormal normal of plane
     238 * \param *PlaneOffset offset of plane
     239 * \return distance to plane
     240 * \return distance vector onto to plane
     241 */
     242Vector Vector::GetDistanceVectorToPlane(const Vector &PlaneNormal, const Vector &PlaneOffset) const
     243{
     244  Vector temp = (*this) - PlaneOffset;
     245  temp.MakeNormalTo(PlaneNormal);
     246  temp.Scale(-1.);
     247  // then add connecting vector from plane to point
     248  temp += (*this)-PlaneOffset;
     249  double sign = temp.ScalarProduct(PlaneNormal);
     250  if (fabs(sign) > MYEPSILON)
     251    sign /= fabs(sign);
     252  else
     253    sign = 0.;
     254
     255  temp.Normalize();
     256  temp.Scale(sign);
     257  return temp;
     258};
     259
    234260
    235261/** Calculates the minimum distance of this vector to the plane.
     
    525551  MatrixMultiplication(M);
    526552};
    527 
    528 std::pair<Vector,Vector> Vector::partition(const Vector &rhs) const{
    529   double factor = ScalarProduct(rhs)/rhs.NormSquared();
    530   Vector res= factor * rhs;
    531   return make_pair(res,(*this)-res);
    532 }
    533 
    534 std::pair<pointset,Vector> Vector::partition(const pointset &points) const{
    535   Vector helper = *this;
    536   pointset res;
    537   for(pointset::const_iterator iter=points.begin();iter!=points.end();++iter){
    538     pair<Vector,Vector> currPart = helper.partition(*iter);
    539     res.push_back(currPart.first);
    540     helper = currPart.second;
    541   }
    542   return make_pair(res,helper);
    543 }
    544553
    545554/** Do a matrix multiplication.
     
    602611};
    603612
     613/** Mirrors atom against a given plane.
     614 * \param n[] normal vector of mirror plane.
     615 */
     616void Vector::Mirror(const Vector &n)
     617{
     618  double projection;
     619  projection = ScalarProduct(n)/n.NormSquared();    // remove constancy from n (keep as logical one)
     620  // withdraw projected vector twice from original one
     621  for (int i=NDIM;i--;)
     622    at(i) -= 2.*projection*n[i];
     623};
     624
    604625/** Calculates orthonormal vector to one given vectors.
    605626 * Just subtracts the projection onto the given vector from this vector.
     
    612633  bool result = false;
    613634  double factor = y1.ScalarProduct(*this)/y1.NormSquared();
    614   Vector x1 = factor * y1;
     635  Vector x1;
     636  x1 = factor * y1;
    615637  SubtractVector(x1);
    616638  for (int i=NDIM;i--;)
  • src/vector.hpp

    ra7c344 rb32dbb  
    1616
    1717#include <memory>
    18 #include <vector>
    1918
    2019#include "defs.hpp"
     
    2221
    2322/********************************************** declarations *******************************/
    24 
    25 class Vector;
    26 
    27 typedef std::vector<Vector> pointset;
    2823
    2924/** Single vector.
     
    4439
    4540  double DistanceSquared(const Vector &y) const;
     41  Vector GetDistanceVectorToPlane(const Vector &PlaneNormal, const Vector &PlaneOffset) const;
    4642  double DistanceToSpace(const Space& space) const;
    4743  double PeriodicDistance(const Vector &y, const double * const cell_size) const;
     
    6056  void ProjectIt(const Vector &y);
    6157  Vector Projection(const Vector &y) const;
     58  void Mirror(const Vector &x);
    6259  void ScaleAll(const double *factor);
    6360  void Scale(const double factor);
     
    6966  bool IsInParallelepiped(const Vector &offset, const double * const parallelepiped) const;
    7067  void WrapPeriodically(const double * const M, const double * const Minv);
    71   std::pair<Vector,Vector> partition(const Vector&) const;
    72   std::pair<pointset,Vector> partition(const pointset&) const;
    7368
    7469  // Accessors ussually come in pairs... and sometimes even more than that
  • src/vector_ops.cpp

    ra7c344 rb32dbb  
    1515#include "Helpers/fast_functions.hpp"
    1616#include "Exceptions/LinearDependenceException.hpp"
    17 #include "Exceptions/SkewException.hpp"
    1817
    1918#include <gsl/gsl_linalg.h>
     
    111110  return true;
    112111};
     112
     113/** Rotates the vector relative to the origin around the axis given by \a *axis by an angle of \a alpha.
     114 * \param *axis rotation axis
     115 * \param alpha rotation angle in radian
     116 */
     117Vector RotateVector(const Vector &vec,const Vector &axis, const double alpha)
     118{
     119  Vector a,y;
     120  Vector res;
     121  // normalise this vector with respect to axis
     122  a = vec;
     123  a.ProjectOntoPlane(axis);
     124  // construct normal vector
     125  try {
     126    y = Plane(axis,a,0).getNormal();
     127  }
     128  catch (MathException &excp) {
     129    // The normal vector cannot be created if there is linar dependency.
     130    // Then the vector to rotate is on the axis and any rotation leads to the vector itself.
     131    return vec;
     132  }
     133  y.Scale(vec.Norm());
     134  // scale normal vector by sine and this vector by cosine
     135  y.Scale(sin(alpha));
     136  a.Scale(cos(alpha));
     137  res = vec.Projection(axis);
     138  // add scaled normal vector onto this vector
     139  res += y;
     140  // add part in axis direction
     141  res += a;
     142  return res;
     143};
     144
     145/** Calculates the intersection of the two lines that are both on the same plane.
     146 * This is taken from Weisstein, Eric W. "Line-Line Intersection." From MathWorld--A Wolfram Web Resource. http://mathworld.wolfram.com/Line-LineIntersection.html
     147 * \param *out output stream for debugging
     148 * \param *Line1a first vector of first line
     149 * \param *Line1b second vector of first line
     150 * \param *Line2a first vector of second line
     151 * \param *Line2b second vector of second line
     152 * \return true - \a this will contain the intersection on return, false - lines are parallel
     153 */
     154Vector GetIntersectionOfTwoLinesOnPlane(const Vector &Line1a, const Vector &Line1b, const Vector &Line2a, const Vector &Line2b)
     155{
     156  Info FunctionInfo(__func__);
     157
     158  Vector res;
     159
     160  auto_ptr<GSLMatrix> M = auto_ptr<GSLMatrix>(new GSLMatrix(4,4));
     161
     162  M->SetAll(1.);
     163  for (int i=0;i<3;i++) {
     164    M->Set(0, i, Line1a[i]);
     165    M->Set(1, i, Line1b[i]);
     166    M->Set(2, i, Line2a[i]);
     167    M->Set(3, i, Line2b[i]);
     168  }
     169
     170  //Log() << Verbose(1) << "Coefficent matrix is:" << endl;
     171  //for (int i=0;i<4;i++) {
     172  //  for (int j=0;j<4;j++)
     173  //    cout << "\t" << M->Get(i,j);
     174  //  cout << endl;
     175  //}
     176  if (fabs(M->Determinant()) > MYEPSILON) {
     177    Log() << Verbose(1) << "Determinant of coefficient matrix is NOT zero." << endl;
     178    throw LinearDependenceException(__FILE__,__LINE__);
     179  }
     180
     181  Log() << Verbose(1) << "INFO: Line1a = " << Line1a << ", Line1b = " << Line1b << ", Line2a = " << Line2a << ", Line2b = " << Line2b << "." << endl;
     182
     183
     184  // constuct a,b,c
     185  Vector a = Line1b - Line1a;
     186  Vector b = Line2b - Line2a;
     187  Vector c = Line2a - Line1a;
     188  Vector d = Line2b - Line1b;
     189  Log() << Verbose(1) << "INFO: a = " << a << ", b = " << b << ", c = " << c << "." << endl;
     190  if ((a.NormSquared() < MYEPSILON) || (b.NormSquared() < MYEPSILON)) {
     191   res.Zero();
     192   Log() << Verbose(1) << "At least one of the lines is ill-defined, i.e. offset equals second vector." << endl;
     193   throw LinearDependenceException(__FILE__,__LINE__);
     194  }
     195
     196  // check for parallelity
     197  Vector parallel;
     198  double factor = 0.;
     199  if (fabs(a.ScalarProduct(b)*a.ScalarProduct(b)/a.NormSquared()/b.NormSquared() - 1.) < MYEPSILON) {
     200    parallel = Line1a - Line2a;
     201    factor = parallel.ScalarProduct(a)/a.Norm();
     202    if ((factor >= -MYEPSILON) && (factor - 1. < MYEPSILON)) {
     203      res = Line2a;
     204      Log() << Verbose(1) << "Lines conincide." << endl;
     205      return res;
     206    } else {
     207      parallel = Line1a - Line2b;
     208      factor = parallel.ScalarProduct(a)/a.Norm();
     209      if ((factor >= -MYEPSILON) && (factor - 1. < MYEPSILON)) {
     210        res = Line2b;
     211        Log() << Verbose(1) << "Lines conincide." << endl;
     212        return res;
     213      }
     214    }
     215    Log() << Verbose(1) << "Lines are parallel." << endl;
     216    res.Zero();
     217    throw LinearDependenceException(__FILE__,__LINE__);
     218  }
     219
     220  // obtain s
     221  double s;
     222  Vector temp1, temp2;
     223  temp1 = c;
     224  temp1.VectorProduct(b);
     225  temp2 = a;
     226  temp2.VectorProduct(b);
     227  Log() << Verbose(1) << "INFO: temp1 = " << temp1 << ", temp2 = " << temp2 << "." << endl;
     228  if (fabs(temp2.NormSquared()) > MYEPSILON)
     229    s = temp1.ScalarProduct(temp2)/temp2.NormSquared();
     230  else
     231    s = 0.;
     232  Log() << Verbose(1) << "Factor s is " << temp1.ScalarProduct(temp2) << "/" << temp2.NormSquared() << " = " << s << "." << endl;
     233
     234  // construct intersection
     235  res = a;
     236  res.Scale(s);
     237  res += Line1a;
     238  Log() << Verbose(1) << "Intersection is at " << res << "." << endl;
     239
     240  return res;
     241};
  • src/vector_ops.hpp

    ra7c344 rb32dbb  
    1010
    1111bool LSQdistance(Vector &res,const Vector **vectors, int num);
     12Vector RotateVector(const Vector &vec,const Vector &axis, const double alpha);
     13Vector GetIntersectionOfTwoLinesOnPlane(const Vector &Line1a, const Vector &Line1b, const Vector &Line2a, const Vector &Line2b);
    1214
    1315#endif /* VECTOR_OPS_HPP_ */
Note: See TracChangeset for help on using the changeset viewer.