00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00062
00063 #ifndef DistanceResults_h
00064 #define DistanceResults_h
00065
00066 #ifdef _MSC_VER
00067
00068
00069 #pragma warning (disable: 4786)
00070 #endif //_MSC_VER
00071
00072 #include "Primitive.hpp"
00073 #include "ScaleInverseF.hpp"
00074 #include "Math/Vector3.h"
00075 #include <assert.h>
00076 #include <map>
00077 #include <vector>
00078
00079
00080
00081 namespace OSCAR {
00082
00088 class DistanceCalculator;
00089 typedef std::vector<Vector3> Vector3vec;
00090
00091 class DistanceResults {
00092 friend class DistanceCalculator;
00093 public:
00094 typedef std::map<const Primitive*, std::pair<Vector3, int> > InnerMap;
00095 typedef std::map<const Primitive*, InnerMap> OuterMap;
00096 typedef std::map<const Primitive*, vector<double> > InnerGMap;
00097 typedef std::map<const Primitive*, InnerGMap> OuterGMap;
00098
00099 typedef std::map<const Primitive*, Matrix*> InnerHMap;
00100 typedef std::map<const Primitive*, InnerHMap> OuterHMap;
00101 typedef InnerMap::const_iterator InnerMapIterator;
00102
00103 DistanceResults();
00104
00127 bool LocateDHat(const Primitive* const from, const Primitive* const to, int& index) const;
00128
00147 bool LocatePair(const Primitive* const from, const Primitive* const to, InnerMapIterator& iter) const;
00148
00155 bool Distance(const Primitive* const p0, const Primitive* const p1, double& distance) const;
00156
00164 bool CalculateForce(const Primitive* const p0, const Primitive* const p1, const ArtificialPotentialF& func);
00165
00173 bool GetForce(const Primitive* const p0, const Primitive* const p1, double& force) const;
00174
00180 double Distance(InnerMapIterator iter) const;
00181
00189 bool CalculateForceD1(const Primitive* const p0, const Primitive* const p1, const ArtificialPotentialF& func);
00190
00198 bool GetForceD1(const Primitive* const p0, const Primitive* const p1, double& forceD1) const;
00199
00200
00205 Vector3 Dhat(InnerMapIterator iter) const;
00206
00211 const Vector3& WitnessPoint(InnerMapIterator iter) const;
00212
00219 bool GetWitnessPoint(const Primitive* const locatedOn, const Primitive* const closestTo, Vector3& wit) const;
00220
00226 const Vector3vec& Dhat() const;
00227
00232 bool Contains(const Primitive* const thisObject) const;
00233
00237 ~DistanceResults();
00238
00272 void Clear();
00273
00282 bool GetGFunctions(const Primitive* from, const Primitive* to, const vector<double>*& gFunctions) const;
00283
00291 bool GetHFunctions(const Primitive* from, const Primitive* to, const Matrix* hFunctions);
00292
00293
00294
00295 private:
00296 Vector3vec dHats;
00297 std::vector<double> distances;
00298 std::vector<double> forces;
00299 std::vector<double> forcesD1;
00300 OuterMap results;
00301 OuterGMap gFuncs;
00302 OuterHMap hFuncs;
00303 bool contains(const Primitive* prim1, const Primitive* prim2, int& index);
00304 bool setHFunctions(const Primitive* to, const Primitive* from, Matrix* hFunctions);
00305 Matrix* containsHFunction(const Primitive* from, const Primitive* to);
00306 };
00307
00308
00309 #include "DistanceResults.ipp"
00310
00311 }
00312 #endif //DistanceResults_h