Engauge Digitizer  2
Segment.h
1 /******************************************************************************************************
2  * (C) 2014 markummitchell@github.com. This file is part of Engauge Digitizer, which is released *
3  * under GNU General Public License version 2 (GPLv2) or (at your option) any later version. See file *
4  * LICENSE or go to gnu.org/licenses for details. Distribution requires prior written permission. *
5  ******************************************************************************************************/
6 
7 #ifndef SEGMENT_H
8 #define SEGMENT_H
9 
10 #include <QList>
11 #include <QObject>
12 #include <QPointF>
13 
15 class QGraphicsScene;
16 class QTextStream;
17 class SegmentLine;
18 
21 class Segment : public QObject
22 {
23  Q_OBJECT;
24 
25 public:
27  Segment(QGraphicsScene &scene,
28  int yLast,
29  bool isGnuplot);
30  ~Segment();
31 
33  void appendColumn(int x, int y, const DocumentModelSegments &modelSegments);
34 
36  QList<QPoint> fillPoints(const DocumentModelSegments &modelSegments);
37 
40  QPointF firstPoint () const;
41 
43  void forwardMousePress ();
44 
46  double length() const;
47 
49  int lineCount() const;
50 
55  void removeUnneededLines(int *foldedLines);
56 
58  void updateModelSegment(const DocumentModelSegments &modelSegments);
59 
60 public slots:
61 
63  void slotHover (bool hover);
64 
65 signals:
66 
68  void signalMouseClickOnSegment (QPointF posSegmentStart);
69 
70 private:
71  Segment();
72 
73  // While filling corners, create a point if any of the following are true:
74  // -it is the first point of the any line segment
75  // -it is different than the previous point
76  // While not filling corners, create a point if any of the following are true:
77  // -it is the first point of the first line segment
78  // -it is different than the previous point
79  void createAcceptablePoint(bool *pFirst,
80  QList<QPoint> *pList,
81  double *xPrev,
82  double *yPrev,
83  double x,
84  double y);
85 
92  void dumpToGnuplot (QTextStream &strDump,
93  int xInt,
94  int yInt,
95  const SegmentLine *lineOld,
96  const SegmentLine *lineNew) const;
97 
98  // Create evenly spaced points along the segment, with extra points to fill in corners.This algorithm is the
99  // same as fillPointsWithoutFillingCorners except extra points are inserted at the corners
100  QList<QPoint> fillPointsFillingCorners(const DocumentModelSegments &modelSegments);
101 
102  // Create evenly spaced points along the segment, without extra points in corners
103  QList<QPoint> fillPointsWithoutFillingCorners(const DocumentModelSegments &modelSegments);
104 
105  // A corner is defined as a point where the incoming slope is positive and the outgoing slope is zero
106  // or negative, or incoming slope is negative and the outgoing slope is zero or positive
107  bool isCorner (double yLast,
108  double yPrev,
109  double yNext) const;
110 
111  // Return true if point are a half pixel or less away from a line
112  bool pointIsCloseToLine(double xLeft, double yLeft, double xInt, double yInt,
113  double xRight, double yRight);
114 
115  // Return true if points are a half pixel or less away from a line
116  bool pointsAreCloseToLine(double xLeft, double yLeft, QList<QPoint> removedPoints,
117  double xRight, double yRight);
118 
119  QGraphicsScene &m_scene;
120 
121  // Y value of last point which is in previous column
122  int m_yLast;
123 
124  // Total length of lines owned by this segment, as floating point to allow fractional increments
125  double m_length;
126 
127  // This segment is drawn as a series of line segments
128  QList<SegmentLine*> m_lines;
129 
130  // True for gnuplot input files for debugging
131  bool m_isGnuplot;
132 };
133 
134 #endif // SEGMENT_H
void removeUnneededLines(int *foldedLines)
Try to compress a segment that was just completed, by folding together line from point i to point i+1...
Definition: Segment.cpp:420
void slotHover(bool hover)
Slot for hover enter/leave events in the associated SegmentLines.
Definition: Segment.cpp:526
void forwardMousePress()
Forward mouse press event from a component SegmentLine that was just clicked on.
Definition: Segment.cpp:302
void appendColumn(int x, int y, const DocumentModelSegments &modelSegments)
Add some more pixels in a new column to an active segment.
Definition: Segment.cpp:46
Selectable piecewise-defined line that follows a filtered line in the image.
Definition: Segment.h:21
QList< QPoint > fillPoints(const DocumentModelSegments &modelSegments)
Create evenly spaced points along the segment.
Definition: Segment.cpp:209
void signalMouseClickOnSegment(QPointF posSegmentStart)
Pass mouse press event, with coordinates of first point in the Segment since that info uniquely ident...
void updateModelSegment(const DocumentModelSegments &modelSegments)
Update this segment given the new settings.
Definition: Segment.cpp:538
int lineCount() const
Get method for number of lines.
Definition: Segment.cpp:384
Model for DlgSettingsSegments and CmdSettingsSegments.
QPointF firstPoint() const
Coordinates of first point in Segment.
Definition: Segment.cpp:285
This class is a special case of the standard QGraphicsLineItem for segments.
Definition: SegmentLine.h:17
double length() const
Get method for length in pixels.
Definition: Segment.cpp:379