26 #ifndef GRALE_IMAGESDATA_H
28 #define GRALE_IMAGESDATA_H
30 #include "graleconfig.h"
34 #include <serut/serializationinterface.h>
35 #include <sys/types.h>
44 class CoordinateInterface;
46 template<
class T>
class Polygon2D;
48 class GRALE_IMPORTEXPORT ImagesData :
public errut::ErrorBase
52 ImagesData(
const ImagesData &data) { copyFrom(data); }
53 virtual ~ImagesData();
54 ImagesData *createCopy()
const;
56 bool createGridImage(Vector2D<double> bottomleft, Vector2D<double> topright,
int numx,
int numy,
57 const std::list<Triangle2D<double> > &excluderegions,
bool triangulate =
true,
58 bool useIntens =
false);
59 bool createGridImage(Vector2D<double> bottomleft, Vector2D<double> topright,
int numx,
int numy,
60 const std::list<ImagesData *> &excludeImages,
bool useIntens =
false,
61 bool storeMinimalDistances =
false);
63 bool create(
int numImages,
bool intensities,
bool shearInfo);
65 bool addGridImage(Vector2D<double> bottomleft, Vector2D<double> topright,
int numx,
int numy,
66 const std::list<Triangle2D<double> > &excluderegions,
bool triangulate =
true);
69 int addPoint(
int imageNumber, Vector2D<double> point);
70 int addPoint(
int imageNumber, Vector2D<double> point,
double intensity);
71 int addPoint(
int imageNumber, Vector2D<double> point,
double shearComponent1,
double shearComponent2);
72 int addPoint(
int imageNumber, Vector2D<double> point,
double intensity,
double shearComponent1,
double shearComponent2);
73 bool setImagePointIntensity(
int imageNumber,
int pointNumber,
double intensity);
76 bool addGroupPoint(
int groupNumber,
int imageIndex,
int pointIndex);
77 bool addTimeDelayInfo(
int imageIndex,
int pointIndex,
double timeDelay);
78 bool addTriangle(
int imageNumber,
int index1,
int index2,
int index3);
80 bool load(
const std::string &fname);
81 bool save(
const std::string &fname)
const;
82 bool read(serut::SerializationInterface &si);
83 bool write(serut::SerializationInterface &si)
const;
84 bool loadPNG(
const std::string &fname, Vector2D<double> bottomleft, Vector2D<double> topright,
85 bool nullspace =
false,
const std::string &maskfile = std::string(
""),
bool triangulate =
true);
86 bool loadFITS(
const std::string &fname,
bool nullspace =
false,
87 const std::string &maskfile = std::string(
""),
bool triangulate =
true);
88 bool loadFITS(
const std::string &fname,
double unit,
bool nullspace =
false,
89 const std::string &maskfile = std::string(
""),
bool triangulate =
true);
90 bool loadFITS(
const std::string &fname, Vector2D<double> bottomleft, Vector2D<double> topright,
91 bool nullspace =
false,
const std::string &maskfile = std::string(
""),
bool triangulate =
true);
93 bool hasIntensities()
const {
if (m_intensities.empty())
return false;
return true; }
94 bool hasShearInfo()
const {
if (m_shearComponent1s.empty())
return false;
return true; }
95 bool hasTimeDelays()
const {
if (m_timeDelayInfo.empty())
return false;
return true; }
97 int getNumberOfImages()
const {
return m_images.size(); }
98 int getNumberOfImagePoints(
int i)
const {
return m_images[i].size(); }
99 Vector2D<double> getImagePointPosition(
int image,
int point)
const {
return m_images[image][point]; }
100 double getImagePointIntensity(
int image,
int point)
const {
return m_intensities[image][point]; }
101 double getShearComponent1(
int image,
int point)
const {
return m_shearComponent1s[image][point]; }
102 double getShearComponent2(
int image,
int point)
const {
return m_shearComponent2s[image][point]; }
104 bool createTriangulation();
105 bool clearTriangulation();
106 bool hasTriangulation()
const {
if (m_triangulations.size() != 0)
return true;
return false; }
107 bool getTriangles(
int image, std::list<TriangleIndices> &triangles)
const;
108 bool getImageBorder(
int image, Polygon2D<double> &polygon)
const;
110 int getNumberOfGroups()
const {
return m_groupPoints.size(); }
111 int getNumberOfGroupPoints(
int group)
const {
return m_groupPoints[group].size()/2; }
112 void getGroupPointIndices(
int group,
int pointnr,
int *img,
int *point)
const { *img = m_groupPoints[group][pointnr*2]; *point = m_groupPoints[group][pointnr*2+1]; }
113 void clearGroupInfo() { m_groupPoints.clear(); }
115 int getNumberOfTimeDelays()
const {
return m_timeDelayInfo.size(); }
116 void getTimeDelay(
int index,
int *pImg,
int *pPoint,
double *pDelay)
const { *pImg = m_timeDelayInfo[index].getImageIndex(); *pPoint = m_timeDelayInfo[index].getPointIndex(); *pDelay = m_timeDelayInfo[index].getTimeDelay(); }
117 void clearTimeDelayInfo() { m_timeDelayInfo.clear(); }
119 Vector2D<double> getTopRightCorner()
const {
return m_topRight; }
120 Vector2D<double> getBottomLeftCorner()
const {
return m_bottomLeft; }
122 void subtractPosition(Vector2D<double> pos);
123 void subtractIntensity(
double v);
125 const ImagesData &operator=(
const ImagesData &dat) { clear(); copyFrom(dat);
return *
this; }
129 void copyFrom(
const ImagesData &data);
130 bool processData(
double *data, CoordinateInterface &coordcalc,
int numx,
int numy,
bool intens,
bool nullspace,
const std::string &maskfile,
bool triangulate);
131 bool createMap(
double *values,
int numx,
int numy,
const std::string &maskfile, std::vector<uint16_t> &map);
132 static int processTrianglePoint(Vector2D<double> p, std::vector<Vector2D<double> > &points);
133 static int processTrianglePoint(Vector2D<double> p, std::vector<Vector2D<double> > &points, std::vector<double> &intensities);
134 static void createLineSegments(
const std::list<IntVector2DPlus> &points, std::list<IntLine2D> &lines);
135 static void addLineSegment(std::list<IntLine2D> &lines, IntLine2D l);
136 static void createTriangulation(
const std::list<IntLine2D> &lines, std::list<TriangleIndices> &triangles,
int numx);
141 TimeDelayPoint(
int imageIndex,
int pointIndex,
double timeDelay)
143 m_imageIndex = imageIndex;
144 m_pointIndex = pointIndex;
145 m_timeDelay = timeDelay;
148 int getImageIndex()
const {
return m_imageIndex; }
149 int getPointIndex()
const {
return m_pointIndex; }
150 double getTimeDelay()
const {
return m_timeDelay; }
157 std::vector<std::vector<Vector2D<double> > > m_images;
158 std::vector<std::vector<double> > m_intensities;
159 std::vector<std::vector<double> > m_shearComponent1s;
160 std::vector<std::vector<double> > m_shearComponent2s;
161 std::vector<std::vector<int32_t> > m_groupPoints;
162 std::vector<std::list<TriangleIndices> > m_triangulations;
163 std::vector<TimeDelayPoint> m_timeDelayInfo;
164 Vector2D<double> m_bottomLeft;
165 Vector2D<double> m_topRight;
168 class ImagesDataExtended :
public ImagesData
171 ImagesDataExtended() { D_s = 0; D_ds = 0; }
172 ImagesDataExtended(
const ImagesDataExtended &dat) : ImagesData(dat) { D_s = dat.D_s; D_ds = dat.D_ds; std::list<double>::const_iterator it;
for (it = dat.extraparameters.begin() ; it != dat.extraparameters.end() ; it++) extraparameters.push_back(*it); }
173 ImagesDataExtended(
double D_s,
double D_ds) { ImagesDataExtended::D_s = D_s; ImagesDataExtended::D_ds = D_ds; }
174 ~ImagesDataExtended() { }
175 double getD_s()
const {
return D_s; }
176 double getD_ds()
const {
return D_ds; }
177 void setD_s(
double v) { D_s = v; }
178 void setD_ds(
double v) { D_ds = v; }
180 bool read(serut::SerializationInterface &si);
181 bool write(serut::SerializationInterface &si)
const;
183 const ImagesDataExtended &operator=(
const ImagesDataExtended &dat) { D_s = dat.D_s; D_ds = dat.D_ds; ImagesData::operator=(dat); }
185 void clearExtraParameters() { extraparameters.clear(); }
186 void addExtraParameter(
double val) { extraparameters.push_back(val); }
187 int getNumberOfExtraParameters()
const {
return extraparameters.size(); }
188 bool getExtraParameter(
int idx,
double *val)
const {
if (idx < 0 || idx >= extraparameters.size()) { setErrorString(
"Index out of bounds");
return false; } std::list<double>::const_iterator it = extraparameters.begin();
while (idx > 0) { it++; idx--; } *val = *it;
return true; }
191 std::list<double> extraparameters;
196 #endif // GRALE_IMAGESDATA_H