Changeset 6a7fcbb for src


Ignore:
Timestamp:
Mar 28, 2012, 1:25:11 PM (13 years ago)
Author:
Frederik Heber <heber@…>
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)
Message:

FIX: Rewrote BoundaryTriangleSet::GetClosestPointInsideTriangle().

  • was broken before, see failing unit test, as it returned points not inside the triangle (however on the plane). Now, we rely on getClosestPoint of Space and derived classes.
  • TESTFIX: Removed Tesselation_BoundaryTriangleUnitTest from XFAIL.
Location:
src/Tesselation
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/Tesselation/BoundaryTriangleSet.cpp

    rc27ce7 r6a7fcbb  
    230230  Vector Direction;
    231231
    232   // 1. get intersection with plane
     232  // 1. get intersection with plane and place in ClosestPoint
    233233  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() << ".");
    235236  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);
    238238  }
    239239  catch (LinearAlgebraException &excp) {
    240240    (ClosestPoint) = (x);
    241241  }
     242  Vector InPlane(ClosestPoint); // points from plane intersection to straight-down point
    242243
    243244  // 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 << ".");
    251246
    252247  // Calculate cross point between one baseline and the desired point such that distance is shortest
    253   double ShortestDistance = -1.;
    254   bool InsideFlag = false;
    255248  Vector CrossDirection[3];
    256249  Vector CrossPoint[3];
    257   Vector helper;
    258250  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());
    261252    // calculate intersection, line can never be parallel to Direction (is the same vector as PlaneNormal);
    262253    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
    266259    const double s = CrossPoint[i].ScalarProduct(Direction)/Direction.NormSquared();
    267260    LOG(2, "INFO: Factor s is " << s << ".");
    268261    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.;
    280281  for (int i = 0; i < 3; i++) {
    281282    const double sign = CrossDirection[i].ScalarProduct(CrossDirection[(i + 1) % 3]);
     
    284285    if ((sign > -MYEPSILON) && (othersign > -MYEPSILON)) // have different sign
    285286      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
    287295  if (InsideFlag) {
    288296    (ClosestPoint) = InPlane;
    289297    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
    299300  LOG(1, "INFO: Closest Point is " << ClosestPoint << " with shortest squared distance is " << ShortestDistance << ".");
    300301  return ShortestDistance;
  • src/Tesselation/unittests/Makefile.am

    rc27ce7 r6a7fcbb  
    1414TESSELATIONTESTS = \
    1515  TesselationUnitTest \
     16  Tesselation_BoundaryTriangleUnitTest \
    1617  Tesselation_InOutsideUnitTest
    17 
    18 XFAIL_TESTS += Tesselation_BoundaryTriangleUnitTest
    1918
    2019TESTS += $(TESSELATIONTESTS)
  • src/Tesselation/unittests/Tesselation_BoundaryTriangleUnitTest.cpp

    rc27ce7 r6a7fcbb  
    218218    // failure is:Intersection (27.56537519896,13.40256646925,6.672946688134) is not inside triangle [702|Na5016,O6388,Na6498].
    219219    // 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);
    222222    std::vector<Vector> vectors;
    223223    vectors.push_back( Vector(10.7513,43.4247,48.4127) );
     
    294294    // note that the Intersection cannot possibly lie be within the triangle
    295295    // however, it is on its plane (off only by 2.7e-12)
     296    // testPoint2 is corrected version
    296297    const Vector testPoint(27.56537519896,13.40256646925,6.672946688134);
     298    const Vector testPoint2(14.6872,36.204,39.8043);
    297299    Vector testIntersection;
    298300    std::vector<Vector> vectors;
     
    302304    createTriangle(vectors);
    303305    triangle->GetClosestPointInsideTriangle(testPoint, testIntersection);
    304     CPPUNIT_ASSERT_EQUAL ( testPoint, testIntersection );
     306    CPPUNIT_ASSERT ( testPoint != testIntersection );
     307    CPPUNIT_ASSERT ( testPoint2 == testIntersection );
    305308  }
    306309}
Note: See TracChangeset for help on using the changeset viewer.