source: trunk/src/PixelMap/Object3D.hh @ 971

Last change on this file since 971 was 927, checked in by MatthewWhiting, 12 years ago

Fixing #139 - making the spatial map a member of Object3D, so that adding a pixel to the Object3D also results in adding the x,y combination to the spatial map. We then just rapidly return the spatial map when needed instead of calculating it each time.

File size: 6.2 KB
Line 
1// -----------------------------------------------------------------------
2// Object3D.hh: Definition of the Object3D class that holds
3//              pixel information for a three-dimensional object.
4// -----------------------------------------------------------------------
5// Copyright (C) 2006, Matthew Whiting, ATNF
6//
7// This program is free software; you can redistribute it and/or modify it
8// under the terms of the GNU General Public License as published by the
9// Free Software Foundation; either version 2 of the License, or (at your
10// option) any later version.
11//
12// Duchamp is distributed in the hope that it will be useful, but WITHOUT
13// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15// for more details.
16//
17// You should have received a copy of the GNU General Public License
18// along with Duchamp; if not, write to the Free Software Foundation,
19// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
20//
21// Correspondence concerning Duchamp may be directed to:
22//    Internet email: Matthew.Whiting [at] atnf.csiro.au
23//    Postal address: Dr. Matthew Whiting
24//                    Australia Telescope National Facility, CSIRO
25//                    PO Box 76
26//                    Epping NSW 1710
27//                    AUSTRALIA
28// -----------------------------------------------------------------------
29#ifndef OBJECT3D_H
30#define OBJECT3D_H
31
32#include <duchamp/PixelMap/Voxel.hh>
33#include <duchamp/PixelMap/Scan.hh>
34#include <duchamp/PixelMap/Object2D.hh>
35#include <duchamp/Utils/Section.hh>
36#include <vector>
37#include <algorithm>
38#include <map>
39#include <iostream>
40
41namespace PixelInfo
42{
43
44  /// @brief A set of pixels in 3D. 
45  ///
46  /// @details This stores the pixels in a STL map, connecting a
47  /// channel number (z-value) to a unique Object2D. Also recorded
48  /// are the average x-, y- and z-values (via their sums), as well as
49  /// their extrema.
50
51  class Object3D
52  {
53  public:
54    Object3D();
55    Object3D(const Object3D& o);
56    Object3D& operator= (const Object3D& o); 
57    virtual ~Object3D(){};
58
59    /// @brief Is a 3-D voxel in the Object?
60    bool isInObject(long x, long y, long z);
61    /// @brief Is a 3-D voxel in the Object?
62    bool isInObject(Voxel v){return isInObject(v.getX(),v.getY(),v.getZ());};
63 
64    /// @brief Add a single 3-D voxel to the Object.
65    virtual void addPixel(long x, long y, long z);
66    /// @brief Add a single 3-D voxel to the Object.
67    virtual void addPixel(Voxel v){addPixel(v.getX(),v.getY(),v.getZ());};
68    /// @brief Add a scan to the object
69    void addScan(Scan s, long z);
70    /// @brief Add a full channel map to the Object.
71    void addChannel(const long &z, Object2D &obj);
72    /// @brief Add a full channel map to the object.
73    // void addChannel(const std::pair<long, Object2D> &chan){addChannel(chan.first,chan.second);};
74
75    /// @brief Calculate the averages and extrema of the three coordinates.
76    void calcParams();
77    /// @brief Return the average x-value.
78    float getXaverage();
79    /// @brief Return the average y-value.
80    float getYaverage();
81    /// @brief Return the average z-value.
82    float getZaverage();
83    /// @brief Return the minimum x-value.
84    long getXmin(){return xmin;};
85    /// @brief Return the minimum y-value.
86    long getYmin(){return ymin;};
87    /// @brief Return the minimum z-value.
88    long getZmin(){return zmin;};
89    /// @brief Return the maximum x-value.
90    long getXmax(){return xmax;};
91    /// @brief Return the maximum y-value.
92    long getYmax(){return ymax;};
93    /// @brief Return the maximum z-value.
94    long getZmax(){return zmax;};
95
96    /// @brief Return the number of distinct voxels in the Object.
97    unsigned int getSize(){return numVox;};
98
99    /// @brief Return the number of distinct channels in the Object.
100    long getNumDistinctZ(){return chanlist.size();};
101
102    /// @brief Return the number of channels in the Object.
103    long getNumChanMap(){return chanlist.size();};
104
105    /// @brief Return the number of spatial pixels -- ie. the number of distinct (x,y) sets in the Object.
106    unsigned long getSpatialSize(){return spatialMap.getSize();};
107
108    /// @brief Return a vector set of all voxels in the Object.
109    std::vector<Voxel> getPixelSet();
110    /// @brief Return a vector set of all voxels in the Object, with flux values from the given array.
111    std::vector<Voxel> getPixelSet(float *array, long *dim);
112
113    /// @brief Return a vector list of the channel numbers in the Object
114    std::vector<long> getChannelList();
115
116    /// @brief Return the largest number of adjacent channels in the Object.
117    int getMaxAdjacentChannels();
118
119    /// @brief Get the channel map for channel z.
120    Object2D getChanMap(long z);
121
122    /// @brief Return an Object2D showing the spatial (x,y) distribution of voxels in the Object
123    Object2D getSpatialMap(){return spatialMap;};
124
125    /// @brief Add constant offsets to each of the dimensions, changing the parameters at the same time.
126    virtual void addOffsets(long xoff, long yoff, long zoff);
127
128    /// @brief Return the bounding box for the object, as a duchamp::Section object
129    duchamp::Section getBoundingSection(int boundary=1);
130
131    /// @brief Class function to print to a stream
132    void print(std::ostream& theStream);
133   
134    /// @brief Output operator for the Object3D.
135    friend std::ostream& operator<< ( std::ostream& theStream, Object3D& obj);
136
137    /// @brief Add two Object3Ds. Overlapping channels are combined using addChannel().
138    friend Object3D operator+ (Object3D lhs, Object3D rhs);
139
140  protected:
141    std::map<long,Object2D> chanlist;  ///< The list of 2D channel maps
142    unsigned long           numVox;    ///< How many voxels in the Object?
143    Object2D                spatialMap;///< The 2D spatial map of the Object
144    float                   xSum;      ///< Sum of the x-values
145    float                   ySum;      ///< Sum of the y-values
146    float                   zSum;      ///< Sum of the z-values
147    long                    xmin,xmax; ///< min and max x-values of object
148    long                    ymin,ymax; ///< min and max y-values of object
149    long                    zmin,zmax; ///< min and max z-values of object
150  };
151
152}
153
154#endif //OBJECT3D_H
Note: See TracBrowser for help on using the repository browser.