diff --git a/demos/chartviewer/charts/domain/linelogxlogy.cpp b/demos/chartviewer/charts/domain/linelogxlogy.cpp index 12b817a..3180baf 100644 --- a/demos/chartviewer/charts/domain/linelogxlogy.cpp +++ b/demos/chartviewer/charts/domain/linelogxlogy.cpp @@ -47,7 +47,7 @@ public: } QLogValueAxis *axisX= new QLogValueAxis(); - axisX->setBase(1.2); + axisX->setBase(2); QLogValueAxis *axisY= new QLogValueAxis(); axisY->setBase(2); foreach (QAbstractSeries *series, chart->series()) { diff --git a/src/axis/logvalueaxis/qlogvalueaxis.cpp b/src/axis/logvalueaxis/qlogvalueaxis.cpp index 9b1fa25..62fb54d 100644 --- a/src/axis/logvalueaxis/qlogvalueaxis.cpp +++ b/src/axis/logvalueaxis/qlogvalueaxis.cpp @@ -180,11 +180,14 @@ QString QLogValueAxis::labelFormat() const void QLogValueAxis::setBase(qreal base) { // check if base is correct - if (base <= 0 || qFuzzyCompare(base, 1)) + if (qFuzzyCompare(base, 1)) return; - Q_D(QLogValueAxis); - d->m_base = base; + if (base > 0) { + Q_D(QLogValueAxis); + d->m_base = base; + emit d->baseChanged(base); + } } qreal QLogValueAxis::base() const diff --git a/src/axis/logvalueaxis/qlogvalueaxis_p.h b/src/axis/logvalueaxis/qlogvalueaxis_p.h index 5d6d782..85bb16a 100644 --- a/src/axis/logvalueaxis/qlogvalueaxis_p.h +++ b/src/axis/logvalueaxis/qlogvalueaxis_p.h @@ -56,6 +56,9 @@ class QLogValueAxisPrivate : public QAbstractAxisPrivate void setRange(const QVariant &min, const QVariant &max); int tickCount() const; + Q_SIGNALS: + void baseChanged(qreal base); + protected: qreal m_min; qreal m_max; diff --git a/src/domain/logxlogydomain.cpp b/src/domain/logxlogydomain.cpp index 7d46c44..ed117c4 100644 --- a/src/domain/logxlogydomain.cpp +++ b/src/domain/logxlogydomain.cpp @@ -143,10 +143,12 @@ QVector LogXLogYDomain::calculateGeometryPoints(const QList& v QPointF LogXLogYDomain::calculateDomainPoint(const QPointF &point) const { - const qreal deltaX = m_size.width() / (m_maxX - m_minX); - const qreal deltaY = m_size.height() / (m_maxY - m_minY); - qreal x = point.x() / deltaX + m_minX; - qreal y = (point.y() - m_size.height()) / (-deltaY) + m_minY; + const qreal leftEdgeX= m_logMinX < m_logMaxX ? m_logMinX : m_logMaxX; + const qreal leftEdgeY = m_logMinY < m_logMaxY ? m_logMinY : m_logMaxY; + const qreal deltaX = m_size.width() / qAbs(m_logMaxX - m_logMinX); + const qreal deltaY = m_size.height() / qAbs(m_logMaxY - m_logMinY); + qreal x = qPow(m_logBaseX, leftEdgeX + point.x() / deltaX); + qreal y = qPow(m_logBaseY, leftEdgeY + (m_size.height() - point.y()) / deltaY); return QPointF(x, y); } diff --git a/src/domain/logxydomain.cpp b/src/domain/logxydomain.cpp index 31e6760..c15c495 100644 --- a/src/domain/logxydomain.cpp +++ b/src/domain/logxydomain.cpp @@ -145,9 +145,10 @@ QVector LogXYDomain::calculateGeometryPoints(const QList& vect QPointF LogXYDomain::calculateDomainPoint(const QPointF &point) const { - const qreal deltaX = m_size.width() / (m_maxX - m_minX); + const qreal leftEdgeX= m_logMinX < m_logMaxX ? m_logMinX : m_logMaxX; + const qreal deltaX = m_size.width() / qAbs(m_logMaxX - m_logMinX); const qreal deltaY = m_size.height() / (m_maxY - m_minY); - qreal x = point.x() / deltaX + m_minX; + qreal x = qPow(m_logBaseX, leftEdgeX + point.x() / deltaX); qreal y = (point.y() - m_size.height()) / (-deltaY) + m_minY; return QPointF(x, y); } diff --git a/src/domain/xlogydomain.cpp b/src/domain/xlogydomain.cpp index fb2f9ee..6b79123 100644 --- a/src/domain/xlogydomain.cpp +++ b/src/domain/xlogydomain.cpp @@ -146,9 +146,10 @@ QVector XLogYDomain::calculateGeometryPoints(const QList& vect QPointF XLogYDomain::calculateDomainPoint(const QPointF &point) const { const qreal deltaX = m_size.width() / (m_maxX - m_minX); - const qreal deltaY = m_size.height() / (m_maxY - m_minY); + const qreal leftEdgeY = m_logMinY < m_logMaxY ? m_logMinY : m_logMaxY; + const qreal deltaY = m_size.height() / qAbs(m_logMaxY - m_logMinY); qreal x = point.x() / deltaX + m_minX; - qreal y = (point.y() - m_size.height()) / (-deltaY) + m_minY; + qreal y = qPow(m_logBaseY, leftEdgeY + (m_size.height() - point.y()) / deltaY); return QPointF(x, y); }