Subversion Repositories public iLand

Rev

Rev 47 | Rev 58 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1
 
33 Werner 2
#ifndef STAMPCONTAINER_H
3
#define STAMPCONTAINER_H
4
 
5
#include "stamp.h"
6
#include "grid.h"
7
 
8
/** Collection of @class Stamp for one tree species.
9
  Per species several stamps are stored (different BHD, different HD relations). This class
10
  encapsulates storage and access to these stamps. The design goal is to deliver high
38 Werner 11
  access speeds for the "stamp()" method.
33 Werner 12
  Use getStamp(bhd, hd) or getStamp(bhd, height) to access. */
13
class StampContainer
14
{
15
public:
16
    StampContainer();
17
    ~StampContainer();
18
    void useLookup(const bool use) { m_useLookup = use; }
19
    /// addStamp() add a pre-allocated stamp @param stamp to internal collection. Caller must allocate stamp on the heap,
20
    /// freeing is done by this class.
47 Werner 21
    int addStamp(Stamp* stamp, const float bhd, const float hd_value, const float crown_radius_m);
40 Werner 22
    int addReaderStamp(Stamp *stamp, const float crown_radius_m);
39 Werner 23
    const Stamp* stamp(const float bhd_cm, const float height_m) const;
40 Werner 24
    const Stamp* readerStamp(const float crown_radius_m) const; ///< retrieve reader-stamp. @param radius of crown in m. @return the appropriate stamp or NULL if not found.
39 Werner 25
    const int count() const { return m_stamps.count(); }
33 Werner 26
    /// save the content of the StampContainer to the output stream (binary encoding)
27
    void save(QDataStream &out);
34 Werner 28
    /// load the content of the StampContainer to the output stream (binary encoding)
33 Werner 29
    void load(QDataStream &in);
34 Werner 30
 
31
    /** factory creation function for stamps of different size.
32
        newStamp() creates new Stamp-Objects on the heap with a given type (see @enum Stamp::StampType).*/
33
    static Stamp* newStamp(const Stamp::StampType type);
47 Werner 34
    /** this functions attaches the appropriate reader (dep. on crown radius) to each stamp of the container.
35
        The reader-stamp is returned by a call to the reader()-function of the Stamp itself.
36
        @param Container holding the reader stamps.*/
37
    void attachReaderStamps(const StampContainer &source);
51 Werner 38
    void invert(); ///< invert stamps (value = 1. - value) (for multiplicative overlay)
34 Werner 39
 
35 Werner 40
    QString dump();
41
 
33 Werner 42
private:
43
    static const int cBHDclassWidth;
44
    static const int cHDclassWidth;
45
    static const int cBHDclassLow; ///< bhd classes start with 2: class 0 = 2..6, class1 = 6..10
46
    static const int cHDclassLow; ///< hd classes offset is 40: class 0 = 40-50, class 1 = 50-60
47
    static const int cBHDclassCount; ///< class count, 50: highest class = 50*4 +- 2 = 198 - 202
48
    static const int cHDclassCount; ///< class count. highest class: 140-150
49
    struct StampItem {
50
        Stamp* stamp;
51
        float bhd;
52
        float hd;
47 Werner 53
        float crown_radius;
33 Werner 54
    };
55
    inline int getKey(const float bhd, const float hd_value);
56
    int m_maxBhd;
57
    bool m_useLookup; // use lookup table?
58
    QList<StampItem> m_stamps;
59
    Grid<Stamp*> m_lookup;
60
};
61
 
62
#endif // STAMPCONTAINER_H