Sh3/grairobject.cpp
2025-07-02 07:45:34 +03:00

254 lines
4.6 KiB
C++

#include "grairobject.h"
#include "widget.h"
grAirObject::grAirObject(QWidget *parent)
{
aType = gType = 0;
lX = lY = oldLX = oldLY = 0;
pic.load(":new/pics/type_0e.xpm");
wid = hei = 15;
scIndex = 1;
coler = new QGraphicsColorizeEffect();
coler->setColor(Qt::yellow);
for (int i=0; i<4; i++) altPoly[i].clear();
altPoly[0].setPoints(3, 31,15, 40,15, 35,20);
altPoly[1].setPoints(4, 31,20, 40,20, 40,23, 31,23);
altPoly[2].setPoints(4, 31,22, 40,22, 40,15, 31,15);
altPoly[3].setPoints(3, 31,20, 40,20, 35,15);
}
QRectF grAirObject::boundingRect() const
{
qreal d = 250/scIndex;
if (d<250) d=250;
return QRectF(-50+lX/scIndex,-50+lY/scIndex,d,d);
}
void grAirObject::setInfoForRocket(qreal cX, qreal cY, qreal cH, qreal vx, qreal vy)
{
rX = cX;
rY = cY;
rH = cH;
rVx = vx;
rVy = vy;
rV0 = sqrt(vx*vx+vy*vy);
}
void grAirObject::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
if (exist)
{
QPen locPen;
qreal an = 0;
locPen.setWidthF(1.3);
painter->setPen(locPen);
// âåêòîð ñêîðîñòè
if (v0) {
QLineF lf(0, 0, vY, -vX);
// QLineF lf(oldLX, oldLY, lX, lY);
an = lf.angle();
lf = QLineF(lX/scIndex, lY/scIndex, 0, 0);
lf.setAngle(an);
lf.setLength(v0*10);
painter->drawLine(lf);
painter->drawEllipse(lX/scIndex, lY/scIndex, 1, 1);
}
QImage im(50,50,QImage::Format_ARGB32);
im.fill(Qt::transparent);
QPainter *p = new QPainter(&im);
p->setBrush(Qt::SolidPattern);
// êàðòèíêà
if ((viewSettings==0)||(viewSettings==2))
p->drawPixmap(15, 15, pic);
// ýøåëîí
if ((viewSettings!=1)&&(viewSettings!=3))
p->drawPolygon(altPoly[alt]);
// íîìåð
if ((viewSettings!=1)&&(viewSettings!=2))
{
QFont f = p->font();
f.setPointSizeF(7);
p->setFont(f);
p->drawText(32, 33, QString::number(numb));
}
p->end();
if ((an>45)&&(an<210))
painter->drawImage(lX/scIndex-10, lY/scIndex-15, im);
else
painter->drawImage(lX/scIndex-35, lY/scIndex-45, im);
}
else
{
painter->setBrush(Qt::NoBrush);
painter->setPen(Qt::NoPen);
painter->drawPoint(0,0);
}
}
void grAirObject::setScaleIndex(qreal s)
{
if (scIndex!=s){
prepareGeometryChange();
scIndex=s;
}
}
void grAirObject::setCoord(qreal cx, qreal cy, qreal ch)
{
cX = cx; cY= cy; cH = ch;
prepareGeometryChange();
oldLX = lX;
oldLY = lY;
lX=cy;
lY=-cx;
if (ch>=60) alt = 3;
else if ((ch>=30)&&(ch<60)) alt=2;
else if ((ch>=10)&&(ch<30)) alt=1;
else alt = 0;
}
void grAirObject::setCoord(qreal cx, qreal cy)
{
setCoord(cx, cy, cH);
}
void grAirObject::setSpeed(qreal vx, qreal vy)
{
vX = vx;
vY = vy;
v0=sqrt(vX*vX+vY*vY);
}
void grAirObject::moveByTime(qreal time)
{
cX += vX*time;
cY += vY*time;
setCoord(cX, cY);
}
void grAirObject::setAType(int d)
{
switch (d) {
case 0:
case 1:
case 6:
case 7:
case 8:
case 10:
case 11:
if (aType!=d)
{
prepareGeometryChange();
aType = d;
};
break;
default:
prepareGeometryChange();
aType = 0;
break;
}
setPic();
}
void grAirObject::setGType(int d)
{
if ((d>=0)&&(d<4)){
if (gType!=d)
{
prepareGeometryChange();
gType = d;
}
else
{
// prepareGeometryChange();
// gType = 0;
}
}
setPic();
switch (gType)
{
case 3:
coler->setColor(Qt::magenta);
break;
case 2:
coler->setColor(Qt::red);
break;
case 1:
coler->setColor(Qt::green);
break;
default:
coler->setColor(Qt::yellow);
}
}
void grAirObject::setPic()
{
QString s;
s=":/new/pics/type_"+QString::number(aType);
switch (gType) {
case 2:
case 3:
s+="o.xpm";
break;
case 0:
case 1:
default:
s+="e.xpm";
break;
}
pic.load(s);
}
void grAirObject::setViewSettings(int d)
{
if (viewSettings!=d)
{
prepareGeometryChange();
viewSettings = d;
}
}
void grAirObject::setNull()
{
prepareGeometryChange();
exist = false;
count = 0;
setCoord(10000, 10000, 0);
setAType(0);
setGType(0);
setSpeed(0, 0);
setInfoForRocket(10000,10000,0,0,0);
}