File indexing completed on 2024-04-28 07:39:35

0001 /*.
0002     SPDX-FileCopyrightText: 2007 Vladimir Kuznetsov <ks.vladimir@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "arrow.h"
0008 
0009 #include <cmath>
0010 
0011 #include <QPainter>
0012 
0013 const int ARROW_STROKE = 6;
0014 
0015 Arrow::Arrow(const QLineF& line, int width) : QLineF(line), _width(width)
0016 {
0017 }
0018 
0019 Arrow::Arrow(const QPointF& p1, const QPointF& p2, int width) :
0020     QLineF(p1, p2), _width(width)
0021 {
0022 }
0023 
0024 Arrow::Arrow(qreal x1, qreal y1, qreal x2, qreal y2, int width) :
0025     QLineF(x1, y1, x2, y2), _width(width)
0026 {
0027 }
0028 
0029 void Arrow::draw(QPainter* painter) const
0030 {
0031     const QTransform& transform = painter->worldTransform();
0032     QLineF transformed = transform.map(*this);
0033     QLineF real_transformed(floor(transformed.x1()) + 0.5,
0034                             floor(transformed.y1()) + 0.5,
0035                             floor(transformed.x2()) + 0.5,
0036                             floor(transformed.y2()) + 0.5);
0037     QLineF line_unit = real_transformed.unitVector();
0038     line_unit.translate(-line_unit.p1());
0039     QLineF line_normal = line_unit.normalVector();
0040     
0041     QPointF arrow_head_base =
0042         real_transformed.p2() - line_unit.p2() * 0.866 * _width;
0043     QLineF arrow_line(transformed);
0044     arrow_line.setLength(arrow_line.length() - 0.5 * _width);
0045     
0046     QPolygonF arrow_head(3);
0047     arrow_head[0] = real_transformed.p2();
0048     arrow_head[1] = arrow_head_base + line_normal.p2() * 0.5 * _width;
0049     arrow_head[2] = arrow_head_base - line_normal.p2() * 0.5 * _width;
0050     
0051     painter->save();
0052     painter->setWorldMatrixEnabled(false);
0053     QPen pen = painter->pen();
0054     pen.setWidth(0);
0055     painter->setPen(pen);
0056     painter->drawLine(arrow_line);
0057     painter->setRenderHint(QPainter::Antialiasing, true);
0058     painter->setBrush(pen.color());
0059     painter->setPen(Qt::NoPen);
0060     painter->drawPolygon(arrow_head);
0061     painter->restore();
0062 }