- Timestamp:
- Mar 28, 2012, 1:25:11 PM (13 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:
- b92e4a
- Parents:
- c27ce7
- git-author:
- Frederik Heber <heber@…> (03/15/12 13:16:21)
- git-committer:
- Frederik Heber <heber@…> (03/28/12 13:25:11)
- Location:
- src/Tesselation
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Tesselation/BoundaryTriangleSet.cpp
rc27ce7 r6a7fcbb 230 230 Vector Direction; 231 231 232 // 1. get intersection with plane 232 // 1. get intersection with plane and place in ClosestPoint 233 233 LOG(1, "INFO: Looking for closest point of triangle " << *this << " to " << x << "."); 234 GetCenter(Direction); 234 LOG(1, "INFO: endpoints are " << endpoints[0]->node->getPosition() << "," 235 << endpoints[1]->node->getPosition() << ", and " << endpoints[2]->node->getPosition() << "."); 235 236 try { 236 Line l = makeLineThrough(x, Direction); 237 ClosestPoint = Plane(NormalVector, (endpoints[0]->node->getPosition())).GetIntersection(l); 237 ClosestPoint = Plane(NormalVector, (endpoints[0]->node->getPosition())).getClosestPoint(x); 238 238 } 239 239 catch (LinearAlgebraException &excp) { 240 240 (ClosestPoint) = (x); 241 241 } 242 Vector InPlane(ClosestPoint); // points from plane intersection to straight-down point 242 243 243 244 // 2. Calculate in plane part of line (x, intersection) 244 Vector InPlane = (x) - (ClosestPoint); // points from plane intersection to straight-down point 245 InPlane.ProjectOntoPlane(NormalVector); 246 InPlane += ClosestPoint; 247 248 LOG(2, "INFO: Triangle is " << *this << "."); 249 LOG(2, "INFO: Line is from " << Direction << " to " << x << "."); 250 LOG(2, "INFO: In-plane part is " << InPlane << "."); 245 LOG(2, "INFO: Closest point on triangle plane is " << ClosestPoint << "."); 251 246 252 247 // Calculate cross point between one baseline and the desired point such that distance is shortest 253 double ShortestDistance = -1.;254 bool InsideFlag = false;255 248 Vector CrossDirection[3]; 256 249 Vector CrossPoint[3]; 257 Vector helper;258 250 for (int i = 0; i < 3; i++) { 259 // treat direction of line as normal of a (cut)plane and the desired point x as the plane offset, the intersect line with point 260 Direction = (endpoints[(i+1)%3]->node->getPosition()) - (endpoints[i%3]->node->getPosition()); 251 const Vector Direction = (endpoints[i%3]->node->getPosition()) - (endpoints[(i+1)%3]->node->getPosition()); 261 252 // calculate intersection, line can never be parallel to Direction (is the same vector as PlaneNormal); 262 253 Line l = makeLineThrough((endpoints[i%3]->node->getPosition()), (endpoints[(i+1)%3]->node->getPosition())); 263 CrossPoint[i] = Plane(Direction, InPlane).GetIntersection(l); 264 CrossDirection[i] = CrossPoint[i] - InPlane; 265 CrossPoint[i] -= (endpoints[i%3]->node->getPosition()); // cross point was returned as absolute vector 254 CrossPoint[i] = l.getClosestPoint(InPlane); 255 // NOTE: direction of line is normalized, hence s must not necessarily be in [0,1] for the baseline 256 LOG(2, "INFO: Closest point on line from " << (endpoints[(i+1)%3]->node->getPosition()) 257 << " to " << (endpoints[i%3]->node->getPosition()) << " is " << CrossPoint[i] << "."); 258 CrossPoint[i] -= (endpoints[(i+1)%3]->node->getPosition()); // cross point was returned as absolute vector 266 259 const double s = CrossPoint[i].ScalarProduct(Direction)/Direction.NormSquared(); 267 260 LOG(2, "INFO: Factor s is " << s << "."); 268 261 if ((s >= -MYEPSILON) && ((s-1.) <= MYEPSILON)) { 269 CrossPoint[i] += (endpoints[i%3]->node->getPosition()); // make cross point absolute again 270 LOG(2, "INFO: Crosspoint is " << CrossPoint[i] << ", intersecting BoundaryLine between " << endpoints[i % 3]->node->getPosition() << " and " << endpoints[(i + 1) % 3]->node->getPosition() << "."); 271 const double distance = CrossPoint[i].DistanceSquared(x); 272 if ((ShortestDistance < 0.) || (ShortestDistance > distance)) { 273 ShortestDistance = distance; 274 (ClosestPoint) = CrossPoint[i]; 275 } 276 } else 277 CrossPoint[i].Zero(); 278 } 279 InsideFlag = true; 262 CrossPoint[i] += (endpoints[(i+1)%3]->node->getPosition()); // make cross point absolute again 263 LOG(2, "INFO: Crosspoint is " << CrossPoint[i] << ", intersecting BoundaryLine between " 264 << endpoints[i % 3]->node->getPosition() << " and " 265 << endpoints[(i + 1) % 3]->node->getPosition() << "."); 266 } else { 267 // set to either endpoint of BoundaryLine 268 if (s < -MYEPSILON) 269 CrossPoint[i] = (endpoints[(i+1)%3]->node->getPosition()); 270 else 271 CrossPoint[i] = (endpoints[i%3]->node->getPosition()); 272 LOG(2, "INFO: Crosspoint is " << CrossPoint[i] << ", intersecting outside of BoundaryLine between " 273 << endpoints[i % 3]->node->getPosition() << " and " 274 << endpoints[(i + 1) % 3]->node->getPosition() << "."); 275 } 276 CrossDirection[i] = CrossPoint[i] - InPlane; 277 } 278 279 bool InsideFlag = true; 280 double ShortestDistance = -1.; 280 281 for (int i = 0; i < 3; i++) { 281 282 const double sign = CrossDirection[i].ScalarProduct(CrossDirection[(i + 1) % 3]); … … 284 285 if ((sign > -MYEPSILON) && (othersign > -MYEPSILON)) // have different sign 285 286 InsideFlag = false; 286 } 287 // update current best candidate 288 const double distance = CrossPoint[i].DistanceSquared(x); 289 if ((ShortestDistance < 0.) || (ShortestDistance > distance)) { 290 ShortestDistance = distance; 291 (ClosestPoint) = CrossPoint[i]; 292 } 293 } 294 287 295 if (InsideFlag) { 288 296 (ClosestPoint) = InPlane; 289 297 ShortestDistance = InPlane.DistanceSquared(x); 290 } else { // also check endnodes 291 for (int i = 0; i < 3; i++) { 292 const double distance = x.DistanceSquared(endpoints[i]->node->getPosition()); 293 if ((ShortestDistance < 0.) || (ShortestDistance > distance)) { 294 ShortestDistance = distance; 295 (ClosestPoint) = (endpoints[i]->node->getPosition()); 296 } 297 } 298 } 298 } 299 299 300 LOG(1, "INFO: Closest Point is " << ClosestPoint << " with shortest squared distance is " << ShortestDistance << "."); 300 301 return ShortestDistance; -
src/Tesselation/unittests/Makefile.am
rc27ce7 r6a7fcbb 14 14 TESSELATIONTESTS = \ 15 15 TesselationUnitTest \ 16 Tesselation_BoundaryTriangleUnitTest \ 16 17 Tesselation_InOutsideUnitTest 17 18 XFAIL_TESTS += Tesselation_BoundaryTriangleUnitTest19 18 20 19 TESTS += $(TESSELATIONTESTS) -
src/Tesselation/unittests/Tesselation_BoundaryTriangleUnitTest.cpp
rc27ce7 r6a7fcbb 218 218 // failure is:Intersection (27.56537519896,13.40256646925,6.672946688134) is not inside triangle [702|Na5016,O6388,Na6498]. 219 219 // note that the Intersection cannot possibly lie be within the triangle! 220 const Vector testPoint();221 const Vector testIntersection( 27.56537519896,13.40256646925,6.672946688134);220 // we test now against correct intersection 221 const Vector testIntersection(14.6872,36.204,39.8043); 222 222 std::vector<Vector> vectors; 223 223 vectors.push_back( Vector(10.7513,43.4247,48.4127) ); … … 294 294 // note that the Intersection cannot possibly lie be within the triangle 295 295 // however, it is on its plane (off only by 2.7e-12) 296 // testPoint2 is corrected version 296 297 const Vector testPoint(27.56537519896,13.40256646925,6.672946688134); 298 const Vector testPoint2(14.6872,36.204,39.8043); 297 299 Vector testIntersection; 298 300 std::vector<Vector> vectors; … … 302 304 createTriangle(vectors); 303 305 triangle->GetClosestPointInsideTriangle(testPoint, testIntersection); 304 CPPUNIT_ASSERT_EQUAL ( testPoint, testIntersection ); 306 CPPUNIT_ASSERT ( testPoint != testIntersection ); 307 CPPUNIT_ASSERT ( testPoint2 == testIntersection ); 305 308 } 306 309 }
Note:
See TracChangeset
for help on using the changeset viewer.