GeoTessCPP  2.1
Software to facilitate storage and retrieval of 3D information about the Earth.
 All Classes Namespaces Files Functions Variables Typedefs Friends Macros
GeoTessProfileThin.h
Go to the documentation of this file.
1 //- ****************************************************************************
2 //-
3 //- Copyright 2009 Sandia Corporation. Under the terms of Contract
4 //- DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
5 //- retains certain rights in this software.
6 //-
7 //- BSD Open Source License.
8 //- All rights reserved.
9 //-
10 //- Redistribution and use in source and binary forms, with or without
11 //- modification, are permitted provided that the following conditions are met:
12 //-
13 //- * Redistributions of source code must retain the above copyright notice,
14 //- this list of conditions and the following disclaimer.
15 //- * Redistributions in binary form must reproduce the above copyright
16 //- notice, this list of conditions and the following disclaimer in the
17 //- documentation and/or other materials provided with the distribution.
18 //- * Neither the name of Sandia National Laboratories nor the names of its
19 //- contributors may be used to endorse or promote products derived from
20 //- this software without specific prior written permission.
21 //-
22 //- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23 //- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 //- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 //- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
26 //- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27 //- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28 //- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29 //- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30 //- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 //- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 //- POSSIBILITY OF SUCH DAMAGE.
33 //-
34 //- ****************************************************************************
35 
36 #ifndef PROFILETHIN_OBJECT_H
37 #define PROFILETHIN_OBJECT_H
38 
39 // **** _SYSTEM INCLUDES_ ******************************************************
40 
41 #include <iostream>
42 #include <fstream>
43 #include <string>
44 
45 // use standard library objects
46 using namespace std;
47 
48 // **** _LOCAL INCLUDES_ *******************************************************
49 
50 #include "GeoTessData.h"
51 #include "GeoTessProfile.h"
52 #include "GeoTessProfileType.h"
53 #include "IFStreamAscii.h"
54 #include "IFStreamBinary.h"
55 
56 // **** _BEGIN GEOTESS NAMESPACE_ **********************************************
57 
58 namespace geotess {
59 
60 // **** _FORWARD REFERENCES_ ***************************************************
61 
62 class GeoTessMetaData;
63 
64 // **** _CLASS DEFINITION_ *****************************************************
65 
74 {
75 private:
76 
80  float radius;
81 
85  GeoTessData* data;
86 
90  int pointIndex;
91 
95  GeoTessProfileThin() : GeoTessProfile(), radius(0.0), data(NULL),
96  pointIndex(-1) {};
97 
98 public:
99 
103  GeoTessProfileThin(float rad, GeoTessData* dat) :
104  GeoTessProfile(), radius(rad), data(dat),
105  pointIndex(-1) {};
106 
110  static string class_name() { return "ProfileThin"; };
111 
115  virtual int class_size() const
116  { return (int) sizeof(GeoTessProfileThin); };
117 
123  virtual const GeoTessProfileType& getType() const
124  { return GeoTessProfileType::THIN; };
125 
129  virtual bool operator == (const GeoTessProfile& p) const
130  { return (GeoTessProfile::operator==(p) && (radius == p.getRadius(0)) && (*data == p.getData(0))); }
131 
140  virtual double getValue(int attributeIndex, int nodeIndex) const
141  { return nodeIndex == 0 ? data->getDouble(attributeIndex) : NaN_DOUBLE; }
142 
152  virtual double getValue(const GeoTessInterpolatorType& rInterpType,
153  int attributeIndex, double r, bool allowRadiusOutOfRange) const
154  {
155  if (!allowRadiusOutOfRange &&
156  ((r < getRadiusBottom()) || (r > getRadiusTop())))
157  return NaN_DOUBLE;
158 
159  // default behavior is to simply return the data value for the first
160  // data object. This works for all the Profile classes that only support
161  // a single Data object like ProfileConstant, ProfileSurface, and
162  // ProfileThin. Profile classes for which the number of supported
163  // Data objects is not equal to 1 must override this method.
164 
165  return getValue(attributeIndex, 0);
166  };
167 
174  virtual double getValueTop(int attributeIndex) const
175  { return data->getDouble(attributeIndex); }
176 
187  virtual bool isNaN(int nodeIndex, int attributeIndex)
188  {
189  return nodeIndex != 0 || data->isNaN(attributeIndex);
190  }
191 
196  virtual float getRadius(int i) const { return radius; };
197 
201  virtual int getNRadii() const { return 1; };
202 
206  virtual int getNData() const { return 1; };
207 
211  virtual float* getRadii()
212  { float* fa = new float [1]; fa[0] = radius; return fa; };
213 
217  virtual GeoTessData** getData()
218  { GeoTessData** da = new GeoTessData* [1]; da[0] = data; return da; };
219 
223  virtual GeoTessData* getData(int i) { return data; };
224 
228  virtual const GeoTessData& getData(int i) const { return *data; };
229 
233  virtual void setData(const vector<GeoTessData*>& inData)
234  { delete data; data = inData[0]; }
235 
239  virtual void setRadii(const vector<float>& newRadii)
240  { radius = newRadii[0]; }
241 
242  virtual void setRadius(int index, float newRadius)
243  { if (index == 0) radius = newRadius; }
244 
248  virtual void setData(int index, GeoTessData* inData)
249  { delete data; data = inData; }
250 
254  virtual float getRadiusTop() const { return radius; };
255 
259  virtual const GeoTessData& getDataTop() const { return *data; };
260 
264  virtual GeoTessData* getDataTop() { return data; };
265 
269  virtual float getRadiusBottom() const { return radius; };
270 
274  virtual const GeoTessData& getDataBottom() const { return *data; };
275 
279  virtual GeoTessData* getDataBottom() { return data; };
280 
282 
287  radius(-1.0), data(NULL), pointIndex(-1)
288  { radius = ifs.readFloat(); data = GeoTessData::getData(ifs, gtmd); };
289 
293  GeoTessProfileThin(IFStreamAscii& ifs, GeoTessMetaData& gtmd) : GeoTessProfile(),
294  radius(-1.0), data(NULL), pointIndex(-1)
295  { radius = ifs.readFloat(); data = GeoTessData::getData(ifs, gtmd); };
296 
301  virtual ~GeoTessProfileThin() { if (data != NULL) delete data; };
302 
306  virtual void write(IFStreamBinary& ofs)
307  { ofs.writeByte((byte) GeoTessProfileType::THIN.ordinal());
308  ofs.writeFloat(radius); data->write(ofs); };
309 
313  virtual void write(IFStreamAscii& ofs)
314  { ofs.writeInt(GeoTessProfileType::THIN.ordinal());
315  ofs.writeString(" ");
316  ofs.writeFloat(radius);
317  data->write(ofs);
318  ofs.writeNL(); };
319 
328  virtual int findClosestRadiusIndex(double r) const
329  { return 0; }
330 
338  virtual void setPointIndex(int nodeIndex, int pntIndex)
339  { pointIndex = pntIndex; }
340 
348  virtual void resetPointIndices() { pointIndex = -1; }
349 
357  virtual int getPointIndex(int nodeIndex) const
358  { return pointIndex; }
359 
363  virtual GeoTessProfile* copy()
364  {
365  return new GeoTessProfileThin(radius, data->copy());
366  }
367 
369 
370 }; // end class ProfileThin
371 
372 } // end namespace geotess
373 
374 #endif // PROFILETHIN_OBJECT_H
virtual double getValue(int attributeIndex, int nodeIndex) const
Definition: GeoTessProfileThin.h:140
virtual float getRadius(int i) const
Definition: GeoTessProfileThin.h:196
virtual void setData(const vector< GeoTessData * > &inData)
Definition: GeoTessProfileThin.h:233
virtual void setRadii(const vector< float > &newRadii)
Definition: GeoTessProfileThin.h:239
virtual void setRadius(int index, float newRadius)
Definition: GeoTessProfileThin.h:242
virtual GeoTessData * getDataTop()
Definition: GeoTessProfileThin.h:264
virtual int class_size() const
Definition: GeoTessProfileThin.h:115
virtual double getValueTop(int attributeIndex) const
Definition: GeoTessProfileThin.h:174
virtual float * getRadii()
Definition: GeoTessProfileThin.h:211
virtual float getRadiusTop() const
Definition: GeoTessProfileThin.h:254
Opens a file for binary read and write access.
Definition: IFStreamBinary.h:79
static string class_name()
Definition: GeoTessProfileThin.h:110
GeoTessProfileThin(float rad, GeoTessData *dat)
Definition: GeoTessProfileThin.h:103
Enumeration of the interpolation algorithms supported by GeoTess including LINEAR, NATURAL_NEIGHBOR and CUBIC_SPLINE.
Definition: GeoTessInterpolatorType.h:71
Enumeration of the valid Profile types, including EMPTY, THIN, CONSTANT, NPOINT and SURFACE...
Definition: GeoTessProfileType.h:69
virtual GeoTessData ** getData()
virtual int getNRadii() const
Definition: GeoTessProfileThin.h:201
virtual void setData(int index, GeoTessData *inData)
Definition: GeoTessProfileThin.h:248
virtual float getRadiusBottom() const
Definition: GeoTessProfileThin.h:269
#define byte
signed-byte typedef
Definition: CPPGlobals.h:94
float readFloat()
Definition: IFStreamBinary.h:1117
virtual GeoTessData * getDataBottom()
Definition: GeoTessProfileThin.h:279
Abstract class that manages the radii and data values that span a single layer associated with a sing...
Definition: GeoTessProfile.h:96
Abstract base class that manages the data values attached to a single grid point. ...
Definition: GeoTessData.h:75
virtual const GeoTessData & getDataBottom() const
Definition: GeoTessProfileThin.h:274
virtual int getNData() const
Definition: GeoTessProfileThin.h:206
virtual const GeoTessData & getData(int i) const
Definition: GeoTessProfileThin.h:228
Basic metadata information about a GeoTessModel.
Definition: GeoTessMetaData.h:96
virtual bool isNaN(int nodeIndex, int attributeIndex)
Definition: GeoTessProfileThin.h:187
virtual const GeoTessProfileType & getType() const
Definition: GeoTessProfileThin.h:123
virtual GeoTessData * getData(int i)
Definition: GeoTessProfileThin.h:223
virtual GeoTessData ** getData()
Definition: GeoTessProfileThin.h:217
virtual double getValue(const GeoTessInterpolatorType &rInterpType, int attributeIndex, double r, bool allowRadiusOutOfRange) const
Definition: GeoTessProfileThin.h:152
#define GEOTESS_EXP_IMP
Definition: CPPGlobals.h:71
virtual float getRadius(int i) const
virtual const GeoTessData & getDataTop() const
Definition: GeoTessProfileThin.h:259
A Profile object consiting of a single radius value and a single Data object. It represents a profile...
Definition: GeoTessProfileThin.h:73