Subversion Repositories public iLand

Rev

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

Rev Author Line No. Line
1
 
93 Werner 2
#include "global.h"
30 Werner 3
#include "stamp.h"
83 Werner 4
#include "grid.h"
5
#include "stampcontainer.h"
93 Werner 6
#include "helper.h"
30 Werner 7
Stamp::Stamp()
8
{
9
    m_data=0;
10
}
11
Stamp::~Stamp()
12
{
13
   if( m_data)
14
       delete m_data;
15
}
16
 
32 Werner 17
void Stamp::setup(const int size)
30 Werner 18
{
32 Werner 19
    int c=size*size;
20
    m_size=size;
34 Werner 21
    m_offset=0;
42 Werner 22
    m_readsum = 0.f;
47 Werner 23
    m_reader = 0;
149 werner 24
    m_dominance=0.f;
25
    m_crownArea=0.f;
26
    m_crownRadius=0.f;
32 Werner 27
    if (m_data)
28
        delete[] m_data;
30 Werner 29
    m_data=new float[c];
30
    for (int i=0;i<c;i++)
31
        m_data[i]=0.;
32
}
32 Werner 33
 
321 werner 34
QString Stamp::dump() const
35
{
36
    QString result, line;
37
    int x,y;
38
    for (y=0;y<m_size;++y)  {
39
        line="";
40
        for (x=0;x<m_size;++x)  {
41
            line+= QString::number(*data(x,y)) + " ";
42
        }
43
        line+="\r\n";
44
        result+=line;
45
    }
46
    return result;
47
}
48
 
32 Werner 49
void Stamp::loadFromFile(const QString &fileName)
50
{
51
    QString txt = Helper::loadTextFile(fileName);
52
    QStringList lines = txt.split("\n");
53
 
54
    setup(lines.count());
55
    int l=0;
56
    foreach(QString line, lines) {
57
        QStringList cols=line.split(";");
58
        if (cols.count() != lines.count())
59
            MSGRETURN("Stamp::loadFromFile: invalid count of rows/cols.");
60
        for (int i=0;i<cols.count();i++)
61
            *data(i,l)=cols[i].toFloat();
62
        l++;
63
    }
64
}
33 Werner 65
 
66
// load from stream....
67
void Stamp::load(QDataStream &in)
68
{
69
   // see StampContainer doc for file stamp binary format
70
   qint32 offset;
71
   in >> offset;
72
   m_offset = offset;
73
   // load data
74
   float data;
35 Werner 75
   for (int i=0;i<count(); i++) {
33 Werner 76
       in >> data;
77
       m_data[i]=data;
78
   }
79
}
80
 
81
void Stamp::save(QDataStream &out)
82
{
83
    // see StampContainer doc for file stamp binary format
84
   out << (qint32) m_offset;
35 Werner 85
   for (int i=0;i<count(); i++) {
33 Werner 86
       out << m_data[i];
87
   }
88
}
34 Werner 89
 
90
 
91
Stamp *stampFromGrid(const FloatGrid& grid, const int width)
92
{
93
    Stamp::StampType type=Stamp::est4x4;
35 Werner 94
    int c = grid.sizeX(); // total size of input grid
34 Werner 95
    if (c%2==0 || width%2==0) {
96
        qDebug() << "both grid and width should be uneven!!! returning NULL.";
97
        return NULL;
98
    }
99
 
35 Werner 100
    if (width<=4) type = Stamp::est4x4;
101
    else if (width<=8) type = Stamp::est8x8;
102
    else if (width<=12) type = Stamp::est12x12;
103
    else if (width<=16) type = Stamp::est16x16;
104
    else if (width<=24) type = Stamp::est24x24;
105
    else if (width<=32) type = Stamp::est32x32;
131 Werner 106
    else if (width<=48) type = Stamp::est48x48;
107
    else type = Stamp::est64x64;
34 Werner 108
 
109
    Stamp *stamp = StampContainer::newStamp(type);
52 Werner 110
    int swidth = width;
131 Werner 111
    if (width>63) {
112
        qDebug() << "Warning: grid too big, truncated stamp to 63x63px!";
113
        swidth = 63;
52 Werner 114
    }
115
    stamp->setOffset(swidth/2);
116
    int coff = c/2 - swidth/2; // e.g.: grid=25, width=7 -> coff = 12 - 3 = 9
34 Werner 117
    int x,y;
52 Werner 118
    for (x=0;x<swidth; x++)
119
        for (y=0; y<swidth; y++)
34 Werner 120
            stamp->setData(x,y, grid(coff+x, coff+y) ); // copy data (from a different rectangle)
121
    return stamp;
122
 
123
}