source: src/Fragmentation/Exporters/SphericalPointDistribution.hpp@ 6cf5bb

Last change on this file since 6cf5bb was 6cf5bb, checked in by Frederik Heber <heber@…>, 9 years ago

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.
  • Property mode set to 100644
File size: 4.9 KB
Line 
1/*
2 * SphericalPointDistribution.hpp
3 *
4 * Created on: May 29, 2014
5 * Author: heber
6 */
7
8
9#ifndef SPHERICALPOINTDISTRIBUTION_HPP_
10#define SPHERICALPOINTDISTRIBUTION_HPP_
11
12// include config.h
13#ifdef HAVE_CONFIG_H
14#include <config.h>
15#endif
16
17#include "CodePatterns/Assert.hpp"
18
19#include <cmath>
20#include <list>
21
22#include "LinearAlgebra/Vector.hpp"
23
24/** contains getters for the VSEPR model for specific number of electrons.
25 *
26 * This struct contains specialized functions returning a list of Vectors
27 * (points in space) to match the VSEPR model for the given number of electrons.
28 *
29 * This is implemented via template specialization of the function get().
30 *
31 * These specializations are taken from the python script \b CreateVspeShapes.py
32 * by Christian Neuen, 07th May 2009.
33 */
34struct SphericalPointDistribution
35{
36 /** Cstor for SphericalPointDistribution, allows setting radius of sphere
37 *
38 * \param _BondLength desired radius of sphere
39 */
40 SphericalPointDistribution(const double _Bondlength = 1.) :
41 Bondlength(_Bondlength)
42 {}
43
44 //!> typedef for the list of points
45 typedef std::list<Vector> Polygon_t;
46
47 /** General getter function for the distribution of points on the surface.
48 *
49 * \warn this function needs to be specialized!
50 *
51 * \return Polygon_t with points on the surface centered at (0,0,0)
52 */
53 template <int N> Polygon_t get() const
54 {
55 ASSERT(0, "SphericalPointDistribution::get() - not specialized for "+toString(N)+".");
56 }
57
58 /** Matches a given spherical distribution with another containing more
59 * points.
60 *
61 * This is a helper to determine points where to best insert saturation
62 * hydrogens.
63 *
64 * \param _polygon current occupied positions
65 * \param _newpolygon ideal distribution to match best with current occupied
66 * positions
67 * \return remaining vacant positions relative to \a _polygon
68 */
69 static Polygon_t matchSphericalPointDistributions(
70 const Polygon_t &_polygon,
71 const Polygon_t &_newpolygon
72 );
73
74 //!> default radius of the spherical distribution
75 const double Bondlength;
76 //!> precalculated value for root of 3
77 static const double SQRT_3;
78
79 typedef std::pair<Vector, double> Rotation_t;
80
81 typedef std::list<unsigned int> IndexList_t;
82 typedef std::vector<unsigned int> IndexArray_t;
83 typedef std::vector<Vector> VectorArray_t;
84
85 //!> amplitude up to which deviations in checks of rotations are tolerated
86 static const double warn_amplitude;
87
88private:
89 static std::pair<double, double> calculateErrorOfMatching(
90 const std::vector<Vector> &_old,
91 const std::vector<Vector> &_new,
92 const IndexList_t &_Matching);
93
94 static Polygon_t removeMatchingPoints(
95 const VectorArray_t &_points,
96 const IndexList_t &_matchingindices
97 );
98
99 struct MatchingControlStructure {
100 bool foundflag;
101 double bestL2;
102 IndexList_t bestmatching;
103 VectorArray_t oldpoints;
104 VectorArray_t newpoints;
105 };
106
107 static void recurseMatchings(
108 MatchingControlStructure &_MCS,
109 IndexList_t &_matching,
110 IndexList_t _indices,
111 unsigned int _matchingsize);
112
113 static IndexList_t findBestMatching(
114 const Polygon_t &_polygon,
115 const Polygon_t &_newpolygon
116 );
117
118 static Rotation_t findPlaneAligningRotation(
119 const VectorArray_t &_referencepositions,
120 const VectorArray_t &_currentpositions,
121 const IndexList_t &_bestmatching
122 );
123
124 static Rotation_t findPointAligningRotation(
125 const VectorArray_t &remainingold,
126 const VectorArray_t &remainingnew,
127 const IndexList_t &_bestmatching);
128
129};
130
131// declare specializations
132
133template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<0>() const;
134template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<1>() const;
135template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<2>() const;
136template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<3>() const;
137template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<4>() const;
138template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<5>() const;
139template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<6>() const;
140template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<7>() const;
141template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<8>() const;
142template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<9>() const;
143template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<10>() const;
144template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<11>() const;
145template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<12>() const;
146template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<14>() const;
147
148#endif /* SPHERICALPOINTDISTRIBUTION_HPP_ */
Note: See TracBrowser for help on using the repository browser.