source: trunk/src/PixelMap/Object2D.hh

Last change on this file was 1290, checked in by MatthewWhiting, 11 years ago

Removing the Pixel class, as we never use it. Will use Voxels if we ever need to, so adding a constructor for Voxels that just takes an x & a y value. Preparation for ticket #200

File size: 6.2 KB
Line 
1// -----------------------------------------------------------------------
2// Object2D.hh: Definition of Object2D, a class to hold pixel
3//              information for a 2-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 OBJECT2D_H
30#define OBJECT2D_H
31
32#include <iostream>
33#include <algorithm>
34#include <vector>
35#include <list>
36#include <duchamp/PixelMap/Scan.hh>
37#include <duchamp/PixelMap/Voxel.hh>
38
39namespace PixelInfo
40{
41
42  /// @brief A class to store the pixel information for an object
43  /// defined in a 2-dimensional plane.
44  ///
45  /// @details The object consists of a set of Scans (stored as a
46  /// std::vector), together with basic information on the maximum,
47  /// minimum, and average values (actually stored as xSum, ySum) for
48  /// the x and y pixel values.
49
50  class Object2D
51  {
52  public:
53    Object2D();
54    Object2D(const Object2D& o);
55    Object2D& operator= (const Object2D& o); 
56    virtual ~Object2D(){};
57 
58    /// @brief Clear the Object and set the number of pixels to zero.
59    void  clear(){scanlist.clear(); numPix=0;};
60
61    /// @brief Make sure there are no overlapping or adjacent scans in the Scan list.
62    void  cleanup();
63
64    /// @brief Add a pixel to the Object, making sure no scans overlap afterwards.
65    void  addPixel(long x, long y);
66    // /// @brief Add the (x,y) part of a Voxel to the Object, using addPixel(long,long)
67    // void  addPixel(Voxel &v){this->addPixel(v.getX(),v.getY());};
68    // /// @brief Add a Pixel to the Object, using addPixel(long,long)
69    // void  addPixel(Pixel &p){this->addPixel(p.getX(),p.getY());};
70
71    /// @brief Add a full Scan to the Object, making sure there are no overlapping scans afterwards.
72    void  addScan(Scan &scan);
73
74    /// @brief Test whether a pixel (x,y) is in the Object.
75    bool  isInObject(long x, long y);
76    /// @brief Test whether the (x,y) part of a Voxel is in the Object.
77    bool  isInObject(Voxel v){return this->isInObject(v.getX(),v.getY());};
78
79    /// @brief Test whether a given Scan overlaps with any pixels in the Object.
80    bool  scanOverlaps(Scan &scan);
81
82    bool canMerge(Object2D &other, float threshS, bool flagAdj);
83    bool isNear(Object2D &other, long gap);
84    bool isClose(Object2D &other, float threshS, bool flagAdj);   
85
86    /// @brief Return the number of pixels in the Object.
87    unsigned long  getSize(){return numPix;};
88
89    /// @brief Return the number of Scans in the Object.
90    long  getNumScan(){return scanlist.size();};
91
92    /// @brief Return the scan list.
93    std::vector<Scan> getScanlist(){return scanlist;};
94
95    /// @brief Get the i-th Scan in the Scan list.
96    Scan  getScan(int i){return scanlist[i];};
97
98    /// @brief Order the Scans in the list, using the < operator for Scans.
99     void  order(){std::stable_sort(scanlist.begin(),scanlist.end());};
100    //void order(){scanlist.sort();};
101
102    /// @brief Add values to the x- and y-axes, making sure to add the offsets to the sums and min/max values.
103    void  addOffsets(long xoff, long yoff);
104
105    /// @brief Calculate the sums, mins, maxs for x&y -- should not be necessary as these are done when pixels & Scans are added.
106    void  calcParams();
107
108    /// @brief Return the average x-value.
109    float getXaverage(){return xSum/float(numPix);};
110
111    /// @brief Return the average y-value.
112    float getYaverage(){return ySum/float(numPix);};
113
114    long  getXmin(){return xmin;};
115    long  getYmin(){return ymin;};
116    long  getXmax(){return xmax;};
117    long  getYmax(){return ymax;};
118
119    /// @brief Return the number of distinct y-values.
120    long  getNumDistinctY();
121    /// @brief Return the number of distinct x-values.
122    long  getNumDistinctX();
123 
124    /// @brief Return a measurement of the primary position angle
125    double getPositionAngle();
126    /// @brief Return the lengths of the principal axes.
127    std::pair<double,double> getPrincipalAxes();
128    /// @brief Find the best fitting ellipse weighted by some flux array
129    bool findEllipse(bool weightByFlux, float *array, size_t xdim, size_t ydim, int xzero, int yzero, float x0, float y0);
130
131    double major(){return majorAxis;};
132    double minor(){return minorAxis;};
133    double posAng(){return posAngle;};
134
135    /// @brief A stream output operator.
136    friend std::ostream& operator<< ( std::ostream& theStream, Object2D& obj);
137
138    /// @brief Adding two Objects together.
139    friend Object2D operator+ (Object2D lhs, Object2D rhs);
140
141    friend class ChanMap;
142    friend class Object3D;
143    friend class Detection;
144
145  protected:
146    std::vector<Scan>   scanlist;       ///< The list of Scans
147    unsigned long     numPix;         ///< Number of pixels in the Object
148    float             xSum;           ///< Sum of x values
149    float             ySum;           ///< Sum of y values
150    long              xmin,xmax;      ///< min and max x-values of object
151    long              ymin,ymax;      ///< min and max y-values of object
152    double            majorAxis;      ///< fitted major principal axis
153    double            minorAxis;      ///< fitted minor principal axis
154    double            posAngle;       ///< fitted position angle of principal axis
155  };
156
157}
158
159#endif //OBJECT2D_H
Note: See TracBrowser for help on using the repository browser.