- Timestamp:
- Jun 4, 2010, 9:28:46 AM (15 years ago)
- Branches:
- Action_Thermostats, Add_AtomRandomPerturbation, Add_FitFragmentPartialChargesAction, Add_RotateAroundBondAction, Add_SelectAtomByNameAction, Added_ParseSaveFragmentResults, AddingActions_SaveParseParticleParameters, Adding_Graph_to_ChangeBondActions, Adding_MD_integration_tests, Adding_ParticleName_to_Atom, Adding_StructOpt_integration_tests, AtomFragments, Automaking_mpqc_open, AutomationFragmentation_failures, Candidate_v1.5.4, Candidate_v1.6.0, Candidate_v1.6.1, ChangeBugEmailaddress, ChangingTestPorts, ChemicalSpaceEvaluator, CombiningParticlePotentialParsing, Combining_Subpackages, Debian_Package_split, Debian_package_split_molecuildergui_only, Disabling_MemDebug, Docu_Python_wait, EmpiricalPotential_contain_HomologyGraph, EmpiricalPotential_contain_HomologyGraph_documentation, Enable_parallel_make_install, Enhance_userguide, Enhanced_StructuralOptimization, Enhanced_StructuralOptimization_continued, Example_ManyWaysToTranslateAtom, Exclude_Hydrogens_annealWithBondGraph, FitPartialCharges_GlobalError, Fix_BoundInBox_CenterInBox_MoleculeActions, Fix_ChargeSampling_PBC, Fix_ChronosMutex, Fix_FitPartialCharges, Fix_FitPotential_needs_atomicnumbers, Fix_ForceAnnealing, Fix_IndependentFragmentGrids, Fix_ParseParticles, Fix_ParseParticles_split_forward_backward_Actions, Fix_PopActions, Fix_QtFragmentList_sorted_selection, Fix_Restrictedkeyset_FragmentMolecule, Fix_StatusMsg, Fix_StepWorldTime_single_argument, Fix_Verbose_Codepatterns, Fix_fitting_potentials, Fixes, ForceAnnealing_goodresults, ForceAnnealing_oldresults, ForceAnnealing_tocheck, ForceAnnealing_with_BondGraph, ForceAnnealing_with_BondGraph_continued, ForceAnnealing_with_BondGraph_continued_betteresults, ForceAnnealing_with_BondGraph_contraction-expansion, FragmentAction_writes_AtomFragments, FragmentMolecule_checks_bonddegrees, GeometryObjects, Gui_Fixes, Gui_displays_atomic_force_velocity, ImplicitCharges, IndependentFragmentGrids, IndependentFragmentGrids_IndividualZeroInstances, IndependentFragmentGrids_IntegrationTest, IndependentFragmentGrids_Sole_NN_Calculation, JobMarket_RobustOnKillsSegFaults, JobMarket_StableWorkerPool, JobMarket_unresolvable_hostname_fix, MoreRobust_FragmentAutomation, ODR_violation_mpqc_open, PartialCharges_OrthogonalSummation, PdbParser_setsAtomName, PythonUI_with_named_parameters, QtGui_reactivate_TimeChanged_changes, Recreated_GuiChecks, Rewrite_FitPartialCharges, RotateToPrincipalAxisSystem_UndoRedo, SaturateAtoms_findBestMatching, SaturateAtoms_singleDegree, StoppableMakroAction, Subpackage_CodePatterns, Subpackage_JobMarket, Subpackage_LinearAlgebra, Subpackage_levmar, Subpackage_mpqc_open, Subpackage_vmg, Switchable_LogView, ThirdParty_MPQC_rebuilt_buildsystem, TrajectoryDependenant_MaxOrder, TremoloParser_IncreasedPrecision, TremoloParser_MultipleTimesteps, TremoloParser_setsAtomName, Ubuntu_1604_changes, stable
- Children:
- 2c8934
- Parents:
- e05826 (diff), 27ac00 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- src
- Files:
-
- 5 added
- 21 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Legacy/oldmenu.cpp
re05826 r76c0d6 26 26 #include "vector_ops.hpp" 27 27 #include "Plane.hpp" 28 #include "Line.hpp" 28 29 29 30 #include "UIElements/UIFactory.hpp" … … 185 186 // rotate vector around first angle 186 187 first->x = x; 187 first->x = RotateVector(first->x,z,b - M_PI);188 first->x = Line(zeroVec,z).rotateVector(first->x,b - M_PI); 188 189 Log() << Verbose(0) << "Rotated vector: " << first->x << endl, 189 190 // remove the projection onto the rotation plane of the second angle … … 201 202 // rotate another vector around second angle 202 203 n = y; 203 n = RotateVector(n,x,c - M_PI);204 n = Line(zeroVec,x).rotateVector(n,c - M_PI); 204 205 Log() << Verbose(0) << "2nd Rotated vector: " << n << endl; 205 206 -
src/Line.cpp
re05826 r76c0d6 11 11 12 12 #include "vector.hpp" 13 14 Line::Line(Vector &_origin, Vector &_direction) : 15 origin(new Vector(_origin)), 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 21 using namespace std; 22 23 Line::Line(const Vector &_origin, const Vector &_direction) : 16 24 direction(new Vector(_direction)) 17 25 { 18 26 direction->Normalize(); 19 } 27 origin.reset(new Vector(_origin.partition(*direction).second)); 28 } 29 30 Line::Line(const Line &src) : 31 origin(new Vector(*src.origin)), 32 direction(new Vector(*src.direction)) 33 {} 20 34 21 35 Line::~Line() … … 24 38 25 39 double Line::distance(const Vector &point) const{ 26 return fabs(point.ScalarProduct(*direction) - origin->ScalarProduct(*direction)); 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(); 27 45 } 28 46 29 47 Vector Line::getClosestPoint(const Vector &point) const{ 30 double factor = point.ScalarProduct(*direction) - origin->ScalarProduct(*direction); 31 return (point - (factor * (*direction))); 32 } 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; 53 } 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
re05826 r76c0d6 12 12 13 13 #include <memory> 14 #include <vector> 14 15 15 16 class Vector; 17 class Plane; 16 18 17 19 class Line : public Space 18 20 { 19 21 public: 20 Line(Vector &_origin, Vector &_direction); 22 Line(const Vector &_origin, const Vector &_direction); 23 Line(const Line& _src); 21 24 virtual ~Line(); 22 25 23 virtual double distance(const Vector &point) const=0; 24 virtual Vector getClosestPoint(const Vector &point) const=0; 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; 25 39 26 40 private: … … 29 43 }; 30 44 45 /** 46 * Named constructor to make a line through two points 47 */ 48 Line makeLineThrough(const Vector &x1, const Vector &x2); 49 31 50 #endif /* LINE_HPP_ */ -
src/Makefile.am
re05826 r76c0d6 125 125 126 126 EXCEPTIONSOURCE = Exceptions/CustomException.cpp \ 127 Exceptions/LinearDependenceException.cpp \ 128 Exceptions/MathException.cpp \ 129 Exceptions/ZeroVectorException.cpp 127 Exceptions/LinearDependenceException.cpp \ 128 Exceptions/MathException.cpp \ 129 Exceptions/SkewException.cpp \ 130 Exceptions/ZeroVectorException.cpp 130 131 131 132 EXCEPTIONHEADER = Exceptions/CustomException.hpp \ 132 Exceptions/LinearDependenceException.hpp \ 133 Exceptions/MathException.hpp \ 134 Exceptions/ZeroVectorException.hpp 133 Exceptions/LinearDependenceException.hpp \ 134 Exceptions/MathException.hpp \ 135 Exceptions/SkewException.hpp \ 136 Exceptions/ZeroVectorException.hpp 135 137 136 138 SOURCE = \ -
src/Plane.cpp
re05826 r76c0d6 14 14 #include "Helpers/Assert.hpp" 15 15 #include <cmath> 16 #include "Line.hpp" 17 #include "Exceptions/MultipleSolutionsException.hpp" 16 18 17 19 /** … … 42 44 /** 43 45 * Constructs a plane from two direction vectors and a offset. 44 * If no offset is given a plane through origin is assumed45 46 */ 46 47 Plane::Plane(const Vector &y1, const Vector &y2, double _offset) throw(ZeroVectorException,LinearDependenceException) : … … 113 114 } 114 115 115 Vector Plane::getOffsetVector() {116 Vector Plane::getOffsetVector() const { 116 117 return getOffset()*getNormal(); 117 118 } 118 119 119 vector<Vector> Plane::getPointsOnPlane() {120 vector<Vector> Plane::getPointsOnPlane() const{ 120 121 std::vector<Vector> res; 121 122 res.reserve(3); … … 147 148 * \return true - \a this contains intersection point on return, false - line is parallel to plane (even if in-plane) 148 149 */ 149 Vector Plane::GetIntersection(const Vector &Origin, const Vector &LineVector)150 Vector Plane::GetIntersection(const Line& line) const 150 151 { 151 152 Info FunctionInfo(__func__); 152 153 Vector res; 153 154 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 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()); 172 168 double scaleFactor = (offset-factor2)/factor1; 173 169 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."); 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."); 182 175 return res; 183 176 }; 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 } 184 187 185 188 /************ Methods inherited from Space ****************/ -
src/Plane.hpp
re05826 r76c0d6 17 17 18 18 class Vector; 19 class Line; 19 20 20 21 class Plane : public Space … … 42 43 * Same as getOffset()*getNormal(); 43 44 */ 44 Vector getOffsetVector() ;45 Vector getOffsetVector() const; 45 46 46 47 /** 47 48 * returns three seperate points on this plane 48 49 */ 49 std::vector<Vector> getPointsOnPlane() ;50 std::vector<Vector> getPointsOnPlane() const; 50 51 51 52 // some calculations 52 Vector GetIntersection(const Vector &Origin, const Vector &LineVector); 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; 53 64 54 65 /****** Methods inherited from Space ***********/ -
src/Space.cpp
re05826 r76c0d6 19 19 } 20 20 21 Vector Space::getVectorToPoint(const Vector &origin) const{ 22 Vector support = getClosestPoint(origin); 23 return support-origin; 24 } 25 21 26 bool Space::isContained(const Vector &point) const{ 22 27 return (distance(point)) < MYEPSILON; -
src/Space.hpp
re05826 r76c0d6 17 17 virtual ~Space(); 18 18 19 /** 20 * Calculates the distance between a Space and a Vector. 21 */ 19 22 virtual double distance(const Vector &point) const=0; 23 24 /** 25 * get the closest point inside the space to another point 26 */ 20 27 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 */ 21 43 virtual bool isContained(const Vector &point) const; 44 45 /** 46 * Tests if this space contains the center of the coordinate system. 47 */ 22 48 virtual bool hasZero() const; 23 49 -
src/atom.cpp
re05826 r76c0d6 67 67 atom *atom::GetTrueFather() 68 68 { 69 atom *walker = this; 70 do { 71 if (walker == walker->father) // top most father is the one that points on itself 72 break; 73 walker = walker->father; 74 } while (walker != NULL); 75 return walker; 69 if(father == this){ // top most father is the one that points on itself 70 return this; 71 } 72 else if(!father) { 73 return 0; 74 } 75 else { 76 return father->GetTrueFather(); 77 } 76 78 }; 77 79 -
src/molecule_geometry.cpp
re05826 r76c0d6 16 16 #include "molecule.hpp" 17 17 #include "World.hpp" 18 #include "Plane.hpp" 19 #include <boost/foreach.hpp> 20 18 21 19 22 /************************************* Functions for class molecule *********************************/ … … 256 259 void molecule::Mirror(const Vector *n) 257 260 { 258 ActOnAllVectors( &Vector::Mirror, *n ); 261 OBSERVE; 262 Plane p(*n,0); 263 BOOST_FOREACH( atom* iter, atoms ){ 264 (*iter->node) = p.mirrorVector(*iter->node); 265 } 259 266 }; 260 267 -
src/tesselation.cpp
re05826 r76c0d6 17 17 #include "triangleintersectionlist.hpp" 18 18 #include "vector.hpp" 19 #include "Line.hpp" 19 20 #include "vector_ops.hpp" 20 21 #include "verbose.hpp" … … 441 442 442 443 try { 443 *Intersection = Plane(NormalVector, *(endpoints[0]->node->node)).GetIntersection(*MolCenter, *x); 444 } 445 catch (LinearDependenceException &excp) { 446 Log() << Verbose(1) << excp; 447 DoeLog(1) && (eLog() << Verbose(1) << "Alas! Intersection with plane failed - at least numerically - the intersection is not on the plane!" << endl); 448 return false; 449 } 450 451 DoLog(1) && (Log() << Verbose(1) << "INFO: Triangle is " << *this << "." << endl); 452 DoLog(1) && (Log() << Verbose(1) << "INFO: Line is from " << *MolCenter << " to " << *x << "." << endl); 453 DoLog(1) && (Log() << Verbose(1) << "INFO: Intersection is " << *Intersection << "." << endl); 454 455 if (Intersection->DistanceSquared(*endpoints[0]->node->node) < MYEPSILON) { 456 DoLog(1) && (Log() << Verbose(1) << "Intersection coindices with first endpoint." << endl); 457 return true; 458 } else if (Intersection->DistanceSquared(*endpoints[1]->node->node) < MYEPSILON) { 459 DoLog(1) && (Log() << Verbose(1) << "Intersection coindices with second endpoint." << endl); 460 return true; 461 } else if (Intersection->DistanceSquared(*endpoints[2]->node->node) < MYEPSILON) { 462 DoLog(1) && (Log() << Verbose(1) << "Intersection coindices with third endpoint." << endl); 463 return true; 464 } 465 // Calculate cross point between one baseline and the line from the third endpoint to intersection 466 int i = 0; 467 do { 468 try { 469 CrossPoint = GetIntersectionOfTwoLinesOnPlane(*(endpoints[i%3]->node->node), 470 *(endpoints[(i+1)%3]->node->node), 471 *(endpoints[(i+2)%3]->node->node), 472 *Intersection); 444 Line centerLine = makeLineThrough(*MolCenter, *x); 445 *Intersection = Plane(NormalVector, *(endpoints[0]->node->node)).GetIntersection(centerLine); 446 447 DoLog(1) && (Log() << Verbose(1) << "INFO: Triangle is " << *this << "." << endl); 448 DoLog(1) && (Log() << Verbose(1) << "INFO: Line is from " << *MolCenter << " to " << *x << "." << endl); 449 DoLog(1) && (Log() << Verbose(1) << "INFO: Intersection is " << *Intersection << "." << endl); 450 451 if (Intersection->DistanceSquared(*endpoints[0]->node->node) < MYEPSILON) { 452 DoLog(1) && (Log() << Verbose(1) << "Intersection coindices with first endpoint." << endl); 453 return true; 454 } else if (Intersection->DistanceSquared(*endpoints[1]->node->node) < MYEPSILON) { 455 DoLog(1) && (Log() << Verbose(1) << "Intersection coindices with second endpoint." << endl); 456 return true; 457 } else if (Intersection->DistanceSquared(*endpoints[2]->node->node) < MYEPSILON) { 458 DoLog(1) && (Log() << Verbose(1) << "Intersection coindices with third endpoint." << endl); 459 return true; 460 } 461 // Calculate cross point between one baseline and the line from the third endpoint to intersection 462 int i = 0; 463 do { 464 Line line1 = makeLineThrough(*(endpoints[i%3]->node->node),*(endpoints[(i+1)%3]->node->node)); 465 Line line2 = makeLineThrough(*(endpoints[(i+2)%3]->node->node),*Intersection); 466 CrossPoint = line1.getIntersection(line2); 473 467 helper = (*endpoints[(i+1)%3]->node->node) - (*endpoints[i%3]->node->node); 474 468 CrossPoint -= (*endpoints[i%3]->node->node); // cross point was returned as absolute vector … … 477 471 if ((s < -MYEPSILON) || ((s-1.) > MYEPSILON)) { 478 472 DoLog(1) && (Log() << Verbose(1) << "INFO: Crosspoint " << CrossPoint << "outside of triangle." << endl); 479 i=4; 480 break; 473 return false; 481 474 } 482 475 i++; 483 } catch (LinearDependenceException &excp){ 484 break; 485 } 486 } while (i < 3); 487 if (i == 3) { 476 } while (i < 3); 488 477 DoLog(1) && (Log() << Verbose(1) << "INFO: Crosspoint " << CrossPoint << " inside of triangle." << endl); 489 478 return true; 490 } else { 491 DoLog(1) && (Log() << Verbose(1) << "INFO: Crosspoint " << CrossPoint << " outside of triangle." << endl); 479 } 480 catch (MathException &excp) { 481 Log() << Verbose(1) << excp; 482 DoeLog(1) && (eLog() << Verbose(1) << "Alas! Intersection with plane failed - at least numerically - the intersection is not on the plane!" << endl); 492 483 return false; 493 484 } … … 516 507 GetCenter(&Direction); 517 508 try { 518 *ClosestPoint = Plane(NormalVector, *(endpoints[0]->node->node)).GetIntersection(*x, Direction); 519 } 520 catch (LinearDependenceException &excp) { 509 Line l = makeLineThrough(*x, Direction); 510 *ClosestPoint = Plane(NormalVector, *(endpoints[0]->node->node)).GetIntersection(l); 511 } 512 catch (MathException &excp) { 521 513 (*ClosestPoint) = (*x); 522 514 } … … 541 533 Direction = (*endpoints[(i+1)%3]->node->node) - (*endpoints[i%3]->node->node); 542 534 // calculate intersection, line can never be parallel to Direction (is the same vector as PlaneNormal); 543 CrossPoint[i] = Plane(Direction, InPlane).GetIntersection(*(endpoints[i%3]->node->node), *(endpoints[(i+1)%3]->node->node)); 535 Line l = makeLineThrough(*(endpoints[i%3]->node->node), *(endpoints[(i+1)%3]->node->node)); 536 CrossPoint[i] = Plane(Direction, InPlane).GetIntersection(l); 544 537 CrossDirection[i] = CrossPoint[i] - InPlane; 545 538 CrossPoint[i] -= (*endpoints[i%3]->node->node); // cross point was returned as absolute vector -
src/tesselationhelpers.cpp
re05826 r76c0d6 14 14 #include "tesselationhelpers.hpp" 15 15 #include "vector.hpp" 16 #include "Line.hpp" 16 17 #include "vector_ops.hpp" 17 18 #include "verbose.hpp" … … 666 667 // calculate the intersection between this projected baseline and Base 667 668 Vector *Intersection = new Vector; 668 *Intersection = GetIntersectionOfTwoLinesOnPlane(*(Base->endpoints[0]->node->node),669 *(Base->endpoints[1]->node->node),670 NewOffset, NewDirection);669 Line line1 = makeLineThrough(*(Base->endpoints[0]->node->node),*(Base->endpoints[1]->node->node)); 670 Line line2 = makeLineThrough(NewOffset, NewDirection); 671 *Intersection = line1.getIntersection(line2); 671 672 Normal = (*Intersection) - (*Base->endpoints[0]->node->node); 672 673 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
re05826 r76c0d6 26 26 InfoUnitTest \ 27 27 LinearSystemOfEquationsUnitTest \ 28 LineUnittest \ 28 29 LinkedCellUnitTest \ 29 30 ListOfBondsUnitTest \ … … 69 70 infounittest.cpp \ 70 71 linearsystemofequationsunittest.cpp \ 72 LineUnittest.cpp \ 71 73 LinkedCellUnitTest.cpp \ 72 74 listofbondsunittest.cpp \ … … 104 106 infounittest.hpp \ 105 107 linearsystemofequationsunittest.hpp \ 108 LineUnittest.hpp \ 106 109 LinkedCellUnitTest.hpp \ 107 110 listofbondsunittest.hpp \ … … 170 173 LinearSystemOfEquationsUnitTest_LDADD = ${ALLLIBS} 171 174 175 LineUnittest_SOURCES = UnitTestMain.cpp LineUnittest.cpp LineUnittest.hpp 176 LineUnittest_LDADD = ${ALLLIBS} 177 172 178 LinkedCellUnitTest_SOURCES = UnitTestMain.cpp LinkedCellUnitTest.cpp LinkedCellUnitTest.hpp 173 179 LinkedCellUnitTest_LDADD = ${ALLLIBS} -
src/unittests/PlaneUnittest.cpp
re05826 r76c0d6 17 17 18 18 #include "vector.hpp" 19 #include "Line.hpp" 19 20 20 21 CPPUNIT_TEST_SUITE_REGISTRATION( PlaneUnittest ); … … 153 154 CPPUNIT_ASSERT(fabs(p4->distance(e1)-1) < MYEPSILON); 154 155 CPPUNIT_ASSERT_EQUAL(zeroVec,p4->getClosestPoint(e1)); 155 156 157 } 156 } 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
re05826 r76c0d6 20 20 CPPUNIT_TEST ( pointsTest ); 21 21 CPPUNIT_TEST ( operationsTest ); 22 CPPUNIT_TEST ( mirrorTest ); 23 CPPUNIT_TEST ( LineIntersectionTest ); 22 24 CPPUNIT_TEST_SUITE_END(); 23 25 … … 30 32 void pointsTest(); 31 33 void operationsTest(); 34 void mirrorTest(); 35 void LineIntersectionTest(); 32 36 33 37 private: -
src/unittests/vectorunittest.cpp
re05826 r76c0d6 215 215 } 216 216 217 /** UnitTest for line intersections.218 */219 void VectorTest::LineIntersectionTest()220 {221 // plane at (0,0,0) normal to (1,0,0) cuts line from (0,0,0) to (2,1,0) at ???222 CPPUNIT_ASSERT_NO_THROW(fixture = Plane(unit, zero).GetIntersection(zero, two) );223 CPPUNIT_ASSERT_EQUAL( zero, fixture );224 225 // plane at (2,1,0) normal to (0,1,0) cuts line from (1,0,0) to (0,1,1) at ???226 CPPUNIT_ASSERT_NO_THROW(fixture = Plane(otherunit, two).GetIntersection( unit, notunit) );227 CPPUNIT_ASSERT_EQUAL( Vector(0., 1., 1.), fixture );228 229 // four vectors equal to zero230 CPPUNIT_ASSERT_THROW(fixture = GetIntersectionOfTwoLinesOnPlane(zero, zero, zero, zero), LinearDependenceException);231 //CPPUNIT_ASSERT_EQUAL( zero, fixture );232 233 // four vectors equal to unit234 CPPUNIT_ASSERT_THROW(fixture = GetIntersectionOfTwoLinesOnPlane(unit, unit, unit, unit), LinearDependenceException);235 //CPPUNIT_ASSERT_EQUAL( zero, fixture );236 237 // two equal lines238 CPPUNIT_ASSERT_NO_THROW(fixture = GetIntersectionOfTwoLinesOnPlane(unit, two, unit, two));239 CPPUNIT_ASSERT_EQUAL( unit, fixture );240 241 // line from (1,0,0) to (2,1,0) cuts line from (1,0,0) to (0,1,0) at ???242 CPPUNIT_ASSERT_NO_THROW( fixture = GetIntersectionOfTwoLinesOnPlane(unit, two, unit, otherunit) );243 CPPUNIT_ASSERT_EQUAL( unit, fixture );244 245 // line from (1,0,0) to (0,0,0) cuts line from (0,0,0) to (2,1,0) at ???246 CPPUNIT_ASSERT_NO_THROW( fixture = GetIntersectionOfTwoLinesOnPlane(unit, zero, zero, two) );247 CPPUNIT_ASSERT_EQUAL( zero, fixture );248 249 // line from (1,0,0) to (2,1,0) cuts line from (0,0,0) to (0,1,0) at ???250 CPPUNIT_ASSERT_NO_THROW(fixture = GetIntersectionOfTwoLinesOnPlane(unit, two, zero, otherunit) );251 CPPUNIT_ASSERT_EQUAL( Vector(0., -1., 0.), fixture );252 };253 254 /** UnitTest for vector rotations.255 */256 void VectorTest::VectorRotationTest()257 {258 fixture = Vector(-1.,0.,0.);259 260 // zero vector does not change261 fixture = RotateVector(zero,unit, 1.);262 CPPUNIT_ASSERT_EQUAL( zero, fixture );263 264 fixture = RotateVector(zero, two, 1.);265 CPPUNIT_ASSERT_EQUAL( zero, fixture);266 267 // vector on axis does not change268 fixture = RotateVector(unit,unit, 1.);269 CPPUNIT_ASSERT_EQUAL( unit, fixture );270 271 // rotations272 fixture = RotateVector(otherunit, unit, M_PI);273 CPPUNIT_ASSERT_EQUAL( Vector(0.,-1.,0.), fixture );274 275 fixture = RotateVector(otherunit, unit, 2. * M_PI);276 CPPUNIT_ASSERT_EQUAL( otherunit, fixture );277 278 fixture = RotateVector(otherunit,unit, 0);279 CPPUNIT_ASSERT_EQUAL( otherunit, fixture );280 281 fixture = RotateVector(Vector(0.,0.,1.), notunit, M_PI);282 CPPUNIT_ASSERT_EQUAL( otherunit, fixture );283 }284 217 285 218 /** -
src/unittests/vectorunittest.hpp
re05826 r76c0d6 27 27 CPPUNIT_TEST ( ProjectionTest ); 28 28 CPPUNIT_TEST ( NormalsTest ); 29 CPPUNIT_TEST ( LineIntersectionTest );30 CPPUNIT_TEST ( VectorRotationTest );31 29 CPPUNIT_TEST ( IsInParallelepipedTest ); 32 30 CPPUNIT_TEST_SUITE_END(); -
src/vector.cpp
re05826 r76c0d6 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 debugging237 * \param *PlaneNormal normal of plane238 * \param *PlaneOffset offset of plane239 * \return distance to plane240 * \return distance vector onto to plane241 */242 Vector Vector::GetDistanceVectorToPlane(const Vector &PlaneNormal, const Vector &PlaneOffset) const243 {244 Vector temp = (*this) - PlaneOffset;245 temp.MakeNormalTo(PlaneNormal);246 temp.Scale(-1.);247 // then add connecting vector from plane to point248 temp += (*this)-PlaneOffset;249 double sign = temp.ScalarProduct(PlaneNormal);250 if (fabs(sign) > MYEPSILON)251 sign /= fabs(sign);252 else253 sign = 0.;254 255 temp.Normalize();256 temp.Scale(sign);257 return temp;258 };259 260 234 261 235 /** Calculates the minimum distance of this vector to the plane. … … 551 525 MatrixMultiplication(M); 552 526 }; 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 } 553 544 554 545 /** Do a matrix multiplication. … … 611 602 }; 612 603 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 one621 for (int i=NDIM;i--;)622 at(i) -= 2.*projection*n[i];623 };624 625 604 /** Calculates orthonormal vector to one given vectors. 626 605 * Just subtracts the projection onto the given vector from this vector. … … 633 612 bool result = false; 634 613 double factor = y1.ScalarProduct(*this)/y1.NormSquared(); 635 Vector x1; 636 x1 = factor * y1; 614 Vector x1 = factor * y1; 637 615 SubtractVector(x1); 638 616 for (int i=NDIM;i--;) -
src/vector.hpp
re05826 r76c0d6 16 16 17 17 #include <memory> 18 #include <vector> 18 19 19 20 #include "defs.hpp" … … 21 22 22 23 /********************************************** declarations *******************************/ 24 25 class Vector; 26 27 typedef std::vector<Vector> pointset; 23 28 24 29 /** Single vector. … … 39 44 40 45 double DistanceSquared(const Vector &y) const; 41 Vector GetDistanceVectorToPlane(const Vector &PlaneNormal, const Vector &PlaneOffset) const;42 46 double DistanceToSpace(const Space& space) const; 43 47 double PeriodicDistance(const Vector &y, const double * const cell_size) const; … … 56 60 void ProjectIt(const Vector &y); 57 61 Vector Projection(const Vector &y) const; 58 void Mirror(const Vector &x);59 62 void ScaleAll(const double *factor); 60 63 void Scale(const double factor); … … 66 69 bool IsInParallelepiped(const Vector &offset, const double * const parallelepiped) const; 67 70 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; 68 73 69 74 // Accessors ussually come in pairs... and sometimes even more than that -
src/vector_ops.cpp
re05826 r76c0d6 15 15 #include "Helpers/fast_functions.hpp" 16 16 #include "Exceptions/LinearDependenceException.hpp" 17 #include "Exceptions/SkewException.hpp" 17 18 18 19 #include <gsl/gsl_linalg.h> … … 110 111 return true; 111 112 }; 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 axis115 * \param alpha rotation angle in radian116 */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 axis122 a = vec;123 a.ProjectOntoPlane(axis);124 // construct normal vector125 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 cosine135 y.Scale(sin(alpha));136 a.Scale(cos(alpha));137 res = vec.Projection(axis);138 // add scaled normal vector onto this vector139 res += y;140 // add part in axis direction141 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.html147 * \param *out output stream for debugging148 * \param *Line1a first vector of first line149 * \param *Line1b second vector of first line150 * \param *Line2a first vector of second line151 * \param *Line2b second vector of second line152 * \return true - \a this will contain the intersection on return, false - lines are parallel153 */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,c185 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 parallelity197 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 s221 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 else231 s = 0.;232 Log() << Verbose(1) << "Factor s is " << temp1.ScalarProduct(temp2) << "/" << temp2.NormSquared() << " = " << s << "." << endl;233 234 // construct intersection235 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
re05826 r76c0d6 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);14 12 15 13 #endif /* VECTOR_OPS_HPP_ */
Note:
See TracChangeset
for help on using the changeset viewer.