Add QLineF::center() returning the point in the center of the line

[ChangeLog][QtCore][QLine/QLineF] Added center().

Change-Id: I6dcfa9e839190c0a4caf36fb6ecd01b37d65d274
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
This commit is contained in:
Lorenz Haas 2016-05-01 22:47:01 +02:00
parent 72e084165e
commit a7372fd79d
3 changed files with 114 additions and 0 deletions

View File

@ -214,6 +214,14 @@ QT_BEGIN_NAMESPACE
Returns this line translated the distance specified by \a dx and \a dy.
*/
/*!
\fn QPoint QLine::center() const
\since 5.8
Returns the center point of this line. This is equivalent to
(p1() + p2()) / 2, except it will never overflow.
*/
/*!
\fn void QLine::setP1(const QPoint &p1)
@ -351,6 +359,12 @@ QDataStream &operator>>(QDataStream &stream, QLine &line)
translate() function, and can be traversed using the pointAt()
function.
\section1 Constraints
QLine is limited to the minimum and maximum values for the
\c int type. Operations on a QLine that could potentially result
in values outside this range will result in undefined behavior.
\sa QLine, QPolygonF, QRectF
*/
@ -710,6 +724,15 @@ QLineF::IntersectType QLineF::intersect(const QLineF &l, QPointF *intersectionPo
Returns this line translated the distance specified by \a dx and \a dy.
*/
/*!
\fn QPointF QLineF::center() const
\since 5.8
Returns the center point of this line. This is equivalent to
0.5 * p1() + 0.5 * p2().
*/
/*!
\fn void QLineF::setP1(const QPointF &p1)
\since 4.4

View File

@ -76,6 +76,8 @@ public:
Q_DECL_CONSTEXPR inline QLine translated(const QPoint &p) const Q_REQUIRED_RESULT;
Q_DECL_CONSTEXPR inline QLine translated(int dx, int dy) const Q_REQUIRED_RESULT;
Q_DECL_CONSTEXPR inline QPoint center() const Q_REQUIRED_RESULT;
inline void setP1(const QPoint &p1);
inline void setP2(const QPoint &p2);
inline void setPoints(const QPoint &p1, const QPoint &p2);
@ -165,6 +167,11 @@ Q_DECL_CONSTEXPR inline QLine QLine::translated(int adx, int ady) const
return translated(QPoint(adx, ady));
}
Q_DECL_CONSTEXPR inline QPoint QLine::center() const
{
return QPoint(int((qint64(pt1.x()) + pt2.x()) / 2), int((qint64(pt1.y()) + pt2.y()) / 2));
}
inline void QLine::setP1(const QPoint &aP1)
{
pt1 = aP1;
@ -253,6 +260,8 @@ public:
Q_DECL_CONSTEXPR inline QLineF translated(const QPointF &p) const Q_REQUIRED_RESULT;
Q_DECL_CONSTEXPR inline QLineF translated(qreal dx, qreal dy) const Q_REQUIRED_RESULT;
Q_DECL_CONSTEXPR inline QPointF center() const Q_REQUIRED_RESULT;
inline void setP1(const QPointF &p1);
inline void setP2(const QPointF &p2);
inline void setPoints(const QPointF &p1, const QPointF &p2);
@ -357,6 +366,11 @@ Q_DECL_CONSTEXPR inline QLineF QLineF::translated(qreal adx, qreal ady) const
return translated(QPointF(adx, ady));
}
Q_DECL_CONSTEXPR inline QPointF QLineF::center() const
{
return QPointF(0.5 * pt1.x() + 0.5 * pt2.x(), 0.5 * pt1.y() + 0.5 * pt2.y());
}
inline void QLineF::setLength(qreal len)
{
if (isNull())

View File

@ -44,6 +44,12 @@ private slots:
void testLength();
void testLength_data();
void testCenter();
void testCenter_data();
void testCenterF();
void testCenterF_data();
void testNormalVector();
void testNormalVector_data();
@ -268,6 +274,77 @@ void tst_QLine::testLength()
QCOMPARE(l.dy(), qreal(vy));
}
void tst_QLine::testCenter()
{
QFETCH(int, x1);
QFETCH(int, y1);
QFETCH(int, x2);
QFETCH(int, y2);
QFETCH(int, centerX);
QFETCH(int, centerY);
const QPoint c = QLine(x1, y1, x2, y2).center();
QCOMPARE(centerX, c.x());
QCOMPARE(centerY, c.y());
}
void tst_QLine::testCenter_data()
{
QTest::addColumn<int>("x1");
QTest::addColumn<int>("y1");
QTest::addColumn<int>("x2");
QTest::addColumn<int>("y2");
QTest::addColumn<int>("centerX");
QTest::addColumn<int>("centerY");
QTest::newRow("[0, 0]") << 0 << 0 << 0 << 0 << 0 << 0;
QTest::newRow("top") << 0 << 0 << 2 << 0 << 1 << 0;
QTest::newRow("right") << 0 << 0 << 0 << 2 << 0 << 1;
QTest::newRow("bottom") << 0 << 0 << -2 << 0 << -1 << 0;
QTest::newRow("left") << 0 << 0 << 0 << -2 << 0 << -1;
QTest::newRow("precision+") << 0 << 0 << 1 << 1 << 0 << 0;
QTest::newRow("precision-") << -1 << -1 << 0 << 0 << 0 << 0;
const int max = std::numeric_limits<int>::max();
const int min = std::numeric_limits<int>::min();
QTest::newRow("max") << max << max << max << max << max << max;
QTest::newRow("min") << min << min << min << min << min << min;
QTest::newRow("minmax") << min << min << max << max << 0 << 0;
}
void tst_QLine::testCenterF()
{
QFETCH(double, x1);
QFETCH(double, y1);
QFETCH(double, x2);
QFETCH(double, y2);
QFETCH(double, centerX);
QFETCH(double, centerY);
const QPointF c = QLineF(x1, y1, x2, y2).center();
QCOMPARE(centerX, c.x());
QCOMPARE(centerY, c.y());
}
void tst_QLine::testCenterF_data()
{
QTest::addColumn<double>("x1");
QTest::addColumn<double>("y1");
QTest::addColumn<double>("x2");
QTest::addColumn<double>("y2");
QTest::addColumn<double>("centerX");
QTest::addColumn<double>("centerY");
QTest::newRow("[0, 0]") << 0.0 << 0.0 << 0.0 << 0.0 << 0.0 << 0.0;
QTest::newRow("top") << 0.0 << 0.0 << 1.0 << 0.0 << 0.5 << 0.0;
QTest::newRow("right") << 0.0 << 0.0 << 0.0 << 1.0 << 0.0 << 0.5;
QTest::newRow("bottom") << 0.0 << 0.0 << -1.0 << 0.0 << -0.5 << 0.0;
QTest::newRow("left") << 0.0 << 0.0 << 0.0 << -1.0 << 0.0 << -0.5;
const double max = std::numeric_limits<qreal>::max();
QTest::newRow("max") << max << max << max << max << max << max;
}
void tst_QLine::testNormalVector_data()
{