13#include <QGraphicsEllipseItem>
14#include <QGraphicsPolygonItem>
15#include <QGraphicsRectItem>
16#include <QGraphicsScene>
22 m_posScreenParallelogramTL (0, 0),
23 m_posScreenParallelogramTR (0, 0),
24 m_posScreenParallelogramBL (0, 0),
25 m_posScreenParallelogramBR (0, 0),
26 m_angleGraphAxisFromScreenAxis (0),
27 m_angleEllipseFromMajorAxis (0),
66 m_radius (other.
radius ()),
81 m_radius = other.
radius ();
96void CentipedeDebugPolar::addToLegend (QGraphicsScene &scene,
100 const int LEGEND_X_POS = 5, LEGEND_Y_STEP = 20;
102 QGraphicsTextItem *itemGraphCoords =
new QGraphicsTextItem (entry);
103 itemGraphCoords->setPos (QPointF (LEGEND_X_POS, LEGEND_Y_STEP * (m_legendYPos++)));
104 itemGraphCoords->setDefaultTextColor (color);
105 scene.addItem (itemGraphCoords);
110 return m_angleEllipseFromMajorAxis;
115 return m_angleGraphAxisFromScreenAxis;
132 QPointF posOriginGraph (0, 0), posOriginScreen;
134 posOriginGraph = QPointF (0,
141 QVector<QPointF> points;
142 points << m_posScreenParallelogramBL;
143 points << m_posScreenParallelogramTL;
144 points << m_posScreenParallelogramTR;
145 points << m_posScreenParallelogramBR;
146 points << m_posScreenParallelogramBL;
147 QGraphicsPolygonItem *parallelogram =
new QGraphicsPolygonItem (points);
148 parallelogram->setPen (QPen (Qt::green));
150 QString (
"Parallelogram a=%1 b=%2").arg (m_aAligned).arg (m_bAligned),
152 scene.addItem (parallelogram);
155 QPointF posAbsolute0 = (m_posScreenParallelogramTR + m_posScreenParallelogramBR) / 2.0;
156 QLineF xAxisLine0 (posOriginScreen,
158 QPointF posRelative0 = posAbsolute0 - posOriginScreen;
159 double ang = qDegreesToRadians (45.0);
160 double ca = qCos (ang);
161 double sa = qSin (ang);
162 QLineF xAxisLine45 (posOriginScreen,
163 posOriginScreen + QPointF (ca * posRelative0.x() + sa * posRelative0.y(),
164 -1.0 * sa * posRelative0.x() + ca * posRelative0.y()));
165 QGraphicsLineItem *xAxisParallelogram0 =
new QGraphicsLineItem (xAxisLine0);
166 QGraphicsLineItem *xAxisParallelogram45 =
new QGraphicsLineItem (xAxisLine45);
167 xAxisParallelogram0->setPen (QPen (Qt::green));
168 xAxisParallelogram45->setPen (QPen (Qt::green));
169 scene.addItem (xAxisParallelogram0);
170 scene.addItem (xAxisParallelogram45);
173 QRectF rect (posOriginScreen.x() - m_aAligned,
174 posOriginScreen.y() - m_bAligned,
177 rect.setLeft (posOriginScreen.x() - m_aAligned);
178 rect.setTop (posOriginScreen.y() - m_bAligned);
181 QGraphicsRectItem *rectItem =
new QGraphicsRectItem (rect);
182 rectItem->setTransformOriginPoint(posOriginScreen);
183 rectItem->setRotation (qRadiansToDegrees (m_angleEllipseFromMajorAxis));
184 rectItem->setPen (QPen (Qt::cyan));
186 QString (
"Rectangle rotation=%1").arg (qRadiansToDegrees (m_angleEllipseFromMajorAxis)),
188 scene.addItem (rectItem);
191 QLineF xAxisRectangle (posOriginScreen,
192 (rect.topRight() + rect.bottomRight()) / 2.0);
193 QGraphicsLineItem *xAxisRect =
new QGraphicsLineItem (xAxisRectangle);
194 xAxisRect->setTransformOriginPoint (posOriginScreen);
195 xAxisRect->setRotation (m_angleGraphAxisFromScreenAxis);
196 xAxisRect->setPen (QPen (Qt::cyan));
197 scene.addItem (xAxisRect);
200 QGraphicsEllipseItem *ellipse =
new QGraphicsEllipseItem (rect);
201 ellipse->setTransformOriginPoint (posOriginScreen);
202 ellipse->setRotation (qRadiansToDegrees (m_angleGraphAxisFromScreenAxis));
203 ellipse->setPen (QPen (Qt::red));
204 scene.addItem (ellipse);
207 QPointF posAAxisGraph (0, m_radius), posBAxisGraph (90, m_radius);
208 QPointF posAAxisScreen, posBAxisScreen;
219 QColor (255, 150, 150));
223 <<
" angleFromAxis=" << qDegreesToRadians (m_angleEllipseFromMajorAxis)
224 <<
" angleFromScreen=" << qDegreesToRadians (m_angleGraphAxisFromScreenAxis);
228void CentipedeDebugPolar::displayTics (QGraphicsScene &scene,
230 const QPointF &posOriginScreen,
231 const QPointF &posAAxisScreen,
232 const QColor &colorGraphCoordinates,
233 const QColor &colorScreenCoordinates)
235 const int DEGREES_BETWEEN_HIGHLIGHTS = 10;
240 colorGraphCoordinates);
243 colorScreenCoordinates);
246 QPointF basisX = (posAAxisScreen - posOriginScreen) /
magnitude (posAAxisScreen - posOriginScreen);
247 QPointF basisY (basisX.y(),
251 double cosOffset = qCos (m_angleGraphAxisFromScreenAxis);
252 double sinOffset = qSin (m_angleGraphAxisFromScreenAxis);
253 for (
int degrees = 0; degrees < 360; degrees++) {
255 QString degreesMinus180ToPlus180 = QString::number (degrees > 180 ?
261 double radians = qDegreesToRadians ((
double) degrees) - m_angleEllipseFromMajorAxis;
262 double cosLoop = qCos(-1.0 * radians - m_angleEllipseFromMajorAxis);
263 double sinLoop = qSin(-1.0 * radians - m_angleEllipseFromMajorAxis);
264 double denominator = cosLoop * cosLoop / m_aAligned / m_aAligned + sinLoop * sinLoop / m_bAligned / m_bAligned;
265 double radius = qSqrt (1.0 / denominator);
266 double x =
radius * cosLoop;
267 double y =
radius * sinLoop;
268 double xRotated = cosOffset * x - sinOffset * y;
269 double yRotated = sinOffset * x + cosOffset * y;
270 QPointF posRadial (xRotated,
273 QLineF linePortion = portionOfLineLast (QLineF (posOriginScreen,
274 posOriginScreen + posRadial),
276 DEGREES_BETWEEN_HIGHLIGHTS);
277 QGraphicsLineItem *radialFirst =
new QGraphicsLineItem (linePortion);
278 radialFirst->setPen (QPen (colorScreenCoordinates));
279 scene.addItem (radialFirst);
281 if (degrees % DEGREES_BETWEEN_HIGHLIGHTS == 0) {
282 QGraphicsTextItem *labelFirst =
new QGraphicsTextItem (degreesMinus180ToPlus180);
283 labelFirst->setPos (linePortion.p1());
284 labelFirst->setDefaultTextColor (colorScreenCoordinates);
285 scene.addItem (labelFirst);
293 linePortion = portionOfLineNext (QLineF (posOriginScreen,
296 DEGREES_BETWEEN_HIGHLIGHTS);
297 QGraphicsLineItem *radialSecond =
new QGraphicsLineItem (linePortion);
298 radialSecond->setPen (QPen (colorGraphCoordinates));
299 scene.addItem (radialSecond);
301 if (degrees % DEGREES_BETWEEN_HIGHLIGHTS == 0) {
302 QGraphicsTextItem *labelSecond =
new QGraphicsTextItem (degreesMinus180ToPlus180);
303 labelSecond->setPos (linePortion.p1());
304 labelSecond->setDefaultTextColor (colorGraphCoordinates);
305 scene.addItem (labelSecond);
311 const QGraphicsEllipseItem *ellipse)
const
316 << callerMethod.toLatin1().data();
327QLineF CentipedeDebugPolar::portionOfLineLast (
const QLineF &line,
329 int degreesBetweenHighlights)
const
331 double s = (degrees % degreesBetweenHighlights == 0 ? 0.9 : 0.975);
332 QPointF posNewStart = (1.0 - s) * line.p1() + s * line.p2 ();
333 return QLineF(posNewStart,
337QLineF CentipedeDebugPolar::portionOfLineNext (
const QLineF &line,
339 int degreesBetweenHighlights)
const
341 double s = (degrees % degreesBetweenHighlights == 0 ? 1.1 : 1.025);
342 QPointF posNewStart = (1.0 - s) * line.p1() + s * line.p2 ();
343 return QLineF(posNewStart,
349 return m_posScreenParallelogramBL;
354 return m_posScreenParallelogramBR;
359 return m_posScreenParallelogramTL;
364 return m_posScreenParallelogramTR;
log4cpp::Category * mainCat
QString QPointFToString(const QPointF &pos)
QString QRectFToString(const QRectF &rectF)
QPointF posScreenParallelogramTL() const
Get method for top left corner of rectangle.
double radius() const
Get method for radius.
QPointF posScreenParallelogramBL() const
Get method for bottom left corner of rectangle.
QPointF posScreenParallelogramBR() const
Get method for bottom right corner of rectangle.
void display(QGraphicsScene &scene, const DocumentModelCoords &modelCoords, const Transformation &transformation)
Display member variable values on scene.
CentipedeDebugPolar & operator=(const CentipedeDebugPolar &other)
Assignment operator.
double angleGraphAxisFromScreenAxis() const
Get method for top left corner of rectangle.
double aAligned() const
Get method for top left corner of rectangle.
double bAligned() const
Get method for top left corner of rectangle.
void dumpEllipseGraphicsItem(const QString &callerMethod, const QGraphicsEllipseItem *ellipse) const
Dump ellipse grahics item.
double angleEllipseFromMajorAxis() const
Get method for top left corner of rectangle.
CentipedeDebugPolar()
Default constructor with initial values overwritten later.
virtual ~CentipedeDebugPolar()
QPointF posScreenParallelogramTR() const
Get method for top right corner of rectangle.
Model for DlgSettingsCoords and CmdSettingsCoords.
CoordScale coordScaleYRadius() const
Get method for linear/log scale on y/radius.
double originRadius() const
Get method for origin radius in polar mode.
#define LOG4CPP_DEBUG_S(logger)
double magnitude(const QPointF &vec)
Norm of vector.