8 #include "DocumentModelCoords.h" 9 #include "DocumentModelGridDisplay.h" 10 #include "EngaugeAssert.h" 11 #include "EnumsToQt.h" 12 #include "GraphicsArcItem.h" 13 #include "GridLineFactory.h" 14 #include "GridLineLimiter.h" 15 #include "GridLines.h" 16 #include "GridLineStyle.h" 18 #include "MainWindowModel.h" 19 #include <QGraphicsScene> 21 #include <QTextStream> 22 #include "QtToString.h" 23 #include "Transformation.h" 25 const int Z_VALUE_IN_FRONT = 100;
28 const double CHECKER_OPACITY = 0.6;
30 const double PI = 3.1415926535;
31 const double TWO_PI = 2.0 * PI;
32 const double DEGREES_TO_RADIANS = PI / 180.0;
33 const double RADIANS_TO_TICS = 5760 / TWO_PI;
39 m_modelCoords (modelCoords),
42 LOG4CPP_DEBUG_S ((*mainCat)) <<
"GridLineFactory::GridLineFactory";
47 const QList<Point> &pointsToIsolate,
50 m_pointRadius (pointRadius),
51 m_pointsToIsolate (pointsToIsolate),
52 m_modelCoords (modelCoords),
55 LOG4CPP_DEBUG_S ((*mainCat)) <<
"GridLineFactory::GridLineFactory" 56 <<
" pointRadius=" << pointRadius
57 <<
" pointsToIsolate=" << pointsToIsolate.count();
60 void GridLineFactory::bindItemToScene(QGraphicsItem *item)
const 62 LOG4CPP_DEBUG_S ((*mainCat)) <<
"GridLineFactory::bindItemToScene";
64 item->setOpacity (CHECKER_OPACITY);
65 item->setZValue (Z_VALUE_IN_FRONT);
67 item->setToolTip (QObject::tr (
"Axes checker. If this does not align with the axes, then the axes points should be checked"));
70 m_scene.addItem (item);
79 LOG4CPP_DEBUG_S ((*mainCat)) <<
"GridLineFactory::createGridLine" 96 const int NUM_STEPS = 1000;
98 bool stateSegmentIsActive =
false;
99 QPointF posStartScreen (0, 0);
102 for (
int i = 0; i <= NUM_STEPS; i++) {
104 double s = (double) i / (
double) NUM_STEPS;
107 double xGraph = (1.0 - s) * xFrom + s * xTo;
108 double yGraph = (1.0 - s) * yFrom + s * yTo;
112 xGraph = qExp ((1.0 - s) * qLn (xFrom) + s * qLn (xTo));
115 yGraph = qExp ((1.0 - s) * qLn (yFrom) + s * qLn (yTo));
122 double distanceToNearestPoint = minScreenDistanceFromPoints (pointScreen);
123 if ((distanceToNearestPoint < m_pointRadius) ||
127 if (stateSegmentIsActive) {
130 finishActiveGridLine (posStartScreen,
136 stateSegmentIsActive =
false;
142 if (!stateSegmentIsActive) {
145 stateSegmentIsActive =
true;
146 posStartScreen = pointScreen;
165 modelGridDisplay.
stable()) {
167 double startX = modelGridDisplay.
startX ();
168 double startY = modelGridDisplay.
startY ();
169 double stepX = modelGridDisplay.
stepX ();
170 double stepY = modelGridDisplay.
stepY ();
171 double stopX = modelGridDisplay.
stopX ();
172 double stopY = modelGridDisplay.
stopY ();
194 if (stepX > (isLinearX ? 0 : 1) &&
195 stepY > (isLinearY ? 0 : 1) &&
196 (isLinearX || (startX > 0)) &&
197 (isLinearY || (startY > 0))) {
199 QColor color (ColorPaletteToQColor (modelGridDisplay.
paletteColor()));
200 QPen pen (QPen (color,
204 for (
double x = startX; x <= stopX; (isLinearX ? x += stepX : x *= stepX)) {
208 gridLines.
add (gridLine);
211 for (
double y = startY; y <= stopY; (isLinearY ? y += stepY : y *= stepY)) {
215 gridLines.
add (gridLine);
221 void GridLineFactory::createTransformAlign (
const Transformation &transformation,
222 double radiusLinearCartesian,
223 const QPointF &posOriginScreen,
224 QTransform &transformAlign,
225 double &ellipseXAxis,
226 double &ellipseYAxis)
const 239 QPointF posXRadiusY0Graph (radiusLinearCartesian, 0), posX0YRadiusGraph (0, radiusLinearCartesian);
240 QPointF posXRadiusY0Screen, posX0YRadiusScreen;
247 QPointF deltaXRadiusY0 = posXRadiusY0Screen - posOriginScreen;
248 QPointF deltaX0YRadius = posX0YRadiusScreen - posOriginScreen;
249 ellipseXAxis = qSqrt (deltaXRadiusY0.x () * deltaXRadiusY0.x () +
250 deltaXRadiusY0.y () * deltaXRadiusY0.y ());
251 ellipseYAxis = qSqrt (deltaX0YRadius.x () * deltaX0YRadius.x () +
252 deltaX0YRadius.y () * deltaX0YRadius.y ());
255 QPointF posXRadiusY0AlignedScreen (posOriginScreen.x() + ellipseXAxis, posOriginScreen.y());
256 QPointF posX0YRadiusAlignedScreen (posOriginScreen.x(), posOriginScreen.y() - ellipseYAxis);
262 posXRadiusY0AlignedScreen,
263 posX0YRadiusAlignedScreen);
265 LOG4CPP_INFO_S ((*mainCat)) <<
"GridLineFactory::createTransformAlign" 266 <<
" transformation=" << QTransformToString (transformation.
transformMatrix()).toLatin1().data() << endl
267 <<
" radiusLinearCartesian=" << radiusLinearCartesian
268 <<
" posXRadiusY0Screen=" << QPointFToString (posXRadiusY0Screen).toLatin1().data()
269 <<
" posX0YRadiusScreen=" << QPointFToString (posX0YRadiusScreen).toLatin1().data()
270 <<
" ellipseXAxis=" << ellipseXAxis
271 <<
" ellipseYAxis=" << ellipseYAxis
272 <<
" posXRadiusY0AlignedScreen=" << QPointFToString (posXRadiusY0AlignedScreen).toLatin1().data()
273 <<
" posX0YRadiusAlignedScreen=" << QPointFToString (posX0YRadiusAlignedScreen).toLatin1().data()
274 <<
" transformAlign=" << QTransformToString (transformAlign).toLatin1().data();
277 QGraphicsItem *GridLineFactory::ellipseItem (
const Transformation &transformation,
278 double radiusLinearCartesian,
279 const QPointF &posStartScreen,
280 const QPointF &posEndScreen)
const 284 QPointF posStartGraph, posEndGraph;
292 double angleStart = posStartGraph.x() * DEGREES_TO_RADIANS;
293 double angleEnd = posEndGraph.x() * DEGREES_TO_RADIANS;
294 if (angleEnd < angleStart) {
297 double angleSpan = angleEnd - angleStart;
300 QPointF posOriginGraph (0, 0), posOriginScreen;
304 LOG4CPP_INFO_S ((*mainCat)) <<
"GridLineFactory::ellipseItem" 305 <<
" radiusLinearCartesian=" << radiusLinearCartesian
306 <<
" posStartScreen=" << QPointFToString (posStartScreen).toLatin1().data()
307 <<
" posEndScreen=" << QPointFToString (posEndScreen).toLatin1().data()
308 <<
" posOriginScreen=" << QPointFToString (posOriginScreen).toLatin1().data()
309 <<
" angleStart=" << angleStart / DEGREES_TO_RADIANS
310 <<
" angleEnd=" << angleEnd / DEGREES_TO_RADIANS
311 <<
" transformation=" << transformation;
316 double ellipseXAxis, ellipseYAxis;
317 QTransform transformAlign;
318 createTransformAlign (transformation,
319 radiusLinearCartesian,
326 QRectF boundingRect (-1.0 * ellipseXAxis + posOriginScreen.x(),
327 -1.0 * ellipseYAxis + posOriginScreen.y(),
331 item->setStartAngle (angleStart * RADIANS_TO_TICS);
332 item->setSpanAngle (angleSpan * RADIANS_TO_TICS);
334 item->setTransform (transformAlign.transposed ().inverted ());
339 void GridLineFactory::finishActiveGridLine (
const QPointF &posStartScreen,
340 const QPointF &posEndScreen,
346 LOG4CPP_DEBUG_S ((*mainCat)) <<
"GridLineFactory::finishActiveGridLine" 347 <<
" posStartScreen=" << QPointFToString (posStartScreen).toLatin1().data()
348 <<
" posEndScreen=" << QPointFToString (posEndScreen).toLatin1().data()
349 <<
" yFrom=" << yFrom
353 if ((m_modelCoords.
coordsType() == COORDS_TYPE_POLAR) &&
357 double radiusLinearCartesian = yFrom;
366 item = ellipseItem (transformation,
367 radiusLinearCartesian,
374 item = lineItem (posStartScreen,
379 bindItemToScene (item);
382 QGraphicsItem *GridLineFactory::lineItem (
const QPointF &posStartScreen,
383 const QPointF &posEndScreen)
const 385 LOG4CPP_DEBUG_S ((*mainCat)) <<
"GridLineFactory::lineItem" 386 <<
" posStartScreen=" << QPointFToString (posStartScreen).toLatin1().data()
387 <<
" posEndScreen=" << QPointFToString (posEndScreen).toLatin1().data();
389 return new QGraphicsLineItem (QLineF (posStartScreen,
393 double GridLineFactory::minScreenDistanceFromPoints (
const QPointF &posScreen)
395 double minDistance = 0;
396 for (
int i = 0; i < m_pointsToIsolate.count (); i++) {
397 const Point &pointCenter = m_pointsToIsolate.at (i);
399 double dx = posScreen.x() - pointCenter.
posScreen().x();
400 double dy = posScreen.y() - pointCenter.
posScreen().y();
402 double distance = qSqrt (dx * dx + dy * dy);
403 if (i == 0 || distance < minDistance) {
404 minDistance = distance;
double stopX() const
Get method for x grid line upper bound (inclusive).
double stepX() const
Get method for x grid line increment.
Model for DlgSettingsGridDisplay and CmdSettingsGridDisplay.
void createGridLinesForEvenlySpacedGrid(const DocumentModelGridDisplay &modelGridDisplay, const Document &document, const MainWindowModel &modelMainWindow, const Transformation &transformation, GridLines &gridLines)
Create a rectangular (cartesian) or annular (polar) grid of evenly spaced grid lines.
CoordScale coordScaleYRadius() const
Get method for linear/log scale on y/radius.
double originRadius() const
Get method for origin radius in polar mode.
Draw an arc as an ellipse but without lines from the center to the start and end points.
double startX() const
Get method for x grid line lower bound (inclusive).
Class that represents one digitized point. The screen-to-graph coordinate transformation is always ex...
QPointF posScreen() const
Accessor for screen position.
void limitForXTheta(const Document &document, const Transformation &transformation, const DocumentModelCoords &modelCoords, const MainWindowModel &modelMainWindow, const DocumentModelGridDisplay &modelGrid, double &startX, double &stepX) const
Limit step value for x/theta coordinate. This is a noop if the maximum grid line limit in MainWindowM...
CoordScale coordScaleXTheta() const
Get method for linear/log scale on x/theta.
Model for DlgSettingsMainWindow.
Container class for GridLine objects.
CoordsType coordsType() const
Get method for coordinates type.
Model for DlgSettingsCoords and CmdSettingsCoords.
Storage of one imported image and the data attached to that image.
ColorPalette paletteColor() const
Get method for color.
double stopY() const
Get method for y grid line upper bound (inclusive).
double startY() const
Get method for y grid line lower bound (inclusive).
void limitForYRadius(const Document &document, const Transformation &transformation, const DocumentModelCoords &modelCoords, const MainWindowModel &modelMainWindow, const DocumentModelGridDisplay &modelGrid, double &startY, double &stepY) const
Limit step value for y/range coordinate. This is a noop if the maximum grid line limit in MainWindowM...
double stepY() const
Get method for y grid line increment.
GridLineFactory(QGraphicsScene &scene, const DocumentModelCoords &modelCoords)
Simple constructor for general use (i.e. not by Checker)
void add(GridLine *gridLine)
Add specified grid line. Ownership of all allocated QGraphicsItems is passed to new GridLine...
bool stable() const
Get method for stable flag.
void setPen(const QPen &pen)
Set the pen style.
Single grid line drawn a straight or curved line.
Limit the number of grid lines so a bad combination of start/step/stop value will not lead to extreme...
GridLine * createGridLine(double xFrom, double yFrom, double xTo, double yTo, const Transformation &transformation)
Create grid line, either along constant X/theta or constant Y/radius side.
void add(QGraphicsItem *item)
Add graphics item which represents one segment of the line.