source: tags/release-1.1.9/src/PixelMap/Scan.hh @ 1441

Last change on this file since 1441 was 528, checked in by MatthewWhiting, 15 years ago

Changing the documentation comments to match the askapsoft style. Also have split ChanMap? and Object3D into separate files.

File size: 4.6 KB
Line 
1// -----------------------------------------------------------------------
2// Scan.hh: Definition of the Scan class, used to store row
3//          information as part of a 2D 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 SCAN_H
30#define SCAN_H
31
32#include <iostream>
33#include <vector>
34
35/// This namespace will store all the classes and functions necessary
36/// to encode shapes and objects in 1-, 2- and 3-dimensions.
37namespace PixelInfo
38{
39
40  /// A class to store the basic unit of pixel information, a scan
41  /// encoded by an (x,y) starting point, and a length (in the
42  /// x-direction).
43  ///
44  /// This class is used by other classes to store objects in 2- and
45  /// 3-dimensions.
46
47  class Scan
48  {
49  public:
50    Scan();
51    Scan(long y, long x, long xl){itsY=y; itsX=x; itsXLen=xl;};
52    Scan(const Scan& s);
53    Scan& operator= (const Scan& s);
54    virtual ~Scan(){};
55
56    /// @brief Define a Scan by providing the three key parameters. 
57    void define(long y, long x, long xl){itsY=y; itsX=x; itsXLen=xl;};
58
59    /// @brief Set the Scan to the null values, with the length=0.
60    void clear(){itsY=-1;itsX=-1;itsXLen=0;};
61    bool isNull();
62
63    // Accessor functions -- obvious.
64    long getY(){return itsY;};
65    void setY(long l){itsY=l;};
66    long getX(){return itsX;};
67    void setX(long l){itsX=l;};
68    long getXlen(){return itsXLen;};
69    void setXlen(long l){itsXLen=l;};
70
71    /// @brief An easy way to get the maximum x-value
72    long getXmax(){return itsX+itsXLen-1;};
73
74    /// @brief A way of setting the length by proxy, giving the maximum x-value.
75    void setXmax(long l){itsXLen = l-itsX+1;};
76
77    /// @brief Add a point to the left of the scan (ie.\ add the point itsX-1).
78    void growLeft(){itsX--;itsXLen++;};
79
80    /// @brief Add a point to the right of the scan (ie.\ add the point xmax+1).
81    void growRight(){itsXLen++;};
82
83    /// @brief Add values to the x- and y-axes.
84    void addOffsets(long xoff, long yoff){itsY+=yoff; itsX+=xoff;};
85
86    /// @brief Tests whether a given (x,y) point is in the scan.
87    bool isInScan(long x, long y);
88
89    /// @brief Stream output operator for the Scan
90    friend std::ostream& operator<< ( std::ostream& theStream, Scan& scan);
91
92    /// @brief Less-than operator for Scans
93    friend bool operator< (Scan lhs, Scan rhs);
94
95    /// @brief Test whether one scan is equal to another.
96    friend bool operator== (Scan lhs, Scan rhs);
97
98    friend class Object2D; ///< Enable Object2D to see the private members.
99
100  private:
101    long itsY;    ///< The y-value of each point in the scan.
102    long itsX;    ///< The x-value of the start (left-hand end) of the scan.
103    long itsXLen; ///< The length of the scan (number of pixels in the scan).
104
105  };
106
107  /// @brief Combine two scans into one.
108  Scan unite(Scan &s1, Scan &s2);
109
110  /// @brief Keep only the pixels in both the two scans.
111  Scan intersect(Scan &s1, Scan &s2);
112
113  /// @brief Test whether two scans either overlap or are adjacent.
114  bool touching(Scan &s1, Scan &s2);
115
116  /// @brief Test whether two scans have pixels in common
117  bool overlap(Scan &s1, Scan &s2);
118
119  /// @brief Test whether two scans lie adjacent to each other (but not overlapping).
120  bool adjacent(Scan &scan1, Scan &scan2);
121
122  /// @brief Return the null scan, y=-1, x=-1, xlen=0.
123  Scan nullScan();
124
125  /// @brief Examine a vector list of Scans and merge any that are touching.
126  void mergeList(std::vector<Scan> scanlist);
127
128  /// @brief Get the minimum separation, in pixels, between two scans.
129  float minSep(Scan &s1, Scan &s2);
130
131}
132
133#endif //SCAN_H
Note: See TracBrowser for help on using the repository browser.