Files
qad/libs/map/mapitemellipse.cpp
peri4 958c81fb1d version 2.13.0
add Map library (MapView with OSM maps and items) and mapviewer util
2023-01-20 09:16:42 +03:00

78 lines
1.3 KiB
C++

#include "mapitemellipse.h"
#include <math.h>
MapItemEllipse::MapItemEllipse(const QRectF & r) {
setEllipse(r);
}
MapItemEllipse::MapItemEllipse(const QPointF & p, double rx, double ry) {
setEllipse(p, rx, ry);
}
void MapItemEllipse::setStartAngle(double a) {
sa = a;
rebuild();
updateParent();
}
void MapItemEllipse::setEndAngle(double a) {
ea = a;
rebuild();
updateParent();
}
void MapItemEllipse::setEllipse(const QRectF & r) {
rct = r;
rebuild();
updateParent();
}
void MapItemEllipse::setEllipse(const QPointF & p, double rx, double ry) {
rct.setWidth(rx * 2.);
rct.setHeight(ry * 2.);
rct.moveCenter(p);
rebuild();
updateParent();
}
void MapItemEllipse::draw(QPainter * p) {
p->setPen(pen());
p->setBrush(brush());
QPolygonF dp(pol);
double us = unitScale();
for (auto & i: dp)
i = QPointF(i.x(), -i.y()) / us;
p->drawPolygon(dp);
setBoundingRect(dp.boundingRect());
}
void MapItemEllipse::rebuild() {
pol.clear();
QPointF c = rct.center();
bool full = sa == ea;
if (!full) pol << c;
double w = rct.width() / 2., h = rct.height() / 2.;
static double deg2rad = M_PI / 180.;
if (full) {
sa = 0.;
ea = 360.;
} else {
if (ea < sa) qSwap(sa, ea);
}
for (double a = sa; a <= ea; a += 3.) {
if (a > ea) a = ea;
QPointF p(sin(a * deg2rad) * w, cos(a * deg2rad) * h);
pol << (c + p);
}
if (!full) pol << c;
}