DistanceApproach.cpp
Go to the documentation of this file.
1 #include "DistanceApproach.h"
2 //#include <Windows.h>
3 #include <cfloat> // dsy: DBL_MAX
4 #include <iostream>
5 using namespace std;
6 CDistanceApproach::CDistanceApproach(const CRichModel& model, int source) : model(model)
7 {
8  m_nameOfAlgorithm = "Abstract";
9  m_sources[source] = 0;
10  m_radius = DBL_MAX;
11 }
12 CDistanceApproach::CDistanceApproach(const CRichModel& model, int source, int destination) : model(model)
13 {
14  m_nameOfAlgorithm = "Abstract";
15  m_sources[source] = 0;
16  m_destinations.insert(destination);
17  m_radius = DBL_MAX;
18 }
19 CDistanceApproach::CDistanceApproach(const CRichModel& model, int source, double R) : model(model), m_radius(R)
20 {
21  m_nameOfAlgorithm = "Abstract";
22  m_sources[source] = 0;
23 }
24 CDistanceApproach::CDistanceApproach(const CRichModel& model, const map<int, double>& sources) : model(model), m_sources(sources)
25 {
26  m_nameOfAlgorithm = "Abstract";
27  m_radius = DBL_MAX;
28 }
29 CDistanceApproach::CDistanceApproach(const CRichModel& model, const map<int, double>& sources, const set<int> &destinations) : model(model), m_sources(sources), m_destinations(destinations)
30 {
31  m_nameOfAlgorithm = "Abstract";
32  m_radius = DBL_MAX;
33 }
34 CDistanceApproach::CDistanceApproach(const CRichModel& model, const set<int>& sources) : model(model)
35 {
36  m_nameOfAlgorithm = "Abstract";
37  for (set<int>::const_iterator it = sources.begin(); it != sources.end(); ++it)
38  m_sources[*it] = 0;
39  m_radius = DBL_MAX;
40 }
41 CDistanceApproach::CDistanceApproach(const CRichModel& model, const set<int>& sources, double R) : model(model), m_radius(R)
42 {
43  m_nameOfAlgorithm = "Abstract";
44  for (set<int>::const_iterator it = sources.begin(); it != sources.end(); ++it)
45  m_sources[*it] = 0;
46 }
47 CDistanceApproach::CDistanceApproach(const CRichModel& model, const set<int>& sources, const set<int>& destinations) : model(model), m_destinations(destinations)
48 {
49  m_nameOfAlgorithm = "Abstract";
50  for (set<int>::const_iterator it = sources.begin(); it != sources.end(); ++it)
51  m_sources[*it] = 0;
52  m_radius = DBL_MAX;
53 }
54 
55 const vector<double>& CDistanceApproach::GetDistanceField() const
56 {
57  return m_scalarField;
58 }
59 //vector<double> CDistanceApproach::GetNormalizedDistanceField() const
60 //{
61 // vector<double> scalarValues(m_scalarField);
62 // for (int i = 0; i < scalarValues.size(); ++i)
63 // {
64 // scalarValues[i] /= m_maxDisValue;
65 // }
66 // return scalarValues;
67 //}
68 
69 //vector<double> CDistanceApproach::GetDistanceFieldDividedBy(double denominator) const
70 //{
71 // vector<double> scalarValues(m_scalarField);
72 // for (int i = 0; i < scalarValues.size(); ++i)
73 // {
74 // scalarValues[i] /= denominator;
75 // }
76 // return scalarValues;
77 //}
78 
80 {
81  return m_maxDisValue;
82 }
83 
84 vector<double> CDistanceApproach::DiffDistanceField(const vector<double>& field1,
85  const vector<double>& field2)
86 {
87  vector<double> result(field1.size());
88  for (int i = 0; i < field1.size(); ++i)
89  result[i] = abs(field1[i] - field2[i]);
90  return result;
91 }
92 
93 vector<EdgePoint> CDistanceApproach::BacktraceIsoline(double val) const
94 {
95  vector<EdgePoint> isoline;
96  for (int i = 0; i < model.GetNumOfFaces(); ++i)
97  {
98  int high, middle, low, total(0);
99  double highestDis(-DBL_MAX);
100  double lowestDis(DBL_MAX);
101 
102  for (int j = 0; j < 3; ++j)
103  {
104  if (m_scalarField[model.Face(i).verts[j]] > highestDis)
105  {
106  high = model.Face(i).verts[j];
107  highestDis = m_scalarField[model.Face(i).verts[j]];
108  }
109  if (m_scalarField[model.Face(i).verts[j]] < lowestDis)
110  {
111  low = model.Face(i).verts[j];
112  lowestDis = m_scalarField[model.Face(i).verts[j]];
113  }
114  total += model.Face(i).verts[j];
115  }
116 
117  if (high == low)
118  {
119  continue;
120  }
121  middle = total - high - low;
122  if (highestDis <= val)
123  continue;
124  if (lowestDis >= val)
125  continue;
126  //CPoint3D ptLow = model.Vert(low);
127  //CPoint3D ptMiddle = model.Vert(middle);
128  //CPoint3D ptHigh = model.Vert(high);
129  if (val < m_scalarField[middle])
130  {
131  double prop = (val - m_scalarField[low]) / (m_scalarField[middle] - m_scalarField[low]);
132  //CPoint3D pt = CRichModel::CombineTwoNormalsTo(ptLow, 1 - prop, ptMiddle, prop);
133  //outFile << 0 << " " << low << " " << middle << " " << prop << endl;
134  isoline.push_back(EdgePoint(model.GetEdgeIndexFromTwoVertices(low, middle), prop));
135  prop = (val - m_scalarField[low]) / (m_scalarField[high] - m_scalarField[low]);
136  //pt = CRichModel::CombineTwoNormalsTo(ptLow, 1 - prop, ptHigh, prop);
137  //outFile << 0 << " " << low << " " << high << " " << prop << endl;
138  isoline.push_back(EdgePoint(model.GetEdgeIndexFromTwoVertices(low, high), prop));
139  }
140  else
141  {
142  double prop = (val - m_scalarField[middle]) / (m_scalarField[high] - m_scalarField[middle]);
143  //CPoint3D pt = CRichModel::CombineTwoNormalsTo(ptMiddle, 1 - prop, ptHigh, prop);
144  //outFile << 0 << " " << middle << " " << high << " " << prop << endl;
145  isoline.push_back(EdgePoint(model.GetEdgeIndexFromTwoVertices(middle, high), prop));
146  prop = (val - m_scalarField[low]) / (m_scalarField[high] - m_scalarField[low]);
147  //pt = CRichModel::CombineTwoNormalsTo(ptLow, 1 - prop, ptHigh, prop);
148  //outFile << 0 << " " << low << " " << high << " " << prop << endl;
149  isoline.push_back(EdgePoint(model.GetEdgeIndexFromTwoVertices(low, high), prop));
150  }
151  }
152  return isoline;
153 }
154 
156 {
157  return m_nameOfAlgorithm;
158 }
159 
161 {
162  Initialize();
163  //m_nTotalMilliSeconds = GetTickCount(); // dsy: comment out.
164  Propagate();
165  //m_nTotalMilliSeconds = GetTickCount() - m_nTotalMilliSeconds; // dsy: comment out.
167  Dispose();
168 }
169 
171 {
172  m_scalarField.resize(model.GetNumOfVerts(), DBL_MAX);
173  m_maxLenOfQueue = 0;
175  m_maxDisValue = -1;
176  m_memory = 0;
177  //m_nTotalMilliSeconds = 0; // dsy: comment out.
178 }
179 
181 {
182  m_maxDisValue = -1;
183  for (int i = 0; i < model.GetNumOfVerts(); ++i)
185  && m_scalarField[i] < FLT_MAX)
187 }
188 
190 {
191  cout << "Experimental results are as follows:\n";
192  cout << "Algorithm: " << m_nameOfAlgorithm << endl;
193  cout << "Memory = " << m_memory << " Mega-bytes.\n";
194  //cout << "Timing = " << m_nTotalMilliSeconds << " ms.\n"; // dsy: comment out.
195  cout << "MaxDepth = " << m_depthOfResultingTree << " levels.\n";
196  cout << "MaxLenOfQue = " << m_maxLenOfQueue << " elements.\n";
197 }
string GetAlgorithmName() const
int GetNumOfFaces() const
Definition: BaseModel.h:85
vector< double > m_scalarField
map< int, double > m_sources
const vector< double > & GetDistanceField() const
virtual void Dispose()=0
virtual void Execute()
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const AbsReturnType abs() const
int GetEdgeIndexFromTwoVertices(int leftVert, int rightVert) const
Definition: RichModel.cpp:756
virtual void CollectExperimentalResults()=0
virtual void Propagate()=0
int GetNumOfVerts() const
Definition: BaseModel.h:80
virtual void Initialize()=0
double GetMaxDistance() const
virtual void OutputExperimentalResults() const
set< int > m_destinations
static vector< double > DiffDistanceField(const vector< double > &field1, const vector< double > &field2)
const CFace & Face(int faceIndex) const
Definition: BaseModel.h:100
const CRichModel & model
vector< EdgePoint > BacktraceIsoline(double val) const
CDistanceApproach(const CRichModel &model, int source)
__int64 m_depthOfResultingTree


co_scan
Author(s):
autogenerated on Mon Feb 28 2022 23:00:41