00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00024
00025 #include <QVImageCanvas>
00026
00027 #include <qvmath.h>
00028 #include <qvdta.h>
00029 #include <qvip.h>
00030
00031 #include <QVMatrix>
00032 #include <QVWorker>
00033
00034 #ifndef CULEBRILLAS_H
00035 #define CULEBRILLAS_H
00036 #ifndef DOXYGEN_IGNORE_THIS
00037 class Culebrilla
00038 {
00039 public:
00040 Culebrilla(const QPointF &point, const int frameNumber, const double minPointDistance):
00041 firstFrameNumber(frameNumber), lastFrameNumber(frameNumber), minPointDistance(minPointDistance), points()
00042 { points.insert(frameNumber, point); }
00043
00044 Culebrilla(const Culebrilla &culebrilla):
00045 firstFrameNumber(culebrilla.firstFrameNumber), lastFrameNumber(culebrilla.lastFrameNumber),
00046 minPointDistance(culebrilla.minPointDistance), points(culebrilla.points)
00047 { }
00048
00049 Culebrilla(): firstFrameNumber(-1), lastFrameNumber(-1), minPointDistance(-1), points() { }
00050
00052
00053 bool operator==(const Culebrilla culebrilla) const
00054 {
00055 if (getFirstFrameNumber() != culebrilla.getFirstFrameNumber())
00056 return false;
00057 if (getPointAtFrame(getFirstFrameNumber()) != culebrilla.getPointAtFrame(culebrilla.getFirstFrameNumber()) )
00058 return false;
00059
00060 return true;
00061 };
00062
00064
00065 const int getNumberOfFrames() const { return 1 + lastFrameNumber - firstFrameNumber; }
00066 const int getFirstFrameNumber() const { return firstFrameNumber; }
00067 const int getLastFrameNumber() const { return lastFrameNumber; }
00068 QList<QPointF> getPointList() const { return points.values(); }
00069
00070 bool addPoint(const QPointF &point, const int frameNumber);
00071 const QPointF getPointAtFrame(const int frame) const;
00072
00073 private:
00074
00075
00076 int firstFrameNumber, lastFrameNumber;
00077 double minPointDistance;
00078
00079 QMap<int, QPointF> points;
00080 };
00081
00082
00083 class CulebrillaContainer
00084 {
00085 public:
00086 CulebrillaContainer(const double minPointDistance = 0.005):
00087 lastMatchingPoints(), newMatchingPoints(), actualFrameNumber(0), minPointDistance(minPointDistance)
00088 { }
00089
00090 const int getActualFrameNumber() const { return actualFrameNumber; }
00091 const QList< Culebrilla > getCulebrillas() const { return newMatchingPoints.values(); }
00092 const QList< QList<QPointF> > getCulebrillasAsPolylines() const;
00093 void addMatching(const QPointF sourcePoint, const QPointF destinationPoint);
00094 void step();
00095
00096 private:
00097
00098 QHash<QPointF, Culebrilla> lastMatchingPoints, newMatchingPoints;
00099 int actualFrameNumber;
00100 const double minPointDistance;
00101
00102 };
00103
00104 Q_DECLARE_METATYPE(CulebrillaContainer);
00105
00106
00107 inline uint qHash(const Culebrilla &culebrilla) { return qHash(culebrilla.getFirstFrameNumber()) + qHash(culebrilla.getPointAtFrame(culebrilla.getFirstFrameNumber())); }
00108 Q_DECLARE_METATYPE(QSet<Culebrilla>);
00109 #endif
00110 #endif