This commit is contained in:
2023-03-17 13:48:26 +03:00
parent e9b995879a
commit c3d1d0fa69

View File

@@ -2206,43 +2206,47 @@ void Graphic::calcLOD(int index) {
if (!m_LODOptimization) return; if (!m_LODOptimization) return;
GraphicType & t(graphics[index]); GraphicType & t(graphics[index]);
t._lod.clear(); t._lod.clear();
t._lod.reserve(32);
int pcnt = t.polyline.size(); int pcnt = t.polyline.size();
// qDebug() << "calcLOD" << index; // qDebug() << "calcLOD" << index;
while (pcnt >= 10) { while (pcnt >= 10) {
QPolygonF & pl(t._lod.isEmpty() ? t.polyline : t._lod.back()); QPolygonF & pl(t._lod.isEmpty() ? t.polyline : t._lod.back());
t._lod.append(QPolygonF()); t._lod.append(QPolygonF());
QPolygonF & cl(t._lod.back()); QPolygonF & cl(t._lod.back());
cl << pl.front(); if (pl.size() > 4) {
int qcnt = (pl.size() + 1) / 4; cl << pl.front();
pcnt = qcnt * 2 + 2; int qcnt = (pl.size() + 1) / 4;
int pc = 4; pcnt = qcnt * 2 + 2;
qreal mx[2] = {0., 0.}, my[2] = {0., 0.}, my_x[2] = {0., 0.}, px, py; int pc = 4;
for (int i = 0; i < qcnt; ++i) { qreal mx[2] = {0., 0.}, my[2] = {0., 0.}, my_x[2] = {0., 0.}, px, py;
int j = i * 4 + 1; for (int i = 0; i < qcnt; ++i) {
if (i == qcnt - 1) pc = pl.size() - j - 1; int j = i * 4 + 1;
mx[0] = mx[1] = my_x[0] = my_x[1] = pl[j].x(); if (i == qcnt - 1) pc = pl.size() - j - 1;
my[0] = my[1] = pl[j].y(); mx[0] = mx[1] = my_x[0] = my_x[1] = pl[j].x();
for (int k = 1; k < pc; ++k) { my[0] = my[1] = pl[j].y();
px = pl[j + k].x(); for (int k = 1; k < pc; ++k) {
py = pl[j + k].y(); px = pl[j + k].x();
mx[0] = qMin(mx[0], px); py = pl[j + k].y();
mx[1] = qMax(mx[1], px); mx[0] = qMin(mx[0], px);
if (my[0] > py) { mx[1] = qMax(mx[1], px);
my[0] = py; if (my[0] > py) {
my_x[0] = px; my[0] = py;
} my_x[0] = px;
if (my[1] < py) { }
my[1] = py; if (my[1] < py) {
my_x[1] = px; my[1] = py;
my_x[1] = px;
}
} }
qreal dx = (mx[1] - mx[0]) / 4., cx = (mx[1] + mx[0]) / 2.;
if (my_x[1] >= my_x[0])
cl << QPointF(cx - dx, my[0]) << QPointF(cx + dx, my[1]);
else
cl << QPointF(cx - dx, my[1]) << QPointF(cx + dx, my[0]);
} }
qreal dx = (mx[1] - mx[0]) / 4., cx = (mx[1] + mx[0]) / 2.; cl << pl.back();
if (my_x[1] >= my_x[0]) } else
cl << QPointF(cx - dx, my[0]) << QPointF(cx + dx, my[1]); cl = pl;
else
cl << QPointF(cx - dx, my[1]) << QPointF(cx + dx, my[0]);
}
cl << pl.back();
// qDebug() << "lod" << t._lod.size() << "->" << cl.size(); // qDebug() << "lod" << t._lod.size() << "->" << cl.size();
} }
} }