24 #include "Scene/GraphScene.h"
29 #include <QGraphicsScene>
30 #include <QGraphicsSceneMouseEvent>
33 #include <QPainterPath>
36 #include <QtAlgorithms>
38 #include <QGraphicsSimpleTextItem>
39 #include <QtCore/qmath.h>
40 #include <boost/math/constants/constants.hpp>
45 _loop = (pointer()->from() == pointer()->to());
46 setPath(createCurves());
61 setPath(createCurves());
64 QPolygonF EdgeItem::createArrow(
const QPointF &pos1,
const QPointF &pos2)
const
66 const qreal pi = boost::math::constants::pi<double>();
67 QLineF line(pos1, pos2);
68 qreal angle = ::qAcos(line.dx() / line.length());
70 angle = pi*2.0 - angle;
74 QPointF destArrowP1 = pos2 + QPointF(qSin(angle - pi/3.0) * arrowSize, qCos(angle - pi/3.0) * arrowSize);
75 QPointF destArrowP2 = pos2 + QPointF(qSin(angle - pi + pi/3.0) * arrowSize, qCos(angle - pi + pi/3.0) * arrowSize);
76 QPolygonF arrow(QPolygonF() << destArrowP1 << pos2 << destArrowP2);
79 qreal x = pos2.x() - pos1.x();
80 qreal y = pos2.y() - pos1.y();
84 arrow.translate(-x, -y);
88 QPainterPath EdgeItem::createLoop(
const QPointF& pos)
const
91 return QPainterPath();
96 QPointF documentCenter = g->document()->sceneRect().center();
97 qreal size = 30 + (20 * pointer()->relativeIndex());
98 qreal angle = qAtan2((pos.x() - documentCenter.x()), (pos.y() - documentCenter.y()));
99 qreal posx = (pos.x() - (((size / 2) * qSin(angle)) * -1) - (size / 2));
100 qreal posy = (pos.y() + (((size / 2) * qCos(angle))) - (size / 2));
101 p.addEllipse(posx, posy, size, size);
105 QPainterPath EdgeItem::createCurves()
107 const qreal pi = boost::math::constants::pi<double>();
111 return QPainterPath();
114 if (!pointer()->from() || !pointer()->to()) {
116 return QPainterPath();
119 QPointF startPos(pointer()->from()->x(), pointer()->from()->y());
123 return createLoop(startPos);
126 QPointF endPos(pointer()->to()->x(), pointer()->to()->y());
128 QPolygonF arrow = createArrow(startPos, endPos);
130 if (startPos.x() > endPos.x()) {
131 qSwap(startPos, endPos);
141 qreal x = endPos.x() - startPos.x();
142 qreal y = endPos.y() - startPos.y();
143 qreal angle = atan2(y, x);
146 qreal theta = angle + pi/2.0;
147 qreal finalX = qCos(theta);
148 qreal finalY = qSin(theta);
149 int lastIndex = pointer()->relativeIndex();
157 qreal size = qSqrt(qPow((x * 0.1), 2) + qPow((y * 0.1), 2)) * lastIndex;
161 finalX += startPos.x() + x / 2;
162 finalY += startPos.y() + y / 2;
167 p.quadTo(finalX, finalY, endPos.x(), endPos.y());
170 QPointF middle = p.pointAtPercent(0.5);
172 x = startPos.x() + (endPos.x() - startPos.x()) / 2;
173 y = startPos.y() + (endPos.y() - startPos.y()) / 2;
174 QLineF line2(QPointF(x, y), middle);
176 arrow.translate(+line2.dx(), +line2.dy());
182 #include "EdgeItem.moc"
boost::shared_ptr< DataStructure > DataStructurePtr
boost::shared_ptr< Pointer > PointerPtr
EdgeItem(PointerPtr edge, QGraphicsItem *parent=0)
Default constructor.