Examples: use std::atan2 for simper angle calculations
Using std::atan2 gets the right answer directly from dy and dx, without having to fix up quadrant as we needed to with acos (albeit we have to negate dy in some cases, to match prior sense of angles). In the process, it avoids explicit division, which would be an error when the line's length is zero. Change-Id: Ia2923159d38834e08e6f15cbff6766ed419fa804 Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
This commit is contained in:
parent
89870a35bd
commit
0b822c2209
@ -54,7 +54,7 @@
|
||||
#include <QPainter>
|
||||
#include <QStyleOption>
|
||||
|
||||
#include <math.h>
|
||||
#include <cmath>
|
||||
|
||||
static const double Pi = 3.14159265358979323846264338327950288419717;
|
||||
static double TwoPi = 2.0 * Pi;
|
||||
@ -139,9 +139,7 @@ void Mouse::timerEvent(QTimerEvent *)
|
||||
//! [5]
|
||||
QLineF lineToCenter(QPointF(0, 0), mapFromScene(0, 0));
|
||||
if (lineToCenter.length() > 150) {
|
||||
qreal angleToCenter = ::acos(lineToCenter.dx() / lineToCenter.length());
|
||||
if (lineToCenter.dy() < 0)
|
||||
angleToCenter = TwoPi - angleToCenter;
|
||||
qreal angleToCenter = std::atan2(lineToCenter.dy(), lineToCenter.dx());
|
||||
angleToCenter = normalizeAngle((Pi - angleToCenter) + Pi / 2);
|
||||
|
||||
if (angleToCenter < Pi && angleToCenter > Pi / 4) {
|
||||
@ -170,9 +168,7 @@ void Mouse::timerEvent(QTimerEvent *)
|
||||
continue;
|
||||
|
||||
QLineF lineToMouse(QPointF(0, 0), mapFromItem(item, 0, 0));
|
||||
qreal angleToMouse = ::acos(lineToMouse.dx() / lineToMouse.length());
|
||||
if (lineToMouse.dy() < 0)
|
||||
angleToMouse = TwoPi - angleToMouse;
|
||||
qreal angleToMouse = std::atan2(lineToMouse.dy(), lineToMouse.dx());
|
||||
angleToMouse = normalizeAngle((Pi - angleToMouse) + Pi / 2);
|
||||
|
||||
if (angleToMouse >= 0 && angleToMouse < Pi / 2) {
|
||||
|
@ -54,7 +54,7 @@
|
||||
#include <QPainter>
|
||||
#include <QStyleOption>
|
||||
|
||||
#include <math.h>
|
||||
#include <cmath>
|
||||
|
||||
static const double Pi = 3.14159265358979323846264338327950288419717;
|
||||
static double TwoPi = 2.0 * Pi;
|
||||
@ -140,9 +140,7 @@ void Mouse::advance(int step)
|
||||
//! [5]
|
||||
QLineF lineToCenter(QPointF(0, 0), mapFromScene(0, 0));
|
||||
if (lineToCenter.length() > 150) {
|
||||
qreal angleToCenter = ::acos(lineToCenter.dx() / lineToCenter.length());
|
||||
if (lineToCenter.dy() < 0)
|
||||
angleToCenter = TwoPi - angleToCenter;
|
||||
qreal angleToCenter = std::atan2(lineToCenter.dy(), lineToCenter.dx());
|
||||
angleToCenter = normalizeAngle((Pi - angleToCenter) + Pi / 2);
|
||||
|
||||
if (angleToCenter < Pi && angleToCenter > Pi / 4) {
|
||||
@ -171,9 +169,7 @@ void Mouse::advance(int step)
|
||||
continue;
|
||||
|
||||
QLineF lineToMouse(QPointF(0, 0), mapFromItem(item, 0, 0));
|
||||
qreal angleToMouse = ::acos(lineToMouse.dx() / lineToMouse.length());
|
||||
if (lineToMouse.dy() < 0)
|
||||
angleToMouse = TwoPi - angleToMouse;
|
||||
qreal angleToMouse = std::atan2(lineToMouse.dy(), lineToMouse.dx());
|
||||
angleToMouse = normalizeAngle((Pi - angleToMouse) + Pi / 2);
|
||||
|
||||
if (angleToMouse >= 0 && angleToMouse < Pi / 2) {
|
||||
|
@ -51,7 +51,7 @@
|
||||
|
||||
#include "arrow.h"
|
||||
|
||||
#include <math.h>
|
||||
#include <cmath>
|
||||
|
||||
#include <QPen>
|
||||
#include <QPainter>
|
||||
@ -132,9 +132,7 @@ void Arrow::paint(QPainter *painter, const QStyleOptionGraphicsItem *,
|
||||
setLine(QLineF(intersectPoint, myStartItem->pos()));
|
||||
//! [5] //! [6]
|
||||
|
||||
double angle = ::acos(line().dx() / line().length());
|
||||
if (line().dy() >= 0)
|
||||
angle = (Pi * 2) - angle;
|
||||
double angle = std::atan2(-line().dy(), line().dx());
|
||||
|
||||
QPointF arrowP1 = line().p1() + QPointF(sin(angle + Pi / 3) * arrowSize,
|
||||
cos(angle + Pi / 3) * arrowSize);
|
||||
|
@ -51,12 +51,11 @@
|
||||
#include "edge.h"
|
||||
#include "node.h"
|
||||
|
||||
#include <math.h>
|
||||
#include <cmath>
|
||||
|
||||
#include <QPainter>
|
||||
|
||||
static const double Pi = 3.14159265358979323846264338327950288419717;
|
||||
static double TwoPi = 2.0 * Pi;
|
||||
|
||||
//! [0]
|
||||
Edge::Edge(Node *sourceNode, Node *destNode)
|
||||
@ -139,9 +138,7 @@ void Edge::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
|
||||
|
||||
//! [6]
|
||||
// Draw the arrows
|
||||
double angle = ::acos(line.dx() / line.length());
|
||||
if (line.dy() >= 0)
|
||||
angle = TwoPi - angle;
|
||||
double angle = std::atan2(-line.dy(), line.dx());
|
||||
|
||||
QPointF sourceArrowP1 = sourcePoint + QPointF(sin(angle + Pi / 3) * arrowSize,
|
||||
cos(angle + Pi / 3) * arrowSize);
|
||||
|
@ -125,9 +125,9 @@ QModelIndex PieView::indexAt(const QPoint &point) const
|
||||
return QModelIndex();
|
||||
|
||||
// Determine the angle of the point.
|
||||
double angle = (180 / M_PI) * std::acos(cx / d);
|
||||
if (cy < 0)
|
||||
angle = 360 - angle;
|
||||
double angle = (180 / M_PI) * std::atan2(cy, cx);
|
||||
if (angle < 0)
|
||||
angle = 360 + angle;
|
||||
|
||||
// Find the relevant slice of the pie.
|
||||
double startAngle = 0.0;
|
||||
|
Loading…
Reference in New Issue
Block a user