Make explicit that we expect co-ordinates to be finite

The various spatial-vector, line, point, region and margin types have
all long taken for granted that their co-ordinates are finite and, in
particular, not NaN. Make this expectation explicit in the
documentation. Added assertions where (chiefly) noexcept and (where
the assertion would be a simple qIsFinite() call) constexpr didn't
preclude doing so. Also assert against zero divisors that would lead
to non-finite results.

Make minor clean-ups to docs in the process. QMarginsF had several
methods whose declaration, definition and docs weren't consistent in
their parameter names.

Task-number: QTBUG-89010
Change-Id: I601a830959d13a73dcb17ce31a1202a1486c8f7f
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
This commit is contained in:
Edward Welbourne 2020-12-01 14:07:26 +01:00
parent 96ef1769c1
commit 7a738daa97
12 changed files with 224 additions and 143 deletions

View File

@ -322,7 +322,7 @@ QDataStream &operator>>(QDataStream &stream, QLine &line)
A QLineF describes a finite length line (or line segment) on a A QLineF describes a finite length line (or line segment) on a
two-dimensional surface. QLineF defines the start and end points two-dimensional surface. QLineF defines the start and end points
of the line using floating point accuracy for coordinates. Use of the line using floating point accuracy for coordinates. Use
the toLine() function to retrieve an integer based copy of this the toLine() function to retrieve an integer-based copy of this
line. line.
\table \table
@ -458,7 +458,7 @@ QDataStream &operator>>(QDataStream &stream, QLine &line)
/*! /*!
\fn QLine QLineF::toLine() const \fn QLine QLineF::toLine() const
Returns an integer based copy of this line. Returns an integer-based copy of this line.
Note that the returned line's start and end points are rounded to Note that the returned line's start and end points are rounded to
the nearest integer. the nearest integer.
@ -516,12 +516,9 @@ QDataStream &operator>>(QDataStream &stream, QLine &line)
/*! /*!
\fn void QLineF::setLength(qreal length) \fn void QLineF::setLength(qreal length)
Sets the length of the line to the given \a length. QLineF will Sets the length of the line to the given finite \a length. QLineF will move
move the end point - p2() - of the line to give the line its new the end point - p2() - of the line to give the line its new length, unless
length, unless length() was previously zero, in which case no length() was previously zero, in which case no scaling is attempted.
scaling is attempted. For lines with very short lengths
(represented by denormal floating-point values), results may be
imprecise.
\sa length(), unitVector() \sa length(), unitVector()
*/ */
@ -558,9 +555,8 @@ QDataStream &operator>>(QDataStream &stream, QLine &line)
/*! /*!
\fn qreal QLineF::pointAt(qreal t) const \fn qreal QLineF::pointAt(qreal t) const
Returns the point at the parameterized position specified by \a Returns the point at the position specified by finite parameter \a t. The
t. The function returns the line's start point if t = 0, and its end function returns the line's start point if t = 0, and its end point if t = 1.
point if t = 1.
\sa dx(), dy() \sa dx(), dy()
*/ */

View File

@ -372,7 +372,9 @@ constexpr inline QPointF QLineF::center() const
inline void QLineF::setLength(qreal len) inline void QLineF::setLength(qreal len)
{ {
Q_ASSERT(qIsFinite(len));
const qreal oldLength = length(); const qreal oldLength = length();
Q_ASSERT(qIsFinite(oldLength));
// Scale len by dx() / length() and dy() / length(), two O(1) quantities, // Scale len by dx() / length() and dy() / length(), two O(1) quantities,
// rather than scaling dx() and dy() by len / length(), which might overflow. // rather than scaling dx() and dy() by len / length(), which might overflow.
if (oldLength > 0) if (oldLength > 0)

View File

@ -52,7 +52,7 @@ QT_BEGIN_NAMESPACE
\brief The QMargins class defines the four margins of a rectangle. \brief The QMargins class defines the four margins of a rectangle.
QMargin defines a set of four margins; left, top, right and bottom, QMargin defines a set of four margins; left, top, right, and bottom,
that describe the size of the borders surrounding a rectangle. that describe the size of the borders surrounding a rectangle.
The isNull() function returns \c true only if all margins are set to zero. The isNull() function returns \c true only if all margins are set to zero.
@ -76,7 +76,7 @@ QT_BEGIN_NAMESPACE
/*! /*!
\fn QMargins::QMargins(int left, int top, int right, int bottom) \fn QMargins::QMargins(int left, int top, int right, int bottom)
Constructs margins with the given \a left, \a top, \a right, \a bottom Constructs margins with the given \a left, \a top, \a right, and \a bottom
\sa setLeft(), setRight(), setTop(), setBottom() \sa setLeft(), setRight(), setTop(), setBottom()
*/ */
@ -467,8 +467,8 @@ QDebug operator<<(QDebug dbg, const QMargins &m)
\brief The QMarginsF class defines the four margins of a rectangle. \brief The QMarginsF class defines the four margins of a rectangle.
QMarginsF defines a set of four margins; left, top, right and bottom, QMarginsF defines a set of four margins; left, top, right, and bottom,
that describe the size of the borders surrounding a rectangle. that describe the finite size of the borders surrounding a rectangle.
The isNull() function returns \c true only if all margins are very close to zero. The isNull() function returns \c true only if all margins are very close to zero.
@ -491,7 +491,8 @@ QDebug operator<<(QDebug dbg, const QMargins &m)
/*! /*!
\fn QMarginsF::QMarginsF(qreal left, qreal top, qreal right, qreal bottom) \fn QMarginsF::QMarginsF(qreal left, qreal top, qreal right, qreal bottom)
Constructs margins with the given \a left, \a top, \a right, \a bottom Constructs margins with the given \a left, \a top, \a right, and \a bottom.
All parameters must be finite.
\sa setLeft(), setRight(), setTop(), setBottom() \sa setLeft(), setRight(), setTop(), setBottom()
*/ */
@ -542,27 +543,27 @@ QDebug operator<<(QDebug dbg, const QMargins &m)
/*! /*!
\fn void QMarginsF::setLeft(qreal left) \fn void QMarginsF::setLeft(qreal aleft)
Sets the left margin to \a left. Sets the left margin to \a aleft (which must be finite).
*/ */
/*! /*!
\fn void QMarginsF::setTop(qreal Top) \fn void QMarginsF::setTop(qreal atop)
Sets the Top margin to \a Top. Sets the top margin to \a atop (which must be finite).
*/ */
/*! /*!
\fn void QMarginsF::setRight(qreal right) \fn void QMarginsF::setRight(qreal aright)
Sets the right margin to \a right. Sets the right margin to \a aright (which must be finite).
*/ */
/*! /*!
\fn void QMarginsF::setBottom(qreal bottom) \fn void QMarginsF::setBottom(qreal abottom)
Sets the bottom margin to \a bottom. Sets the bottom margin to \a abottom (which must be finite).
*/ */
/*! /*!
@ -613,8 +614,8 @@ QDebug operator<<(QDebug dbg, const QMargins &m)
\fn const QMarginsF operator+(const QMarginsF &lhs, qreal rhs) \fn const QMarginsF operator+(const QMarginsF &lhs, qreal rhs)
\relates QMarginsF \relates QMarginsF
Returns a QMarginsF object that is formed by adding \a rhs to Returns a QMarginsF object that is formed by adding \a rhs (which must be
\a lhs. finite) to each component of \a lhs.
\sa QMarginsF::operator+=(), QMarginsF::operator-=() \sa QMarginsF::operator+=(), QMarginsF::operator-=()
*/ */
@ -623,8 +624,8 @@ QDebug operator<<(QDebug dbg, const QMargins &m)
\fn const QMarginsF operator+(qreal lhs, const QMarginsF &rhs) \fn const QMarginsF operator+(qreal lhs, const QMarginsF &rhs)
\relates QMarginsF \relates QMarginsF
Returns a QMarginsF object that is formed by adding \a lhs to Returns a QMarginsF object that is formed by adding \a lhs (which must be
\a rhs. finite) to each component of \a rhs.
\sa QMarginsF::operator+=(), QMarginsF::operator-=() \sa QMarginsF::operator+=(), QMarginsF::operator-=()
*/ */
@ -633,8 +634,8 @@ QDebug operator<<(QDebug dbg, const QMargins &m)
\fn const QMarginsF operator-(const QMarginsF &lhs, qreal rhs) \fn const QMarginsF operator-(const QMarginsF &lhs, qreal rhs)
\relates QMarginsF \relates QMarginsF
Returns a QMarginsF object that is formed by subtracting \a rhs from Returns a QMarginsF object that is formed by subtracting \a rhs (which must
\a lhs. be finite) from each component of \a lhs.
\sa QMarginsF::operator+=(), QMarginsF::operator-=() \sa QMarginsF::operator+=(), QMarginsF::operator-=()
*/ */
@ -645,7 +646,7 @@ QDebug operator<<(QDebug dbg, const QMargins &m)
\overload \overload
Returns a QMarginsF object that is formed by multiplying each component Returns a QMarginsF object that is formed by multiplying each component
of the given \a lhs margins by \a rhs factor. of the given \a lhs margins by finite factor \a rhs.
\sa QMarginsF::operator*=(), QMarginsF::operator/=() \sa QMarginsF::operator*=(), QMarginsF::operator/=()
*/ */
@ -656,7 +657,7 @@ QDebug operator<<(QDebug dbg, const QMargins &m)
\overload \overload
Returns a QMarginsF object that is formed by multiplying each component Returns a QMarginsF object that is formed by multiplying each component
of the given \a lhs margins by \a rhs factor. of the given \a lhs margins by finite factor \a rhs.
\sa QMarginsF::operator*=(), QMarginsF::operator/=() \sa QMarginsF::operator*=(), QMarginsF::operator/=()
*/ */
@ -669,6 +670,8 @@ QDebug operator<<(QDebug dbg, const QMargins &m)
Returns a QMarginsF object that is formed by dividing the components of Returns a QMarginsF object that is formed by dividing the components of
the given \a lhs margins by the given \a rhs divisor. the given \a lhs margins by the given \a rhs divisor.
The \a divisor must not be either zero or NaN.
\sa QMarginsF::operator*=(), QMarginsF::operator/=() \sa QMarginsF::operator*=(), QMarginsF::operator/=()
*/ */
@ -721,7 +724,7 @@ QDebug operator<<(QDebug dbg, const QMargins &m)
\fn QMarginsF &QMarginsF::operator+=(qreal addend) \fn QMarginsF &QMarginsF::operator+=(qreal addend)
\overload \overload
Adds the \a addend to each component of this object Adds the given finite \a addend to each component of this object
and returns a reference to it. and returns a reference to it.
\sa operator-=() \sa operator-=()
@ -731,7 +734,7 @@ QDebug operator<<(QDebug dbg, const QMargins &m)
\fn QMarginsF &QMarginsF::operator-=(qreal subtrahend) \fn QMarginsF &QMarginsF::operator-=(qreal subtrahend)
\overload \overload
Subtracts the \a subtrahend from each component of this object Subtracts the given finite \a subtrahend from each component of this object
and returns a reference to it. and returns a reference to it.
\sa operator+=() \sa operator+=()
@ -740,8 +743,8 @@ QDebug operator<<(QDebug dbg, const QMargins &m)
/*! /*!
\fn QMarginsF &QMarginsF::operator*=(qreal factor) \fn QMarginsF &QMarginsF::operator*=(qreal factor)
Multiplies each component of this object by \a factor Multiplies each component of this object by the given finite \a factor
and returns a reference to it. and returns a reference to this object.
\sa operator/=() \sa operator/=()
*/ */
@ -749,8 +752,10 @@ QDebug operator<<(QDebug dbg, const QMargins &m)
/*! /*!
\fn QMarginsF &QMarginsF::operator/=(qreal divisor) \fn QMarginsF &QMarginsF::operator/=(qreal divisor)
Divides each component of this object by \a divisor Divides each component of this object by \a divisor and returns a reference
and returns a reference to it. to this object.
The \a divisor must not be either zero or NaN.
\sa operator*=() \sa operator*=()
*/ */
@ -758,7 +763,7 @@ QDebug operator<<(QDebug dbg, const QMargins &m)
/*! /*!
\fn QMargins QMarginsF::toMargins() const \fn QMargins QMarginsF::toMargins() const
Returns an integer based copy of this margins object. Returns an integer-based copy of this margins object.
Note that the components in the returned margins will be rounded to Note that the components in the returned margins will be rounded to
the nearest integer. the nearest integer.

View File

@ -311,10 +311,10 @@ public:
constexpr qreal right() const noexcept; constexpr qreal right() const noexcept;
constexpr qreal bottom() const noexcept; constexpr qreal bottom() const noexcept;
constexpr void setLeft(qreal left) noexcept; constexpr void setLeft(qreal aleft) noexcept;
constexpr void setTop(qreal top) noexcept; constexpr void setTop(qreal atop) noexcept;
constexpr void setRight(qreal right) noexcept; constexpr void setRight(qreal aright) noexcept;
constexpr void setBottom(qreal bottom) noexcept; constexpr void setBottom(qreal abottom) noexcept;
constexpr QMarginsF &operator+=(const QMarginsF &margins) noexcept; constexpr QMarginsF &operator+=(const QMarginsF &margins) noexcept;
constexpr QMarginsF &operator-=(const QMarginsF &margins) noexcept; constexpr QMarginsF &operator-=(const QMarginsF &margins) noexcept;
@ -457,6 +457,7 @@ constexpr inline QMarginsF operator*(qreal lhs, const QMarginsF &rhs) noexcept
constexpr inline QMarginsF operator/(const QMarginsF &lhs, qreal divisor) constexpr inline QMarginsF operator/(const QMarginsF &lhs, qreal divisor)
{ {
Q_ASSERT(divisor < 0 || divisor > 0);
return QMarginsF(lhs.left() / divisor, lhs.top() / divisor, return QMarginsF(lhs.left() / divisor, lhs.top() / divisor,
lhs.right() / divisor, lhs.bottom() / divisor); lhs.right() / divisor, lhs.bottom() / divisor);
} }

View File

@ -495,7 +495,7 @@ size_t qHash(QPoint key, size_t seed) noexcept
A point is specified by a x coordinate and an y coordinate which A point is specified by a x coordinate and an y coordinate which
can be accessed using the x() and y() functions. The coordinates can be accessed using the x() and y() functions. The coordinates
of the point are specified using floating point numbers for of the point are specified using finite floating point numbers for
accuracy. The isNull() function returns \c true if both x and y are accuracy. The isNull() function returns \c true if both x and y are
set to 0.0. The coordinates can be set (or altered) using the setX() set to 0.0. The coordinates can be set (or altered) using the setX()
and setY() functions, or alternatively the rx() and ry() functions which and setY() functions, or alternatively the rx() and ry() functions which
@ -581,7 +581,7 @@ size_t qHash(QPoint key, size_t seed) noexcept
/*! /*!
\fn void QPointF::setX(qreal x) \fn void QPointF::setX(qreal x)
Sets the x coordinate of this point to the given \a x coordinate. Sets the x coordinate of this point to the given finite \a x coordinate.
\sa x(), setY() \sa x(), setY()
*/ */
@ -589,7 +589,7 @@ size_t qHash(QPoint key, size_t seed) noexcept
/*! /*!
\fn void QPointF::setY(qreal y) \fn void QPointF::setY(qreal y)
Sets the y coordinate of this point to the given \a y coordinate. Sets the y coordinate of this point to the given finite \a y coordinate.
\sa y(), setX() \sa y(), setX()
*/ */
@ -655,7 +655,7 @@ size_t qHash(QPoint key, size_t seed) noexcept
/*! /*!
\fn QPointF& QPointF::operator*=(qreal factor) \fn QPointF& QPointF::operator*=(qreal factor)
Multiplies this point's coordinates by the given \a factor, and Multiplies this point's coordinates by the given finite \a factor, and
returns a reference to this point. For example: returns a reference to this point. For example:
\snippet code/src_corelib_tools_qpoint.cpp 14 \snippet code/src_corelib_tools_qpoint.cpp 14
@ -671,6 +671,8 @@ size_t qHash(QPoint key, size_t seed) noexcept
\snippet code/src_corelib_tools_qpoint.cpp 15 \snippet code/src_corelib_tools_qpoint.cpp 15
The \a divisor must not be zero or NaN.
\sa operator*=() \sa operator*=()
*/ */
@ -695,7 +697,7 @@ size_t qHash(QPoint key, size_t seed) noexcept
/*! /*!
\fn QPointF QPointF::operator*(const QPointF &point, qreal factor) \fn QPointF QPointF::operator*(const QPointF &point, qreal factor)
Returns a copy of the given \a point, multiplied by the given \a factor. Returns a copy of the given \a point, multiplied by the given finite \a factor.
\sa QPointF::operator*=() \sa QPointF::operator*=()
*/ */
@ -705,7 +707,7 @@ size_t qHash(QPoint key, size_t seed) noexcept
\overload \overload
Returns a copy of the given \a point, multiplied by the given \a factor. Returns a copy of the given \a point, multiplied by the given finite \a factor.
*/ */
/*! /*!
@ -720,7 +722,7 @@ size_t qHash(QPoint key, size_t seed) noexcept
\overload \overload
Returns a QPointF object that is formed by changing the sign of Returns a QPointF object that is formed by changing the sign of
both components of the given \a point. each component of the given \a point.
Equivalent to \c {QPointF(0,0) - point}. Equivalent to \c {QPointF(0,0) - point}.
*/ */
@ -728,9 +730,11 @@ size_t qHash(QPoint key, size_t seed) noexcept
/*! /*!
\fn QPointF QPointF::operator/(const QPointF &point, qreal divisor) \fn QPointF QPointF::operator/(const QPointF &point, qreal divisor)
Returns the QPointF object formed by dividing both components of Returns the QPointF object formed by dividing each component of
the given \a point by the given \a divisor. the given \a point by the given \a divisor.
The \a divisor must not be zero or NaN.
\sa QPointF::operator/=() \sa QPointF::operator/=()
*/ */

View File

@ -295,7 +295,10 @@ public:
friend constexpr inline QPointF operator-(const QPointF &p) friend constexpr inline QPointF operator-(const QPointF &p)
{ return QPointF(-p.xp, -p.yp); } { return QPointF(-p.xp, -p.yp); }
friend constexpr inline QPointF operator/(const QPointF &p, qreal divisor) friend constexpr inline QPointF operator/(const QPointF &p, qreal divisor)
{ return QPointF(p.xp / divisor, p.yp / divisor); } {
Q_ASSERT(divisor < 0 || divisor > 0);
return QPointF(p.xp / divisor, p.yp / divisor);
}
constexpr QPoint toPoint() const; constexpr QPoint toPoint() const;
@ -406,6 +409,7 @@ constexpr inline QPointF &QPointF::operator*=(qreal c)
constexpr inline QPointF &QPointF::operator/=(qreal divisor) constexpr inline QPointF &QPointF::operator/=(qreal divisor)
{ {
Q_ASSERT(divisor > 0 || divisor < 0);
xp /= divisor; xp /= divisor;
yp /= divisor; yp /= divisor;
return *this; return *this;

View File

@ -1303,8 +1303,8 @@ QDebug operator<<(QDebug dbg, const QRect &r)
\ingroup painting \ingroup painting
\reentrant \reentrant
\brief The QRectF class defines a rectangle in the plane using floating \brief The QRectF class defines a finite rectangle in the plane using
point precision. floating point precision.
A rectangle is normally expressed as a top-left corner and a A rectangle is normally expressed as a top-left corner and a
size. The size (width and height) of a QRectF is always equivalent size. The size (width and height) of a QRectF is always equivalent
@ -1469,8 +1469,8 @@ QDebug operator<<(QDebug dbg, const QRect &r)
/*! /*!
\fn QRectF::QRectF(qreal x, qreal y, qreal width, qreal height) \fn QRectF::QRectF(qreal x, qreal y, qreal width, qreal height)
Constructs a rectangle with (\a x, \a y) as its top-left corner Constructs a rectangle with (\a x, \a y) as its top-left corner and the
and the given \a width and \a height. given \a width and \a height. All parameters must be finite.
\sa setRect() \sa setRect()
*/ */
@ -1569,7 +1569,7 @@ QRectF QRectF::normalized() const noexcept
/*! /*!
\fn void QRectF::setLeft(qreal x) \fn void QRectF::setLeft(qreal x)
Sets the left edge of the rectangle to the given \a x Sets the left edge of the rectangle to the given finite \a x
coordinate. May change the width, but will never change the right coordinate. May change the width, but will never change the right
edge of the rectangle. edge of the rectangle.
@ -1581,7 +1581,7 @@ QRectF QRectF::normalized() const noexcept
/*! /*!
\fn void QRectF::setTop(qreal y) \fn void QRectF::setTop(qreal y)
Sets the top edge of the rectangle to the given \a y coordinate. May Sets the top edge of the rectangle to the given finite \a y coordinate. May
change the height, but will never change the bottom edge of the change the height, but will never change the bottom edge of the
rectangle. rectangle.
@ -1593,7 +1593,7 @@ QRectF QRectF::normalized() const noexcept
/*! /*!
\fn void QRectF::setRight(qreal x) \fn void QRectF::setRight(qreal x)
Sets the right edge of the rectangle to the given \a x Sets the right edge of the rectangle to the given finite \a x
coordinate. May change the width, but will never change the left coordinate. May change the width, but will never change the left
edge of the rectangle. edge of the rectangle.
@ -1603,7 +1603,7 @@ QRectF QRectF::normalized() const noexcept
/*! /*!
\fn void QRectF::setBottom(qreal y) \fn void QRectF::setBottom(qreal y)
Sets the bottom edge of the rectangle to the given \a y Sets the bottom edge of the rectangle to the given finite \a y
coordinate. May change the height, but will never change the top coordinate. May change the height, but will never change the top
edge of the rectangle. edge of the rectangle.
@ -1613,7 +1613,7 @@ QRectF QRectF::normalized() const noexcept
/*! /*!
\fn void QRectF::setX(qreal x) \fn void QRectF::setX(qreal x)
Sets the left edge of the rectangle to the given \a x Sets the left edge of the rectangle to the given finite \a x
coordinate. May change the width, but will never change the right coordinate. May change the width, but will never change the right
edge of the rectangle. edge of the rectangle.
@ -1625,7 +1625,7 @@ QRectF QRectF::normalized() const noexcept
/*! /*!
\fn void QRectF::setY(qreal y) \fn void QRectF::setY(qreal y)
Sets the top edge of the rectangle to the given \a y Sets the top edge of the rectangle to the given finite \a y
coordinate. May change the height, but will never change the coordinate. May change the height, but will never change the
bottom edge of the rectangle. bottom edge of the rectangle.
@ -1707,7 +1707,7 @@ QRectF QRectF::normalized() const noexcept
\fn void QRectF::moveLeft(qreal x) \fn void QRectF::moveLeft(qreal x)
Moves the rectangle horizontally, leaving the rectangle's left Moves the rectangle horizontally, leaving the rectangle's left
edge at the given \a x coordinate. The rectangle's size is edge at the given finite \a x coordinate. The rectangle's size is
unchanged. unchanged.
\sa left(), setLeft(), moveRight() \sa left(), setLeft(), moveRight()
@ -1717,7 +1717,7 @@ QRectF QRectF::normalized() const noexcept
\fn void QRectF::moveTop(qreal y) \fn void QRectF::moveTop(qreal y)
Moves the rectangle vertically, leaving the rectangle's top line Moves the rectangle vertically, leaving the rectangle's top line
at the given \a y coordinate. The rectangle's size is unchanged. at the given finite \a y coordinate. The rectangle's size is unchanged.
\sa top(), setTop(), moveBottom() \sa top(), setTop(), moveBottom()
*/ */
@ -1727,7 +1727,7 @@ QRectF QRectF::normalized() const noexcept
\fn void QRectF::moveRight(qreal x) \fn void QRectF::moveRight(qreal x)
Moves the rectangle horizontally, leaving the rectangle's right Moves the rectangle horizontally, leaving the rectangle's right
edge at the given \a x coordinate. The rectangle's size is edge at the given finite \a x coordinate. The rectangle's size is
unchanged. unchanged.
\sa right(), setRight(), moveLeft() \sa right(), setRight(), moveLeft()
@ -1738,7 +1738,7 @@ QRectF QRectF::normalized() const noexcept
\fn void QRectF::moveBottom(qreal y) \fn void QRectF::moveBottom(qreal y)
Moves the rectangle vertically, leaving the rectangle's bottom Moves the rectangle vertically, leaving the rectangle's bottom
edge at the given \a y coordinate. The rectangle's size is edge at the given finite \a y coordinate. The rectangle's size is
unchanged. unchanged.
\sa bottom(), setBottom(), moveTop() \sa bottom(), setBottom(), moveTop()
@ -1788,8 +1788,8 @@ QRectF QRectF::normalized() const noexcept
/*! /*!
\fn void QRectF::moveTo(qreal x, qreal y) \fn void QRectF::moveTo(qreal x, qreal y)
Moves the rectangle, leaving the top-left corner at the given Moves the rectangle, leaving the top-left corner at the given position (\a
position (\a x, \a y). The rectangle's size is unchanged. x, \a y). The rectangle's size is unchanged. Both parameters must be finite.
\sa translate(), moveTopLeft() \sa translate(), moveTopLeft()
*/ */
@ -1807,7 +1807,7 @@ QRectF QRectF::normalized() const noexcept
Moves the rectangle \a dx along the x-axis and \a dy along the y-axis, Moves the rectangle \a dx along the x-axis and \a dy along the y-axis,
relative to the current position. Positive values move the rectangle to the relative to the current position. Positive values move the rectangle to the
right and downwards. right and downwards. Both parameters must be finite.
\sa moveTopLeft(), moveTo(), translated() \sa moveTopLeft(), moveTo(), translated()
*/ */
@ -1829,7 +1829,7 @@ QRectF QRectF::normalized() const noexcept
Returns a copy of the rectangle that is translated \a dx along the Returns a copy of the rectangle that is translated \a dx along the
x axis and \a dy along the y axis, relative to the current x axis and \a dy along the y axis, relative to the current
position. Positive values move the rectangle to the right and position. Positive values move the rectangle to the right and
down. down. Both parameters must be finite.
\sa translate() \sa translate()
*/ */
@ -1860,8 +1860,8 @@ QRectF QRectF::normalized() const noexcept
/*! /*!
\fn void QRectF::setRect(qreal x, qreal y, qreal width, qreal height) \fn void QRectF::setRect(qreal x, qreal y, qreal width, qreal height)
Sets the coordinates of the rectangle's top-left corner to (\a x, Sets the coordinates of the rectangle's top-left corner to (\a x, \a y), and
\a y), and its size to the given \a width and \a height. its size to the given \a width and \a height. All parameters must be finite.
\sa getRect(), setCoords() \sa getRect(), setCoords()
*/ */
@ -1872,7 +1872,7 @@ QRectF QRectF::normalized() const noexcept
Sets the coordinates of the rectangle's top-left corner to (\a x1, Sets the coordinates of the rectangle's top-left corner to (\a x1,
\a y1), and the coordinates of its bottom-right corner to (\a x2, \a y1), and the coordinates of its bottom-right corner to (\a x2,
\a y2). \a y2). All parameters must be finite.
\sa getCoords(), setRect() \sa getCoords(), setRect()
*/ */
@ -1882,6 +1882,7 @@ QRectF QRectF::normalized() const noexcept
Returns a new rectangle with \a dx1, \a dy1, \a dx2 and \a dy2 Returns a new rectangle with \a dx1, \a dy1, \a dx2 and \a dy2
added respectively to the existing coordinates of this rectangle. added respectively to the existing coordinates of this rectangle.
All parameters must be finite.
\sa adjust() \sa adjust()
*/ */
@ -1889,7 +1890,7 @@ QRectF QRectF::normalized() const noexcept
/*! \fn void QRectF::adjust(qreal dx1, qreal dy1, qreal dx2, qreal dy2) /*! \fn void QRectF::adjust(qreal dx1, qreal dy1, qreal dx2, qreal dy2)
Adds \a dx1, \a dy1, \a dx2 and \a dy2 respectively to the Adds \a dx1, \a dy1, \a dx2 and \a dy2 respectively to the
existing coordinates of the rectangle. existing coordinates of the rectangle. All parameters must be finite.
\sa adjusted(), setRect() \sa adjusted(), setRect()
*/ */
@ -1920,7 +1921,7 @@ QRectF QRectF::normalized() const noexcept
/*! /*!
\fn void QRectF::setWidth(qreal width) \fn void QRectF::setWidth(qreal width)
Sets the width of the rectangle to the given \a width. The right Sets the width of the rectangle to the given finite \a width. The right
edge is changed, but not the left one. edge is changed, but not the left one.
\sa width(), setSize() \sa width(), setSize()
@ -1930,7 +1931,7 @@ QRectF QRectF::normalized() const noexcept
/*! /*!
\fn void QRectF::setHeight(qreal height) \fn void QRectF::setHeight(qreal height)
Sets the height of the rectangle to the given \a height. The bottom Sets the height of the rectangle to the given finite \a height. The bottom
edge is changed, but not the top one. edge is changed, but not the top one.
\sa height(), setSize() \sa height(), setSize()
@ -1940,7 +1941,7 @@ QRectF QRectF::normalized() const noexcept
/*! /*!
\fn void QRectF::setSize(const QSizeF &size) \fn void QRectF::setSize(const QSizeF &size)
Sets the size of the rectangle to the given \a size. The top-left Sets the size of the rectangle to the given finite \a size. The top-left
corner is not moved. corner is not moved.
\sa size(), setWidth(), setHeight() \sa size(), setWidth(), setHeight()

View File

@ -769,7 +769,9 @@ constexpr inline void QRectF::moveTo(const QPointF &p) noexcept
} }
constexpr inline QRectF QRectF::translated(qreal dx, qreal dy) const noexcept constexpr inline QRectF QRectF::translated(qreal dx, qreal dy) const noexcept
{ return QRectF(xp + dx, yp + dy, w, h); } {
return QRectF(xp + dx, yp + dy, w, h);
}
constexpr inline QRectF QRectF::translated(const QPointF &p) const noexcept constexpr inline QRectF QRectF::translated(const QPointF &p) const noexcept
{ return QRectF(xp + p.x(), yp + p.y(), w, h); } { return QRectF(xp + p.x(), yp + p.y(), w, h); }
@ -810,10 +812,17 @@ constexpr inline void QRectF::setCoords(qreal xp1, qreal yp1, qreal xp2, qreal y
} }
constexpr inline void QRectF::adjust(qreal xp1, qreal yp1, qreal xp2, qreal yp2) noexcept constexpr inline void QRectF::adjust(qreal xp1, qreal yp1, qreal xp2, qreal yp2) noexcept
{ xp += xp1; yp += yp1; w += xp2 - xp1; h += yp2 - yp1; } {
xp += xp1;
yp += yp1;
w += xp2 - xp1;
h += yp2 - yp1;
}
constexpr inline QRectF QRectF::adjusted(qreal xp1, qreal yp1, qreal xp2, qreal yp2) const noexcept constexpr inline QRectF QRectF::adjusted(qreal xp1, qreal yp1, qreal xp2, qreal yp2) const noexcept
{ return QRectF(xp + xp1, yp + yp1, w + xp2 - xp1, h + yp2 - yp1); } {
return QRectF(xp + xp1, yp + yp1, w + xp2 - xp1, h + yp2 - yp1);
}
constexpr inline void QRectF::setWidth(qreal aw) noexcept constexpr inline void QRectF::setWidth(qreal aw) noexcept
{ this->w = aw; } { this->w = aw; }

View File

@ -526,7 +526,7 @@ QDebug operator<<(QDebug dbg, const QSize &s)
/*! /*!
\fn QSizeF::QSizeF(qreal width, qreal height) \fn QSizeF::QSizeF(qreal width, qreal height)
Constructs a size with the given \a width and \a height. Constructs a size with the given finite \a width and \a height.
*/ */
/*! /*!
@ -550,7 +550,7 @@ QDebug operator<<(QDebug dbg, const QSize &s)
/*! /*!
\fn bool QSizeF::isValid() const \fn bool QSizeF::isValid() const
Returns \c true if both the width and height is equal to or greater Returns \c true if both the width and height are equal to or greater
than 0; otherwise returns \c false. than 0; otherwise returns \c false.
\sa isNull(), isEmpty() \sa isNull(), isEmpty()
@ -575,7 +575,7 @@ QDebug operator<<(QDebug dbg, const QSize &s)
/*! /*!
\fn void QSizeF::setWidth(qreal width) \fn void QSizeF::setWidth(qreal width)
Sets the width to the given \a width. Sets the width to the given finite \a width.
\sa width(), rwidth(), setHeight() \sa width(), rwidth(), setHeight()
*/ */
@ -583,7 +583,7 @@ QDebug operator<<(QDebug dbg, const QSize &s)
/*! /*!
\fn void QSizeF::setHeight(qreal height) \fn void QSizeF::setHeight(qreal height)
Sets the height to the given \a height. Sets the height to the given finite \a height.
\sa height(), rheight(), setWidth() \sa height(), rheight(), setWidth()
*/ */
@ -734,7 +734,7 @@ QSizeF QSizeF::scaled(const QSizeF &s, Qt::AspectRatioMode mode) const noexcept
\fn QSizeF &QSizeF::operator*=(qreal factor) \fn QSizeF &QSizeF::operator*=(qreal factor)
\overload \overload
Multiplies both the width and height by the given \a factor and Multiplies both the width and height by the given finite \a factor and
returns a reference to the size. returns a reference to the size.
\sa scale() \sa scale()
@ -780,7 +780,7 @@ QSizeF QSizeF::scaled(const QSizeF &s, Qt::AspectRatioMode mode) const noexcept
\overload \overload
Multiplies the given \a size by the given \a factor and returns Multiplies the given \a size by the given finite \a factor and returns
the result. the result.
\sa QSizeF::scale() \sa QSizeF::scale()
@ -791,7 +791,7 @@ QSizeF QSizeF::scaled(const QSizeF &s, Qt::AspectRatioMode mode) const noexcept
\overload \overload
Multiplies the given \a size by the given \a factor and returns Multiplies the given \a size by the given finite \a factor and returns
the result. the result.
*/ */
@ -800,8 +800,8 @@ QSizeF QSizeF::scaled(const QSizeF &s, Qt::AspectRatioMode mode) const noexcept
\overload \overload
Divides both the width and height by the given \a divisor and Divides both the width and height by the given \a divisor and returns a
returns a reference to the size. reference to the size. The \a divisor must not be either zero or NaN.
\sa scale() \sa scale()
*/ */
@ -812,7 +812,7 @@ QSizeF QSizeF::scaled(const QSizeF &s, Qt::AspectRatioMode mode) const noexcept
\overload \overload
Divides the given \a size by the given \a divisor and returns the Divides the given \a size by the given \a divisor and returns the
result. result. The \a divisor must not be either zero or NaN.
\sa QSizeF::scale() \sa QSizeF::scale()
*/ */

View File

@ -375,7 +375,7 @@ constexpr inline QSizeF &QSizeF::operator*=(qreal c) noexcept
inline QSizeF &QSizeF::operator/=(qreal c) inline QSizeF &QSizeF::operator/=(qreal c)
{ {
Q_ASSERT(!qFuzzyIsNull(c)); Q_ASSERT(!qFuzzyIsNull(c) && qIsFinite(c));
wd = wd / c; wd = wd / c;
ht = ht / c; ht = ht / c;
return *this; return *this;

View File

@ -56,6 +56,10 @@ QT_BEGIN_NAMESPACE
\ingroup painting-3D \ingroup painting-3D
\inmodule QtGui \inmodule QtGui
Vectors are one of the main building blocks of 2D representation and
drawing. They consist of two finite floating-point coordinates,
traditionally called x and y.
The QVector2D class can also be used to represent vertices in 2D space. The QVector2D class can also be used to represent vertices in 2D space.
We therefore do not need to provide a separate vertex class. We therefore do not need to provide a separate vertex class.
@ -80,6 +84,7 @@ QT_BEGIN_NAMESPACE
\fn QVector2D::QVector2D(float xpos, float ypos) \fn QVector2D::QVector2D(float xpos, float ypos)
Constructs a vector with coordinates (\a xpos, \a ypos). Constructs a vector with coordinates (\a xpos, \a ypos).
Both coordinates must be finite.
*/ */
/*! /*!
@ -146,7 +151,7 @@ QT_BEGIN_NAMESPACE
/*! /*!
\fn void QVector2D::setX(float x) \fn void QVector2D::setX(float x)
Sets the x coordinate of this point to the given \a x coordinate. Sets the x coordinate of this point to the given finite \a x coordinate.
\sa x(), setY() \sa x(), setY()
*/ */
@ -154,7 +159,7 @@ QT_BEGIN_NAMESPACE
/*! /*!
\fn void QVector2D::setY(float y) \fn void QVector2D::setY(float y)
Sets the y coordinate of this point to the given \a y coordinate. Sets the y coordinate of this point to the given finite \a y coordinate.
\sa y(), setX() \sa y(), setX()
*/ */
@ -260,7 +265,7 @@ QT_BEGIN_NAMESPACE
/*! /*!
\fn QVector2D &QVector2D::operator*=(float factor) \fn QVector2D &QVector2D::operator*=(float factor)
Multiplies this vector's coordinates by the given \a factor, and Multiplies this vector's coordinates by the given finite \a factor and
returns a reference to this vector. returns a reference to this vector.
\sa operator/=() \sa operator/=()
@ -276,8 +281,8 @@ QT_BEGIN_NAMESPACE
/*! /*!
\fn QVector2D &QVector2D::operator/=(float divisor) \fn QVector2D &QVector2D::operator/=(float divisor)
Divides this vector's coordinates by the given \a divisor, and Divides this vector's coordinates by the given \a divisor and returns a
returns a reference to this vector. reference to this vector. The \a divisor must not be either zero or NaN.
\sa operator*=() \sa operator*=()
*/ */
@ -286,10 +291,12 @@ QT_BEGIN_NAMESPACE
\fn QVector2D &QVector2D::operator/=(QVector2D vector) \fn QVector2D &QVector2D::operator/=(QVector2D vector)
\since 5.5 \since 5.5
Divides the components of this vector by the corresponding Divides each component of this vector by the corresponding component of \a
components in \a vector. vector and returns a reference to this vector.
\sa operator*=() The \a vector must have no component that is either zero or NaN.
\sa operator*=(), operator/()
*/ */
/*! /*!
@ -333,7 +340,7 @@ QT_BEGIN_NAMESPACE
/*! //! friend /*! //! friend
\fn const QVector2D QVector2D::operator*(float factor, QVector2D vector) \fn const QVector2D QVector2D::operator*(float factor, QVector2D vector)
Returns a copy of the given \a vector, multiplied by the given \a factor. Returns a copy of the given \a vector, multiplied by the given finite \a factor.
\sa QVector2D::operator*=() \sa QVector2D::operator*=()
*/ */
@ -341,7 +348,7 @@ QT_BEGIN_NAMESPACE
/*! //! friend /*! //! friend
\fn const QVector2D QVector2D::operator*(QVector2D vector, float factor) \fn const QVector2D QVector2D::operator*(QVector2D vector, float factor)
Returns a copy of the given \a vector, multiplied by the given \a factor. Returns a copy of the given \a vector, multiplied by the given finite \a factor.
\sa QVector2D::operator*=() \sa QVector2D::operator*=()
*/ */
@ -366,8 +373,10 @@ QT_BEGIN_NAMESPACE
/*! //! friend /*! //! friend
\fn const QVector2D QVector2D::operator/(QVector2D vector, float divisor) \fn const QVector2D QVector2D::operator/(QVector2D vector, float divisor)
Returns the QVector2D object formed by dividing all three components of Returns the QVector2D object formed by dividing each component of the given
the given \a vector by the given \a divisor. \a vector by the given \a divisor.
The \a divisor must not be either zero or NaN.
\sa QVector2D::operator/=() \sa QVector2D::operator/=()
*/ */
@ -376,8 +385,10 @@ QT_BEGIN_NAMESPACE
\fn const QVector2D QVector2D::operator/(QVector2D vector, QVector2D divisor) \fn const QVector2D QVector2D::operator/(QVector2D vector, QVector2D divisor)
\since 5.5 \since 5.5
Returns the QVector2D object formed by dividing components of the given Returns the QVector2D object formed by dividing each component of the given
\a vector by a respective components of the given \a divisor. \a vector by the corresponding component of the given \a divisor.
The \a divisor must have no component that is either zero or NaN.
\sa QVector2D::operator/=() \sa QVector2D::operator/=()
*/ */
@ -481,6 +492,7 @@ QDataStream &operator>>(QDataStream &stream, QVector2D &vector)
float x, y; float x, y;
stream >> x; stream >> x;
stream >> y; stream >> y;
Q_ASSERT(qIsFinite(x) && qIsFinite(y));
vector.setX(x); vector.setX(x);
vector.setY(y); vector.setY(y);
return stream; return stream;
@ -502,8 +514,8 @@ QDataStream &operator>>(QDataStream &stream, QVector2D &vector)
\inmodule QtGui \inmodule QtGui
Vectors are one of the main building blocks of 3D representation and Vectors are one of the main building blocks of 3D representation and
drawing. They consist of three coordinates, traditionally called drawing. They consist of three finite floating-point coordinates,
x, y, and z. traditionally called x, y, and z.
The QVector3D class can also be used to represent vertices in 3D space. The QVector3D class can also be used to represent vertices in 3D space.
We therefore do not need to provide a separate vertex class. We therefore do not need to provide a separate vertex class.
@ -529,6 +541,7 @@ QDataStream &operator>>(QDataStream &stream, QVector2D &vector)
\fn QVector3D::QVector3D(float xpos, float ypos, float zpos) \fn QVector3D::QVector3D(float xpos, float ypos, float zpos)
Constructs a vector with coordinates (\a xpos, \a ypos, \a zpos). Constructs a vector with coordinates (\a xpos, \a ypos, \a zpos).
All parameters must be finite.
*/ */
/*! /*!
@ -560,7 +573,7 @@ QDataStream &operator>>(QDataStream &stream, QVector2D &vector)
\fn QVector3D::QVector3D(QVector2D vector, float zpos) \fn QVector3D::QVector3D(QVector2D vector, float zpos)
Constructs a 3D vector from the specified 2D \a vector. The z Constructs a 3D vector from the specified 2D \a vector. The z
coordinate is set to \a zpos. coordinate is set to \a zpos, which must be finite.
\sa toVector2D() \sa toVector2D()
*/ */
@ -613,7 +626,7 @@ QDataStream &operator>>(QDataStream &stream, QVector2D &vector)
/*! /*!
\fn void QVector3D::setX(float x) \fn void QVector3D::setX(float x)
Sets the x coordinate of this point to the given \a x coordinate. Sets the x coordinate of this point to the given finite \a x coordinate.
\sa x(), setY(), setZ() \sa x(), setY(), setZ()
*/ */
@ -621,7 +634,7 @@ QDataStream &operator>>(QDataStream &stream, QVector2D &vector)
/*! /*!
\fn void QVector3D::setY(float y) \fn void QVector3D::setY(float y)
Sets the y coordinate of this point to the given \a y coordinate. Sets the y coordinate of this point to the given finite \a y coordinate.
\sa y(), setX(), setZ() \sa y(), setX(), setZ()
*/ */
@ -629,7 +642,7 @@ QDataStream &operator>>(QDataStream &stream, QVector2D &vector)
/*! /*!
\fn void QVector3D::setZ(float z) \fn void QVector3D::setZ(float z)
Sets the z coordinate of this point to the given \a z coordinate. Sets the z coordinate of this point to the given finite \a z coordinate.
\sa z(), setX(), setY() \sa z(), setX(), setY()
*/ */
@ -695,7 +708,7 @@ QDataStream &operator>>(QDataStream &stream, QVector2D &vector)
/*! /*!
\fn QVector3D &QVector3D::operator*=(float factor) \fn QVector3D &QVector3D::operator*=(float factor)
Multiplies this vector's coordinates by the given \a factor, and Multiplies this vector's coordinates by the given finite \a factor and
returns a reference to this vector. returns a reference to this vector.
\sa operator/=() \sa operator/=()
@ -717,8 +730,8 @@ QDataStream &operator>>(QDataStream &stream, QVector2D &vector)
/*! /*!
\fn QVector3D &QVector3D::operator/=(float divisor) \fn QVector3D &QVector3D::operator/=(float divisor)
Divides this vector's coordinates by the given \a divisor, and Divides this vector's coordinates by the given \a divisor, and returns a
returns a reference to this vector. reference to this vector. The \a divisor must not be either zero or NaN.
\sa operator*=() \sa operator*=()
*/ */
@ -727,8 +740,10 @@ QDataStream &operator>>(QDataStream &stream, QVector2D &vector)
\fn QVector3D &QVector3D::operator/=(QVector3D vector) \fn QVector3D &QVector3D::operator/=(QVector3D vector)
\since 5.5 \since 5.5
Divides the components of this vector by the corresponding Divides each component of this vector by the corresponding component in \a
components in \a vector. vector and returns a reference to this vector.
The \a vector must have no component that is either zero or NaN.
\sa operator*=() \sa operator*=()
*/ */
@ -751,8 +766,8 @@ QDataStream &operator>>(QDataStream &stream, QVector2D &vector)
/*! /*!
\fn QVector3D QVector3D::normal(QVector3D v1, QVector3D v2) \fn QVector3D QVector3D::normal(QVector3D v1, QVector3D v2)
Returns the normal vector of a plane defined by vectors \a v1 and \a v2, Returns the unit normal vector of a plane spanned by vectors \a v1 and \a
normalized to be a unit vector. v2, which must not be parallel to one another.
Use crossProduct() to compute the cross-product of \a v1 and \a v2 if you Use crossProduct() to compute the cross-product of \a v1 and \a v2 if you
do not need the result to be normalized to a unit vector. do not need the result to be normalized to a unit vector.
@ -763,8 +778,8 @@ QDataStream &operator>>(QDataStream &stream, QVector2D &vector)
/*! /*!
\fn QVector3D QVector3D::normal(QVector3D v1, QVector3D v2, QVector3D v3) \fn QVector3D QVector3D::normal(QVector3D v1, QVector3D v2, QVector3D v3)
Returns the normal vector of a plane defined by vectors Returns the unit normal vector of a plane spanned by vectors \a v2 - \a v1
\a v2 - \a v1 and \a v3 - \a v1, normalized to be a unit vector. and \a v3 - \a v1, which must not be parallel to one another.
Use crossProduct() to compute the cross-product of \a v2 - \a v1 and Use crossProduct() to compute the cross-product of \a v2 - \a v1 and
\a v3 - \a v1 if you do not need the result to be normalized to a \a v3 - \a v1 if you do not need the result to be normalized to a
@ -922,7 +937,7 @@ QVector3D QVector3D::unproject(const QMatrix4x4 &modelView, const QMatrix4x4 &pr
/*! //! friend /*! //! friend
\fn const QVector3D QVector3D::operator*(float factor, QVector3D vector) \fn const QVector3D QVector3D::operator*(float factor, QVector3D vector)
Returns a copy of the given \a vector, multiplied by the given \a factor. Returns a copy of the given \a vector, multiplied by the given finite \a factor.
\sa QVector3D::operator*=() \sa QVector3D::operator*=()
*/ */
@ -930,7 +945,7 @@ QVector3D QVector3D::unproject(const QMatrix4x4 &modelView, const QMatrix4x4 &pr
/*! //! friend /*! //! friend
\fn const QVector3D QVector3D::operator*(QVector3D vector, float factor) \fn const QVector3D QVector3D::operator*(QVector3D vector, float factor)
Returns a copy of the given \a vector, multiplied by the given \a factor. Returns a copy of the given \a vector, multiplied by the given finite \a factor.
\sa QVector3D::operator*=() \sa QVector3D::operator*=()
*/ */
@ -958,8 +973,10 @@ QVector3D QVector3D::unproject(const QMatrix4x4 &modelView, const QMatrix4x4 &pr
/*! //! friend /*! //! friend
\fn const QVector3D QVector3D::operator/(QVector3D vector, float divisor) \fn const QVector3D QVector3D::operator/(QVector3D vector, float divisor)
Returns the QVector3D object formed by dividing all three components of Returns the QVector3D object formed by dividing each component of the given
the given \a vector by the given \a divisor. \a vector by the given \a divisor.
The \a divisor must not be either zero or NaN.
\sa QVector3D::operator/=() \sa QVector3D::operator/=()
*/ */
@ -968,8 +985,10 @@ QVector3D QVector3D::unproject(const QMatrix4x4 &modelView, const QMatrix4x4 &pr
\fn const QVector3D QVector3D::operator/(QVector3D vector, QVector3D divisor) \fn const QVector3D QVector3D::operator/(QVector3D vector, QVector3D divisor)
\since 5.5 \since 5.5
Returns the QVector3D object formed by dividing components of the given Returns the QVector3D object formed by dividing each component of the given
\a vector by a respective components of the given \a divisor. \a vector by the corresponding component of the given \a divisor.
The \a divisor must have no component that is either zero or NaN.
\sa QVector3D::operator/=() \sa QVector3D::operator/=()
*/ */
@ -1100,6 +1119,7 @@ QDataStream &operator>>(QDataStream &stream, QVector3D &vector)
stream >> x; stream >> x;
stream >> y; stream >> y;
stream >> z; stream >> z;
Q_ASSERT(qIsFinite(x) && qIsFinite(y) && qIsFinite(z));
vector.setX(x); vector.setX(x);
vector.setY(y); vector.setY(y);
vector.setZ(z); vector.setZ(z);
@ -1121,6 +1141,10 @@ QDataStream &operator>>(QDataStream &stream, QVector3D &vector)
\ingroup painting-3D \ingroup painting-3D
\inmodule QtGui \inmodule QtGui
Vectors are one of the main building blocks of 4D affine representations of
3D space. They consist of four finite floating-point coordinates,
traditionally called x, y, z and w.
The QVector4D class can also be used to represent vertices in 4D space. The QVector4D class can also be used to represent vertices in 4D space.
We therefore do not need to provide a separate vertex class. We therefore do not need to provide a separate vertex class.
@ -1145,6 +1169,7 @@ QDataStream &operator>>(QDataStream &stream, QVector3D &vector)
\fn QVector4D::QVector4D(float xpos, float ypos, float zpos, float wpos) \fn QVector4D::QVector4D(float xpos, float ypos, float zpos, float wpos)
Constructs a vector with coordinates (\a xpos, \a ypos, \a zpos, \a wpos). Constructs a vector with coordinates (\a xpos, \a ypos, \a zpos, \a wpos).
All parameters must be finite.
*/ */
/*! /*!
@ -1176,7 +1201,8 @@ QDataStream &operator>>(QDataStream &stream, QVector3D &vector)
\fn QVector4D::QVector4D(QVector2D vector, float zpos, float wpos) \fn QVector4D::QVector4D(QVector2D vector, float zpos, float wpos)
Constructs a 4D vector from the specified 2D \a vector. The z Constructs a 4D vector from the specified 2D \a vector. The z
and w coordinates are set to \a zpos and \a wpos respectively. and w coordinates are set to \a zpos and \a wpos respectively,
each of which must be finite.
\sa toVector2D() \sa toVector2D()
*/ */
@ -1198,7 +1224,7 @@ QDataStream &operator>>(QDataStream &stream, QVector3D &vector)
\fn QVector4D::QVector4D(QVector3D vector, float wpos) \fn QVector4D::QVector4D(QVector3D vector, float wpos)
Constructs a 4D vector from the specified 3D \a vector. The w Constructs a 4D vector from the specified 3D \a vector. The w
coordinate is set to \a wpos. coordinate is set to \a wpos, which must be finite.
\sa toVector3D() \sa toVector3D()
*/ */
@ -1247,7 +1273,7 @@ QDataStream &operator>>(QDataStream &stream, QVector3D &vector)
/*! /*!
\fn void QVector4D::setX(float x) \fn void QVector4D::setX(float x)
Sets the x coordinate of this point to the given \a x coordinate. Sets the x coordinate of this point to the given finite \a x coordinate.
\sa x(), setY(), setZ(), setW() \sa x(), setY(), setZ(), setW()
*/ */
@ -1255,7 +1281,7 @@ QDataStream &operator>>(QDataStream &stream, QVector3D &vector)
/*! /*!
\fn void QVector4D::setY(float y) \fn void QVector4D::setY(float y)
Sets the y coordinate of this point to the given \a y coordinate. Sets the y coordinate of this point to the given finite \a y coordinate.
\sa y(), setX(), setZ(), setW() \sa y(), setX(), setZ(), setW()
*/ */
@ -1263,7 +1289,7 @@ QDataStream &operator>>(QDataStream &stream, QVector3D &vector)
/*! /*!
\fn void QVector4D::setZ(float z) \fn void QVector4D::setZ(float z)
Sets the z coordinate of this point to the given \a z coordinate. Sets the z coordinate of this point to the given finite \a z coordinate.
\sa z(), setX(), setY(), setW() \sa z(), setX(), setY(), setW()
*/ */
@ -1271,7 +1297,7 @@ QDataStream &operator>>(QDataStream &stream, QVector3D &vector)
/*! /*!
\fn void QVector4D::setW(float w) \fn void QVector4D::setW(float w)
Sets the w coordinate of this point to the given \a w coordinate. Sets the w coordinate of this point to the given finite \a w coordinate.
\sa w(), setX(), setY(), setZ() \sa w(), setX(), setY(), setZ()
*/ */
@ -1355,7 +1381,7 @@ QDataStream &operator>>(QDataStream &stream, QVector3D &vector)
/*! /*!
\fn QVector4D &QVector4D::operator*=(float factor) \fn QVector4D &QVector4D::operator*=(float factor)
Multiplies this vector's coordinates by the given \a factor, and Multiplies this vector's coordinates by the given finite \a factor, and
returns a reference to this vector. returns a reference to this vector.
\sa operator/=() \sa operator/=()
@ -1371,8 +1397,8 @@ QDataStream &operator>>(QDataStream &stream, QVector3D &vector)
/*! /*!
\fn QVector4D &QVector4D::operator/=(float divisor) \fn QVector4D &QVector4D::operator/=(float divisor)
Divides this vector's coordinates by the given \a divisor, and Divides this vector's coordinates by the given \a divisor, and returns a
returns a reference to this vector. reference to this vector. The \a divisor must not be either zero or NaN.
\sa operator*=() \sa operator*=()
*/ */
@ -1381,8 +1407,10 @@ QDataStream &operator>>(QDataStream &stream, QVector3D &vector)
\fn QVector4D &QVector4D::operator/=(QVector4D vector) \fn QVector4D &QVector4D::operator/=(QVector4D vector)
\since 5.5 \since 5.5
Divides the components of this vector by the corresponding Divides each component of this vector by the corresponding component of \a
components in \a vector. vector and returns a reference to this vector.
The \a vector must have no component that is either zero or NaN.
\sa operator*=() \sa operator*=()
*/ */
@ -1463,8 +1491,10 @@ QDataStream &operator>>(QDataStream &stream, QVector3D &vector)
/*! //! friend /*! //! friend
\fn const QVector4D QVector4D::operator/(QVector4D vector, float divisor) \fn const QVector4D QVector4D::operator/(QVector4D vector, float divisor)
Returns the QVector4D object formed by dividing all four components of Returns the QVector4D object formed by dividing each component of the given
the given \a vector by the given \a divisor. \a vector by the given \a divisor.
The \a divisor must not be either zero or NaN.
\sa QVector4D::operator/=() \sa QVector4D::operator/=()
*/ */
@ -1473,8 +1503,10 @@ QDataStream &operator>>(QDataStream &stream, QVector3D &vector)
\fn const QVector4D QVector4D::operator/(QVector4D vector, QVector4D divisor) \fn const QVector4D QVector4D::operator/(QVector4D vector, QVector4D divisor)
\since 5.5 \since 5.5
Returns the QVector4D object formed by dividing components of the given Returns the QVector4D object formed by dividing each component of the given
\a vector by a respective components of the given \a divisor. \a vector by the corresponding component of the given \a divisor.
The \a divisor must have no component that is either zero or NaN.
\sa QVector4D::operator/=() \sa QVector4D::operator/=()
*/ */
@ -1611,6 +1643,7 @@ QDataStream &operator>>(QDataStream &stream, QVector4D &vector)
stream >> y; stream >> y;
stream >> z; stream >> z;
stream >> w; stream >> w;
Q_ASSERT(qIsFinite(x) && qIsFinite(y) && qIsFinite(z) && qIsFinite(w));
vector.setX(x); vector.setX(x);
vector.setY(y); vector.setY(y);
vector.setZ(z); vector.setZ(z);

View File

@ -147,11 +147,14 @@ QT_WARNING_POP
constexpr friend inline QVector2D operator/(QVector2D vector, float divisor) constexpr friend inline QVector2D operator/(QVector2D vector, float divisor)
{ {
Q_ASSERT(divisor < 0 || divisor > 0);
return QVector2D(vector.v[0] / divisor, vector.v[1] / divisor); return QVector2D(vector.v[0] / divisor, vector.v[1] / divisor);
} }
constexpr friend inline QVector2D operator/(QVector2D vector, QVector2D divisor) constexpr friend inline QVector2D operator/(QVector2D vector, QVector2D divisor)
{ {
Q_ASSERT(divisor.v[0] < 0 || divisor.v[0] > 0);
Q_ASSERT(divisor.v[1] < 0 || divisor.v[1] > 0);
return QVector2D(vector.v[0] / divisor.v[0], vector.v[1] / divisor.v[1]); return QVector2D(vector.v[0] / divisor.v[0], vector.v[1] / divisor.v[1]);
} }
@ -288,12 +291,17 @@ QT_WARNING_POP
constexpr friend inline QVector3D operator/(QVector3D vector, float divisor) constexpr friend inline QVector3D operator/(QVector3D vector, float divisor)
{ {
Q_ASSERT(divisor < 0 || divisor > 0);
return QVector3D(vector.v[0] / divisor, vector.v[1] / divisor, vector.v[2] / divisor); return QVector3D(vector.v[0] / divisor, vector.v[1] / divisor, vector.v[2] / divisor);
} }
constexpr friend inline QVector3D operator/(QVector3D vector, QVector3D divisor) constexpr friend inline QVector3D operator/(QVector3D vector, QVector3D divisor)
{ {
return QVector3D(vector.v[0] / divisor.v[0], vector.v[1] / divisor.v[1], vector.v[2] / divisor.v[2]); Q_ASSERT(divisor.v[0] > 0 || divisor.v[0] < 0);
Q_ASSERT(divisor.v[1] > 0 || divisor.v[1] < 0);
Q_ASSERT(divisor.v[2] > 0 || divisor.v[2] < 0);
return QVector3D(vector.v[0] / divisor.v[0], vector.v[1] / divisor.v[1],
vector.v[2] / divisor.v[2]);
} }
friend Q_GUI_EXPORT bool qFuzzyCompare(QVector3D v1, QVector3D v2) noexcept; friend Q_GUI_EXPORT bool qFuzzyCompare(QVector3D v1, QVector3D v2) noexcept;
@ -422,12 +430,18 @@ QT_WARNING_POP
constexpr friend inline QVector4D operator/(QVector4D vector, float divisor) constexpr friend inline QVector4D operator/(QVector4D vector, float divisor)
{ {
Q_ASSERT(divisor < 0 || divisor > 0);
return QVector4D(vector.v[0] / divisor, vector.v[1] / divisor, vector.v[2] / divisor, vector.v[3] / divisor); return QVector4D(vector.v[0] / divisor, vector.v[1] / divisor, vector.v[2] / divisor, vector.v[3] / divisor);
} }
constexpr friend inline QVector4D operator/(QVector4D vector, QVector4D divisor) constexpr friend inline QVector4D operator/(QVector4D vector, QVector4D divisor)
{ {
return QVector4D(vector.v[0] / divisor.v[0], vector.v[1] / divisor.v[1], vector.v[2] / divisor.v[2], vector.v[3] / divisor.v[3]); Q_ASSERT(divisor.v[0] > 0 || divisor.v[0] < 0);
Q_ASSERT(divisor.v[1] > 0 || divisor.v[1] < 0);
Q_ASSERT(divisor.v[2] > 0 || divisor.v[2] < 0);
Q_ASSERT(divisor.v[3] > 0 || divisor.v[3] < 0);
return QVector4D(vector.v[0] / divisor.v[0], vector.v[1] / divisor.v[1],
vector.v[2] / divisor.v[2], vector.v[3] / divisor.v[3]);
} }
friend Q_GUI_EXPORT bool qFuzzyCompare(QVector4D v1, QVector4D v2) noexcept; friend Q_GUI_EXPORT bool qFuzzyCompare(QVector4D v1, QVector4D v2) noexcept;
@ -576,6 +590,7 @@ constexpr inline QVector2D &QVector2D::operator*=(QVector2D vector) noexcept
constexpr inline QVector2D &QVector2D::operator/=(float divisor) constexpr inline QVector2D &QVector2D::operator/=(float divisor)
{ {
Q_ASSERT(divisor < 0 || divisor > 0);
v[0] /= divisor; v[0] /= divisor;
v[1] /= divisor; v[1] /= divisor;
return *this; return *this;
@ -583,6 +598,8 @@ constexpr inline QVector2D &QVector2D::operator/=(float divisor)
constexpr inline QVector2D &QVector2D::operator/=(QVector2D vector) constexpr inline QVector2D &QVector2D::operator/=(QVector2D vector)
{ {
Q_ASSERT(vector.v[0] > 0 || vector.v[0] < 0);
Q_ASSERT(vector.v[1] > 0 || vector.v[1] < 0);
v[0] /= vector.v[0]; v[0] /= vector.v[0];
v[1] /= vector.v[1]; v[1] /= vector.v[1];
return *this; return *this;
@ -736,6 +753,7 @@ constexpr inline QVector3D &QVector3D::operator*=(QVector3D vector) noexcept
constexpr inline QVector3D &QVector3D::operator/=(float divisor) constexpr inline QVector3D &QVector3D::operator/=(float divisor)
{ {
Q_ASSERT(divisor < 0 || divisor > 0);
v[0] /= divisor; v[0] /= divisor;
v[1] /= divisor; v[1] /= divisor;
v[2] /= divisor; v[2] /= divisor;
@ -744,6 +762,9 @@ constexpr inline QVector3D &QVector3D::operator/=(float divisor)
constexpr inline QVector3D &QVector3D::operator/=(QVector3D vector) constexpr inline QVector3D &QVector3D::operator/=(QVector3D vector)
{ {
Q_ASSERT(vector.v[0] > 0 || vector.v[0] < 0);
Q_ASSERT(vector.v[1] > 0 || vector.v[1] < 0);
Q_ASSERT(vector.v[2] > 0 || vector.v[2] < 0);
v[0] /= vector.v[0]; v[0] /= vector.v[0];
v[1] /= vector.v[1]; v[1] /= vector.v[1];
v[2] /= vector.v[2]; v[2] /= vector.v[2];
@ -947,6 +968,7 @@ constexpr inline QVector4D &QVector4D::operator*=(QVector4D vector) noexcept
constexpr inline QVector4D &QVector4D::operator/=(float divisor) constexpr inline QVector4D &QVector4D::operator/=(float divisor)
{ {
Q_ASSERT(divisor < 0 || divisor > 0);
v[0] /= divisor; v[0] /= divisor;
v[1] /= divisor; v[1] /= divisor;
v[2] /= divisor; v[2] /= divisor;
@ -956,6 +978,10 @@ constexpr inline QVector4D &QVector4D::operator/=(float divisor)
constexpr inline QVector4D &QVector4D::operator/=(QVector4D vector) constexpr inline QVector4D &QVector4D::operator/=(QVector4D vector)
{ {
Q_ASSERT(vector.v[0] > 0 || vector.v[0] < 0);
Q_ASSERT(vector.v[1] > 0 || vector.v[1] < 0);
Q_ASSERT(vector.v[2] > 0 || vector.v[2] < 0);
Q_ASSERT(vector.v[3] > 0 || vector.v[3] < 0);
v[0] /= vector.v[0]; v[0] /= vector.v[0];
v[1] /= vector.v[1]; v[1] /= vector.v[1];
v[2] /= vector.v[2]; v[2] /= vector.v[2];