Ignore:
Timestamp:
Sep 12, 2016, 11:48:34 PM (9 years ago)
Author:
Frederik Heber <heber@…>
Branches:
Action_Thermostats, Add_AtomRandomPerturbation, Add_FitFragmentPartialChargesAction, Add_RotateAroundBondAction, Add_SelectAtomByNameAction, Adding_Graph_to_ChangeBondActions, Adding_MD_integration_tests, Adding_StructOpt_integration_tests, Automaking_mpqc_open, AutomationFragmentation_failures, Candidate_v1.5.4, Candidate_v1.6.0, Candidate_v1.6.1, Candidate_v1.7.0, ChangeBugEmailaddress, ChangingTestPorts, ChemicalSpaceEvaluator, 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_ChargeSampling_PBC, Fix_ChronosMutex, Fix_FitPartialCharges, Fix_FitPotential_needs_atomicnumbers, Fix_ForceAnnealing, Fix_IndependentFragmentGrids, Fix_ParseParticles, Fix_ParseParticles_split_forward_backward_Actions, Fix_StatusMsg, Fix_StepWorldTime_single_argument, Fix_Verbose_Codepatterns, ForceAnnealing_goodresults, ForceAnnealing_oldresults, ForceAnnealing_tocheck, ForceAnnealing_with_BondGraph, ForceAnnealing_with_BondGraph_continued, ForceAnnealing_with_BondGraph_continued_betteresults, ForceAnnealing_with_BondGraph_contraction-expansion, GeometryObjects, Gui_displays_atomic_force_velocity, IndependentFragmentGrids, IndependentFragmentGrids_IndividualZeroInstances, IndependentFragmentGrids_IntegrationTest, IndependentFragmentGrids_Sole_NN_Calculation, JobMarket_RobustOnKillsSegFaults, JobMarket_StableWorkerPool, JobMarket_unresolvable_hostname_fix, ODR_violation_mpqc_open, PartialCharges_OrthogonalSummation, PythonUI_with_named_parameters, QtGui_reactivate_TimeChanged_changes, Recreated_GuiChecks, RotateToPrincipalAxisSystem_UndoRedo, SaturateAtoms_findBestMatching, StoppableMakroAction, Subpackage_CodePatterns, Subpackage_JobMarket, Subpackage_LinearAlgebra, Subpackage_levmar, Subpackage_mpqc_open, Subpackage_vmg, ThirdParty_MPQC_rebuilt_buildsystem, TrajectoryDependenant_MaxOrder, TremoloParser_IncreasedPrecision, TremoloParser_MultipleTimesteps, Ubuntu_1604_changes, stable
Children:
2199c2
Parents:
158ecb
git-author:
Frederik Heber <heber@…> (06/12/14 07:23:12)
git-committer:
Frederik Heber <heber@…> (09/12/16 23:48:34)
Message:

Using the idea of three points giving a triangle to find rotation axis.

  • we calculate the center of either triangle and rotate the center of the ideal point distribution to match the one from the given points.
  • next we have the triangles normals as axis, take the first matching point and rotate align it.
  • we have to deal with a lot of special cases: What if only zero, one, or two points are given ...
  • in general we assume that the triangle lies relatively flat on the sphere's surface but what if the origin is in the triangle plane or even the calculated center is at the origin ...
  • TESTS: SphericalPointDistributionUnitTest working again, regression tests FragmentMolecule-cylces and StoreSaturatedFragment working.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Fragmentation/Exporters/SphericalPointDistribution.hpp

    r158ecb rb67d89  
    7777  //!> precalculated value for root of 3
    7878  static const double SQRT_3;
     79
     80  typedef std::pair<Vector, double> Rotation_t;
     81
     82  typedef std::list<unsigned int> IndexList_t;
     83  typedef std::vector<unsigned int> IndexArray_t;
     84  typedef std::vector<Vector> VectorArray_t;
     85
     86  //!> amplitude up to which deviations in checks of rotations are tolerated
     87  static const double warn_amplitude;
     88
     89private:
     90  static std::pair<double, double> calculateErrorOfMatching(
     91      const std::vector<Vector> &_old,
     92      const std::vector<Vector> &_new,
     93      const IndexList_t &_Matching);
     94
     95  static Polygon_t removeMatchingPoints(
     96      const VectorArray_t &_points,
     97      const IndexList_t &_matchingindices
     98      );
     99
     100  struct MatchingControlStructure {
     101    bool foundflag;
     102    double bestL2;
     103    IndexList_t bestmatching;
     104    VectorArray_t oldpoints;
     105    VectorArray_t newpoints;
     106  };
     107
     108  static void recurseMatchings(
     109      MatchingControlStructure &_MCS,
     110      IndexList_t &_matching,
     111      IndexList_t _indices,
     112      unsigned int _matchingsize);
     113
     114  static IndexList_t findBestMatching(
     115      const Polygon_t &_polygon,
     116      const Polygon_t &_newpolygon
     117      );
     118
     119  static Rotation_t findPlaneAligningRotation(
     120      const VectorArray_t &_referencepositions,
     121      const VectorArray_t &_currentpositions,
     122      const IndexList_t &_bestmatching
     123      );
     124
     125  static Rotation_t findPointAligningRotation(
     126      const VectorArray_t &remainingold,
     127      const VectorArray_t &remainingnew,
     128      const IndexList_t &_bestmatching);
     129
    79130};
    80131
Note: See TracChangeset for help on using the changeset viewer.