MAV2DIcon.cc 4.61 KB
Newer Older
1 2 3
#include "MAV2DIcon.h"
#include <QPainter>

4 5 6
#include <qmath.h>

MAV2DIcon::MAV2DIcon(qreal x, qreal y, int radius, int type, const QColor& color, QString name, Alignment alignment, QPen* pen)
7
    : Point(x, y, name, alignment),
8 9 10 11
    yaw(0.0f),
    radius(radius),
    type(type),
    iconColor(color)
12
{
13 14
    size = QSize(radius, radius);
    drawIcon(pen);
15 16
}

17
MAV2DIcon::MAV2DIcon(qreal x, qreal y, QString name, Alignment alignment, QPen* pen)
18 19 20 21
    : Point(x, y, name, alignment),
    radius(20),
    type(0),
    iconColor(Qt::yellow)
22 23
{
    size = QSize(radius, radius);
24
    drawIcon(pen);
25 26 27 28 29 30 31 32
}

MAV2DIcon::~MAV2DIcon()
{
    delete mypixmap;
}

void MAV2DIcon::setPen(QPen* pen)
33
{
34 35
    mypen = pen;
    drawIcon(pen);
36 37 38
}

/**
39 40
 * Yaw changes of less than ±15 degrees are ignored.
 *
41
 * @param yaw in radians, 0 = north, positive = clockwise
42
 */
43
void MAV2DIcon::setYaw(float yaw)
44
{
45 46 47 48 49 50 51 52 53 54 55
    float diff = fabs(yaw - this->yaw);
    while (diff > M_PI)
    {
        diff -= M_PI;
    }

    if (diff > 0.25)
    {
        this->yaw = yaw;
        drawIcon(mypen);
    }
56 57 58 59
}

void MAV2DIcon::drawIcon(QPen* pen)
{
60 61 62 63 64 65 66 67 68 69 70 71 72 73
    switch (type)
    {
    case MAV_ICON_GENERIC:
    case MAV_ICON_AIRPLANE:
    case MAV_ICON_QUADROTOR:
    case MAV_ICON_ROTARY_WING:
    default:
        {
            mypixmap = new QPixmap(radius+1, radius+1);
            mypixmap->fill(Qt::transparent);
            QPainter painter(mypixmap);
            painter.setRenderHint(QPainter::TextAntialiasing);
            painter.setRenderHint(QPainter::Antialiasing);
            painter.setRenderHint(QPainter::HighQualityAntialiasing);
74

75 76 77
            // Rotate by yaw
            painter.translate(radius/2, radius/2);
            painter.rotate(((yaw/(float)M_PI)+1.0f)*360.0f);
78

79
            // DRAW AIRPLANE
80

81
            qDebug() << "ICON SIZE:" << radius;
82

83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
            float iconSize = radius*0.9f;
            QPolygonF poly(24);
            poly.replace(0, QPointF(0.000000f*iconSize, -0.312500f*iconSize));
            poly.replace(1, QPointF(0.025000f*iconSize, -0.287500f*iconSize));
            poly.replace(2, QPointF(0.037500f*iconSize, -0.237500f*iconSize));
            poly.replace(3, QPointF(0.031250f*iconSize, -0.187500f*iconSize));
            poly.replace(4, QPointF(0.025000f*iconSize, -0.043750f*iconSize));
            poly.replace(5, QPointF(0.500000f*iconSize, -0.025000f*iconSize));
            poly.replace(6, QPointF(0.500000f*iconSize, 0.025000f*iconSize));
            poly.replace(7, QPointF(0.025000f*iconSize, 0.043750f*iconSize));
            poly.replace(8, QPointF(0.025000f*iconSize, 0.162500f*iconSize));
            poly.replace(9, QPointF(0.137500f*iconSize, 0.181250f*iconSize));
            poly.replace(10, QPointF(0.137500f*iconSize, 0.218750f*iconSize));
            poly.replace(11, QPointF(0.025000f*iconSize, 0.206250f*iconSize));
            poly.replace(12, QPointF(-0.025000f*iconSize, 0.206250f*iconSize));
            poly.replace(13, QPointF(-0.137500f*iconSize, 0.218750f*iconSize));
            poly.replace(14, QPointF(-0.137500f*iconSize, 0.181250f*iconSize));
            poly.replace(15, QPointF(-0.025000f*iconSize, 0.162500f*iconSize));
            poly.replace(16, QPointF(-0.025000f*iconSize, 0.043750f*iconSize));
            poly.replace(17, QPointF(-0.500000f*iconSize, 0.025000f*iconSize));
            poly.replace(18, QPointF(-0.500000f*iconSize, -0.025000f*iconSize));
            poly.replace(19, QPointF(-0.025000f*iconSize, -0.043750f*iconSize));
            poly.replace(20, QPointF(-0.031250f*iconSize, -0.187500f*iconSize));
            poly.replace(21, QPointF(-0.037500f*iconSize, -0.237500f*iconSize));
            poly.replace(22, QPointF(-0.031250f*iconSize, -0.262500f*iconSize));
            poly.replace(23, QPointF(0.000000f*iconSize, -0.312500f*iconSize));
109

110 111 112 113 114 115 116 117 118 119 120
            //    // Select color based on if this is the current waypoint
            //    if (list.at(i)->getCurrent())
            //    {
            //        color = QGC::colorCyan;//uas->getColor();
            //        pen.setWidthF(refLineWidthToPen(0.8f));
            //    }
            //    else
            //    {
            //        color = uas->getColor();
            //        pen.setWidthF(refLineWidthToPen(0.4f));
            //    }
121

122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
            //pen.setColor(color);
//            if (pen)
//            {
//                pen->setWidthF(2);
//                painter.setPen(*pen);
//            }
//            else
//            {
//                QPen pen2(Qt::red);
//                pen2.setWidth(0);
//                painter.setPen(pen2);
//            }
            painter.setBrush(QBrush(iconColor));

            painter.drawPolygon(poly);
        }
        break;
    }
140
}