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 }