19#include <QGraphicsScene>
30const double PI = 3.1415926535;
39 m_modelCoords (modelCoords),
47 const QList<Point> &pointsToIsolate,
50 m_pointRadius (pointRadius),
51 m_pointsToIsolate (pointsToIsolate),
52 m_modelCoords (modelCoords),
56 <<
" pointRadius=" << pointRadius
57 <<
" pointsToIsolate=" << pointsToIsolate.count();
60void GridLineFactory::bindItemToScene(QGraphicsItem *item)
const
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);
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 ();
196 if (stepX > (isLinearX ? 0 : 1) &&
197 stepY > (isLinearY ? 0 : 1) &&
198 (isLinearX || (startX > 0)) &&
199 (isLinearY || (startY > 0))) {
202 QPen pen (QPen (color,
206 for (
double x = startX; x <= stopX; (isLinearX ? x += stepX : x *= stepX)) {
210 gridLines.
add (gridLine);
213 for (
double y = startY; y <= stopY; (isLinearY ? y += stepY : y *= stepY)) {
217 gridLines.
add (gridLine);
223void GridLineFactory::createTransformAlign (
const Transformation &transformation,
224 double radiusLinearCartesian,
225 const QPointF &posOriginScreen,
226 QTransform &transformAlign,
227 double &ellipseXAxis,
228 double &ellipseYAxis)
const
241 QPointF posXRadiusY0Graph (radiusLinearCartesian, 0), posX0YRadiusGraph (0, radiusLinearCartesian);
242 QPointF posXRadiusY0Screen, posX0YRadiusScreen;
249 QPointF deltaXRadiusY0 = posXRadiusY0Screen - posOriginScreen;
250 QPointF deltaX0YRadius = posX0YRadiusScreen - posOriginScreen;
251 ellipseXAxis = qSqrt (deltaXRadiusY0.x () * deltaXRadiusY0.x () +
252 deltaXRadiusY0.y () * deltaXRadiusY0.y ());
253 ellipseYAxis = qSqrt (deltaX0YRadius.x () * deltaX0YRadius.x () +
254 deltaX0YRadius.y () * deltaX0YRadius.y ());
257 QPointF posXRadiusY0AlignedScreen (posOriginScreen.x() + ellipseXAxis, posOriginScreen.y());
258 QPointF posX0YRadiusAlignedScreen (posOriginScreen.x(), posOriginScreen.y() - ellipseYAxis);
264 posXRadiusY0AlignedScreen,
265 posX0YRadiusAlignedScreen);
270 <<
" radiusLinearCartesian=" << radiusLinearCartesian
271 <<
" posXRadiusY0Screen=" <<
QPointFToString (posXRadiusY0Screen).toLatin1().data()
272 <<
" posX0YRadiusScreen=" <<
QPointFToString (posX0YRadiusScreen).toLatin1().data()
273 <<
" ellipseXAxis=" << ellipseXAxis
274 <<
" ellipseYAxis=" << ellipseYAxis
275 <<
" posXRadiusY0AlignedScreen=" <<
QPointFToString (posXRadiusY0AlignedScreen).toLatin1().data()
276 <<
" posX0YRadiusAlignedScreen=" <<
QPointFToString (posX0YRadiusAlignedScreen).toLatin1().data()
280QGraphicsItem *GridLineFactory::ellipseItem (
const Transformation &transformation,
281 double radiusLinearCartesian,
282 const QPointF &posStartScreen,
283 const QPointF &posEndScreen)
const
287 QPointF posStartGraph, posEndGraph;
297 if (angleEnd < angleStart) {
300 double angleSpan = angleEnd - angleStart;
303 QPointF posOriginGraph (0, 0), posOriginScreen;
308 <<
" radiusLinearCartesian=" << radiusLinearCartesian
309 <<
" posStartScreen=" <<
QPointFToString (posStartScreen).toLatin1().data()
310 <<
" posEndScreen=" <<
QPointFToString (posEndScreen).toLatin1().data()
311 <<
" posOriginScreen=" <<
QPointFToString (posOriginScreen).toLatin1().data()
314 <<
" transformation=" << transformation;
319 double ellipseXAxis, ellipseYAxis;
320 QTransform transformAlign;
321 createTransformAlign (transformation,
322 radiusLinearCartesian,
329 QRectF boundingRect (-1.0 * ellipseXAxis + posOriginScreen.x(),
330 -1.0 * ellipseYAxis + posOriginScreen.y(),
333 GraphicsArcItem *item =
new GraphicsArcItem (boundingRect);
337 item->setTransform (transformAlign.transposed ().inverted ());
342void GridLineFactory::finishActiveGridLine (
const QPointF &posStartScreen,
343 const QPointF &posEndScreen,
350 <<
" posStartScreen=" <<
QPointFToString (posStartScreen).toLatin1().data()
351 <<
" posEndScreen=" <<
QPointFToString (posEndScreen).toLatin1().data()
352 <<
" yFrom=" << yFrom
360 double radiusLinearCartesian = yFrom;
363 m_modelCoords.originRadius());
365 radiusLinearCartesian -= m_modelCoords.originRadius();
369 item = ellipseItem (transformation,
370 radiusLinearCartesian,
377 item = lineItem (posStartScreen,
382 bindItemToScene (item);
385QGraphicsItem *GridLineFactory::lineItem (
const QPointF &posStartScreen,
386 const QPointF &posEndScreen)
const
389 <<
" posStartScreen=" <<
QPointFToString (posStartScreen).toLatin1().data()
390 <<
" posEndScreen=" <<
QPointFToString (posEndScreen).toLatin1().data();
392 return new QGraphicsLineItem (QLineF (posStartScreen,
396double GridLineFactory::minScreenDistanceFromPoints (
const QPointF &posScreen)
398 double minDistance = 0;
399 for (
int i = 0; i < m_pointsToIsolate.count (); i++) {
400 const Point &pointCenter = m_pointsToIsolate.at (i);
402 double dx = posScreen.x() - pointCenter.
posScreen().x();
403 double dy = posScreen.y() - pointCenter.
posScreen().y();
405 double distance = qSqrt (dx * dx + dy * dy);
406 if (i == 0 || distance < minDistance) {
407 minDistance = distance;
QColor ColorPaletteToQColor(ColorPalette color)
const double DEGREES_TO_RADIANS
const double CHECKER_OPACITY
const int Z_VALUE_IN_FRONT
const double RADIANS_TO_TICS
const Qt::PenStyle GRID_LINE_STYLE
const int GRID_LINE_WIDTH
log4cpp::Category * mainCat
QString QTransformToString(const QTransform &transform)
QString QPointFToString(const QPointF &pos)
Model for DlgSettingsCoords and CmdSettingsCoords.
Model for DlgSettingsGridDisplay and CmdSettingsGridDisplay.
double startX() const
Get method for x grid line lower bound (inclusive).
double stepX() const
Get method for x grid line increment.
double stopX() const
Get method for x grid line upper bound (inclusive).
double stopY() const
Get method for y grid line upper bound (inclusive).
bool stable() const
Get method for stable flag.
ColorPalette paletteColor() const
Get method for color.
double stepY() const
Get method for y grid line increment.
double startY() const
Get method for y grid line lower bound (inclusive).
Storage of one imported image and the data attached to that image.
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.
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.
GridLineFactory(QGraphicsScene &scene, const DocumentModelCoords &modelCoords)
Simple constructor for general use (i.e. not by Checker)
Limit the number of grid lines so a bad combination of start/step/stop value will not lead to extreme...
void limitForYRadius(const Document &document, const Transformation &transformation, const DocumentModelCoords &modelCoords, const MainWindowModel &modelMainWindow, const DocumentModelGridDisplay &modelGrid, double &startY, double &stepY, double &stopY) const
Limit step value for y/range coordinate. This is a noop if the maximum grid line limit in MainWindowM...
void limitForXTheta(const Document &document, const Transformation &transformation, const DocumentModelCoords &modelCoords, const MainWindowModel &modelMainWindow, const DocumentModelGridDisplay &modelGrid, double &startX, double &stepX, double &stopX) const
Limit step value for x/theta coordinate. This is a noop if the maximum grid line limit in MainWindowM...
Single grid line drawn a straight or curved line.
void setPen(const QPen &pen)
Set the pen style.
void add(QGraphicsItem *item)
Add graphics item which represents one segment of the line.
Container class for GridLine objects.
void add(GridLine *gridLine)
Add specified grid line. Ownership of all allocated QGraphicsItems is passed to new GridLine.
Model for DlgSettingsMainWindow.
QPointF posScreen() const
Accessor for screen position.
#define LOG4CPP_INFO_S(logger)
#define LOG4CPP_DEBUG_S(logger)