Changes in / [a7c344:b32dbb]
- Location:
- src
- Files:
-
- 5 deleted
- 24 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Legacy/oldmenu.cpp
ra7c344 rb32dbb 27 27 #include "vector_ops.hpp" 28 28 #include "Plane.hpp" 29 #include "Line.hpp"30 29 31 30 #include "UIElements/UIFactory.hpp" … … 186 185 // rotate vector around first angle 187 186 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); 189 188 Log() << Verbose(0) << "Rotated vector: " << first->x << endl, 190 189 // remove the projection onto the rotation plane of the second angle … … 202 201 // rotate another vector around second angle 203 202 n = y; 204 n = Line(zeroVec,x).rotateVector(n,c - M_PI);203 n = RotateVector(n,x,c - M_PI); 205 204 Log() << Verbose(0) << "2nd Rotated vector: " << n << endl; 206 205 -
src/Line.cpp
ra7c344 rb32dbb 11 11 12 12 #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"20 13 21 using namespace std; 22 23 Line::Line(const Vector &_origin, const Vector &_direction) : 14 Line::Line(Vector &_origin, Vector &_direction) : 15 origin(new Vector(_origin)), 24 16 direction(new Vector(_direction)) 25 17 { 26 18 direction->Normalize(); 27 origin.reset(new Vector(_origin.partition(*direction).second));28 19 } 29 30 Line::Line(const Line &src) :31 origin(new Vector(*src.origin)),32 direction(new Vector(*src.direction))33 {}34 20 35 21 Line::~Line() … … 38 24 39 25 double 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)); 45 27 } 46 28 47 29 Vector 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))); 53 32 } 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.html73 * \param *out output stream for debugging74 * \param *Line1a first vector of first line75 * \param *Line1b second vector of first line76 * \param *Line2a first vector of second line77 * \param *Line2b second vector of second line78 * \return true - \a this will contain the intersection on return, false - lines are parallel79 */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,c120 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 parallelity132 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 s156 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 else166 s = 0.;167 Log() << Verbose(1) << "Factor s is " << temp1.ScalarProduct(temp2) << "/" << temp2.NormSquared() << " = " << s << "." << endl;168 169 // construct intersection170 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 rotate180 * \param alpha rotation angle in radian181 */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 line189 pair<Vector,Vector> parts = helper.partition(*direction);190 191 // we just keep anything that is along the axis192 Vector res = parts.first;193 194 // the rest has to be rotated195 Vector a = parts.second;196 // we only have to do the rest, if we actually could partition the vector197 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 back207 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 12 12 13 13 #include <memory> 14 #include <vector>15 14 16 15 class Vector; 17 class Plane;18 16 19 17 class Line : public Space 20 18 { 21 19 public: 22 Line(const Vector &_origin, const Vector &_direction); 23 Line(const Line& _src); 20 Line(Vector &_origin, Vector &_direction); 24 21 virtual ~Line(); 25 22 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; 39 25 40 26 private: … … 43 29 }; 44 30 45 /**46 * Named constructor to make a line through two points47 */48 Line makeLineThrough(const Vector &x1, const Vector &x2);49 50 31 #endif /* LINE_HPP_ */ -
src/Makefile.am
ra7c344 rb32dbb 88 88 Exceptions/LinearDependenceException.cpp \ 89 89 Exceptions/MathException.cpp \ 90 Exceptions/SkewException.cpp \91 90 Exceptions/ZeroVectorException.cpp 92 91 … … 94 93 Exceptions/LinearDependenceException.hpp \ 95 94 Exceptions/MathException.hpp \ 96 Exceptions/SkewException.hpp \97 95 Exceptions/ZeroVectorException.hpp 98 96 -
src/Plane.cpp
ra7c344 rb32dbb 14 14 #include "Helpers/Assert.hpp" 15 15 #include <cmath> 16 #include "Line.hpp"17 #include "Exceptions/MultipleSolutionsException.hpp"18 16 19 17 /** … … 44 42 /** 45 43 * Constructs a plane from two direction vectors and a offset. 44 * If no offset is given a plane through origin is assumed 46 45 */ 47 46 Plane::Plane(const Vector &y1, const Vector &y2, double _offset) throw(ZeroVectorException,LinearDependenceException) : … … 114 113 } 115 114 116 Vector Plane::getOffsetVector() const{115 Vector Plane::getOffsetVector() { 117 116 return getOffset()*getNormal(); 118 117 } 119 118 120 vector<Vector> Plane::getPointsOnPlane() const{119 vector<Vector> Plane::getPointsOnPlane(){ 121 120 std::vector<Vector> res; 122 121 res.reserve(3); … … 148 147 * \return true - \a this contains intersection point on return, false - line is parallel to plane (even if in-plane) 149 148 */ 150 Vector Plane::GetIntersection(const Line& line) const149 Vector Plane::GetIntersection(const Vector &Origin, const Vector &LineVector) 151 150 { 152 151 Info FunctionInfo(__func__); 153 152 Vector res; 154 153 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 168 172 double scaleFactor = (offset-factor2)/factor1; 169 173 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."); 175 182 return res; 176 183 }; 177 178 Vector Plane::mirrorVector(const Vector &rhs) const {179 Vector helper = getVectorToPoint(rhs);180 // substract twice the Vector to the plane181 return rhs+2*helper;182 }183 184 Line Plane::getOrthogonalLine(const Vector &origin) const{185 return Line(origin,getNormal());186 }187 184 188 185 /************ Methods inherited from Space ****************/ -
src/Plane.hpp
ra7c344 rb32dbb 17 17 18 18 class Vector; 19 class Line;20 19 21 20 class Plane : public Space … … 43 42 * Same as getOffset()*getNormal(); 44 43 */ 45 Vector getOffsetVector() const;44 Vector getOffsetVector(); 46 45 47 46 /** 48 47 * returns three seperate points on this plane 49 48 */ 50 std::vector<Vector> getPointsOnPlane() const;49 std::vector<Vector> getPointsOnPlane(); 51 50 52 51 // 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); 64 53 65 54 /****** Methods inherited from Space ***********/ -
src/Space.cpp
ra7c344 rb32dbb 19 19 } 20 20 21 Vector Space::getVectorToPoint(const Vector &origin) const{22 Vector support = getClosestPoint(origin);23 return support-origin;24 }25 26 21 bool Space::isContained(const Vector &point) const{ 27 22 return (distance(point)) < MYEPSILON; -
src/Space.hpp
ra7c344 rb32dbb 17 17 virtual ~Space(); 18 18 19 /**20 * Calculates the distance between a Space and a Vector.21 */22 19 virtual double distance(const Vector &point) const=0; 23 24 /**25 * get the closest point inside the space to another point26 */27 20 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 space33 * 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 false41 * otherwise.42 */43 21 virtual bool isContained(const Vector &point) const; 44 45 /**46 * Tests if this space contains the center of the coordinate system.47 */48 22 virtual bool hasZero() const; 49 23 -
src/atom.cpp
ra7c344 rb32dbb 68 68 atom *atom::GetTrueFather() 69 69 { 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; 79 77 }; 80 78 -
src/boundary.cpp
ra7c344 rb32dbb 620 620 for (TriangleMap::iterator runner = TesselStruct->TrianglesOnBoundary.begin(); runner != TesselStruct->TrianglesOnBoundary.end(); runner++) 621 621 { // 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)); 627 627 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)); 630 632 const double h = x.Norm(); // distance of CoG to triangle 631 633 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 16 16 #include "molecule.hpp" 17 17 #include "World.hpp" 18 #include "Plane.hpp"19 18 20 19 /************************************* Functions for class molecule *********************************/ … … 252 251 void molecule::Mirror(const Vector *n) 253 252 { 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 ); 262 254 }; 263 255 -
src/periodentafel.cpp
ra7c344 rb32dbb 212 212 213 213 // 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)); 215 217 infile.open(filename); 216 218 if (infile != NULL) { … … 256 258 257 259 // 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)); 259 263 infile.open(filename); 260 264 if (infile != NULL) { … … 273 277 274 278 // 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)); 276 282 infile.open(filename); 277 283 if (infile != NULL) { … … 290 296 291 297 // 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)); 293 301 infile.open(filename); 294 302 if (infile != NULL) { … … 310 318 311 319 // 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)); 313 323 infile.open(filename); 314 324 if (infile != NULL) { … … 353 363 char filename[MAXSTRINGSIZE]; 354 364 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)); 356 368 f.open(filename); 357 369 if (f != NULL) { -
src/tesselation.cpp
ra7c344 rb32dbb 17 17 #include "triangleintersectionlist.hpp" 18 18 #include "vector.hpp" 19 #include "Line.hpp"20 19 #include "vector_ops.hpp" 21 20 #include "verbose.hpp" … … 470 469 471 470 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); 495 501 helper = (*endpoints[(i+1)%3]->node->node) - (*endpoints[i%3]->node->node); 496 502 CrossPoint -= (*endpoints[i%3]->node->node); // cross point was returned as absolute vector … … 499 505 if ((s < -MYEPSILON) || ((s-1.) > MYEPSILON)) { 500 506 DoLog(1) && (Log() << Verbose(1) << "INFO: Crosspoint " << CrossPoint << "outside of triangle." << endl); 501 return false; 507 i=4; 508 break; 502 509 } 503 510 i++; 504 } while (i < 3); 511 } catch (LinearDependenceException &excp){ 512 break; 513 } 514 } while (i < 3); 515 if (i == 3) { 505 516 DoLog(1) && (Log() << Verbose(1) << "INFO: Crosspoint " << CrossPoint << " inside of triangle." << endl); 506 517 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); 511 520 return false; 512 521 } … … 535 544 GetCenter(&Direction); 536 545 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) { 541 549 (*ClosestPoint) = (*x); 542 550 } … … 561 569 Direction = (*endpoints[(i+1)%3]->node->node) - (*endpoints[i%3]->node->node); 562 570 // 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)); 565 572 CrossDirection[i] = CrossPoint[i] - InPlane; 566 573 CrossPoint[i] -= (*endpoints[i%3]->node->node); // cross point was returned as absolute vector … … 733 740 } 734 741 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 747 742 /** output operator for BoundaryTriangleSet. 748 743 * \param &ost output stream … … 751 746 ostream &operator <<(ostream &ost, const BoundaryTriangleSet &a) 752 747 { 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() << "]"; 754 749 // ost << "[" << a.Nr << "|" << a.endpoints[0]->node->Name << " at " << *a.endpoints[0]->node->node << "," 755 750 // << a.endpoints[1]->node->Name << " at " << *a.endpoints[1]->node->node << "," << a.endpoints[2]->node->Name << " at " << *a.endpoints[2]->node->node << "]"; … … 1519 1514 CenterVector.Zero(); 1520 1515 for (int i = 0; i < 3; i++) 1521 CenterVector += BTS->getEndpoint(i);1516 CenterVector += (*BTS->endpoints[i]->node->node); 1522 1517 CenterVector.Scale(1. / 3.); 1523 1518 DoLog(2) && (Log() << Verbose(2) << "CenterVector of base triangle is " << CenterVector << endl); … … 4873 4868 if (LastTriangle != NULL) { 4874 4869 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(); 4876 4871 NumberName = sstr.str(); 4877 4872 if (DoTecplotOutput) { -
src/tesselation.hpp
ra7c344 rb32dbb 171 171 172 172 Plane getPlane() const; 173 Vector getEndpoint(int) const;174 std::string getEndpointName(int) const;175 173 176 174 class BoundaryPointSet *endpoints[3]; … … 179 177 Vector SphereCenter; 180 178 int Nr; 181 182 private:183 184 179 }; 185 180 -
src/tesselationhelpers.cpp
ra7c344 rb32dbb 15 15 #include "tesselationhelpers.hpp" 16 16 #include "vector.hpp" 17 #include "Line.hpp"18 17 #include "vector_ops.hpp" 19 18 #include "verbose.hpp" … … 725 724 // calculate the intersection between this projected baseline and Base 726 725 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); 730 729 Normal = (*Intersection) - (*Base->endpoints[0]->node->node); 731 730 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 23 23 InfoUnitTest \ 24 24 LinearSystemOfEquationsUnitTest \ 25 LineUnittest \26 25 LinkedCellUnitTest \ 27 26 ListOfBondsUnitTest \ … … 65 64 infounittest.cpp \ 66 65 linearsystemofequationsunittest.cpp \ 67 LineUnittest.cpp \68 66 LinkedCellUnitTest.cpp \ 69 67 listofbondsunittest.cpp \ … … 99 97 infounittest.hpp \ 100 98 linearsystemofequationsunittest.hpp \ 101 LineUnittest.hpp \102 99 LinkedCellUnitTest.hpp \ 103 100 listofbondsunittest.hpp \ … … 156 153 LinearSystemOfEquationsUnitTest_LDADD = ${ALLLIBS} 157 154 158 LineUnittest_SOURCES = UnitTestMain.cpp LineUnittest.cpp LineUnittest.hpp159 LineUnittest_LDADD = ${ALLLIBS}160 161 155 LinkedCellUnitTest_SOURCES = UnitTestMain.cpp LinkedCellUnitTest.cpp LinkedCellUnitTest.hpp 162 156 LinkedCellUnitTest_LDADD = ${ALLLIBS} -
src/unittests/PlaneUnittest.cpp
ra7c344 rb32dbb 17 17 18 18 #include "vector.hpp" 19 #include "Line.hpp"20 19 21 20 CPPUNIT_TEST_SUITE_REGISTRATION( PlaneUnittest ); … … 154 153 CPPUNIT_ASSERT(fabs(p4->distance(e1)-1) < MYEPSILON); 155 154 CPPUNIT_ASSERT_EQUAL(zeroVec,p4->getClosestPoint(e1)); 155 156 156 157 } 157 158 void PlaneUnittest::mirrorTest(){159 Vector fixture;160 161 // some Vectors that lie on the planes162 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 planes191 {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 20 20 CPPUNIT_TEST ( pointsTest ); 21 21 CPPUNIT_TEST ( operationsTest ); 22 CPPUNIT_TEST ( mirrorTest );23 CPPUNIT_TEST ( LineIntersectionTest );24 22 CPPUNIT_TEST_SUITE_END(); 25 23 … … 32 30 void pointsTest(); 33 31 void operationsTest(); 34 void mirrorTest();35 void LineIntersectionTest();36 32 37 33 private: -
src/unittests/vectorunittest.cpp
ra7c344 rb32dbb 216 216 } 217 217 218 /** UnitTest for line intersections. 219 */ 220 void 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 */ 257 void 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 } 218 285 219 286 /** -
src/unittests/vectorunittest.hpp
ra7c344 rb32dbb 27 27 CPPUNIT_TEST ( ProjectionTest ); 28 28 CPPUNIT_TEST ( NormalsTest ); 29 CPPUNIT_TEST ( LineIntersectionTest ); 30 CPPUNIT_TEST ( VectorRotationTest ); 29 31 CPPUNIT_TEST ( IsInParallelepipedTest ); 30 32 CPPUNIT_TEST_SUITE_END(); -
src/vector.cpp
ra7c344 rb32dbb 213 213 { 214 214 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]); 218 218 (*this) = tmp; 219 219 }; … … 232 232 *this -= tmp; 233 233 }; 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 */ 242 Vector 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 234 260 235 261 /** Calculates the minimum distance of this vector to the plane. … … 525 551 MatrixMultiplication(M); 526 552 }; 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 }544 553 545 554 /** Do a matrix multiplication. … … 602 611 }; 603 612 613 /** Mirrors atom against a given plane. 614 * \param n[] normal vector of mirror plane. 615 */ 616 void 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 604 625 /** Calculates orthonormal vector to one given vectors. 605 626 * Just subtracts the projection onto the given vector from this vector. … … 612 633 bool result = false; 613 634 double factor = y1.ScalarProduct(*this)/y1.NormSquared(); 614 Vector x1 = factor * y1; 635 Vector x1; 636 x1 = factor * y1; 615 637 SubtractVector(x1); 616 638 for (int i=NDIM;i--;) -
src/vector.hpp
ra7c344 rb32dbb 16 16 17 17 #include <memory> 18 #include <vector>19 18 20 19 #include "defs.hpp" … … 22 21 23 22 /********************************************** declarations *******************************/ 24 25 class Vector;26 27 typedef std::vector<Vector> pointset;28 23 29 24 /** Single vector. … … 44 39 45 40 double DistanceSquared(const Vector &y) const; 41 Vector GetDistanceVectorToPlane(const Vector &PlaneNormal, const Vector &PlaneOffset) const; 46 42 double DistanceToSpace(const Space& space) const; 47 43 double PeriodicDistance(const Vector &y, const double * const cell_size) const; … … 60 56 void ProjectIt(const Vector &y); 61 57 Vector Projection(const Vector &y) const; 58 void Mirror(const Vector &x); 62 59 void ScaleAll(const double *factor); 63 60 void Scale(const double factor); … … 69 66 bool IsInParallelepiped(const Vector &offset, const double * const parallelepiped) const; 70 67 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;73 68 74 69 // Accessors ussually come in pairs... and sometimes even more than that -
src/vector_ops.cpp
ra7c344 rb32dbb 15 15 #include "Helpers/fast_functions.hpp" 16 16 #include "Exceptions/LinearDependenceException.hpp" 17 #include "Exceptions/SkewException.hpp"18 17 19 18 #include <gsl/gsl_linalg.h> … … 111 110 return true; 112 111 }; 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 */ 117 Vector 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 */ 154 Vector 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 10 10 11 11 bool LSQdistance(Vector &res,const Vector **vectors, int num); 12 Vector RotateVector(const Vector &vec,const Vector &axis, const double alpha); 13 Vector GetIntersectionOfTwoLinesOnPlane(const Vector &Line1a, const Vector &Line1b, const Vector &Line2a, const Vector &Line2b); 12 14 13 15 #endif /* VECTOR_OPS_HPP_ */
Note:
See TracChangeset
for help on using the changeset viewer.