diff --git a/libs/graphic/graphic.cpp b/libs/graphic/graphic.cpp index ffad2b2..8ee8b3d 100644 --- a/libs/graphic/graphic.cpp +++ b/libs/graphic/graphic.cpp @@ -2206,43 +2206,47 @@ void Graphic::calcLOD(int index) { if (!m_LODOptimization) return; GraphicType & t(graphics[index]); t._lod.clear(); + t._lod.reserve(32); int pcnt = t.polyline.size(); // qDebug() << "calcLOD" << index; while (pcnt >= 10) { QPolygonF & pl(t._lod.isEmpty() ? t.polyline : t._lod.back()); t._lod.append(QPolygonF()); QPolygonF & cl(t._lod.back()); - cl << pl.front(); - int qcnt = (pl.size() + 1) / 4; - pcnt = qcnt * 2 + 2; - int pc = 4; - qreal mx[2] = {0., 0.}, my[2] = {0., 0.}, my_x[2] = {0., 0.}, px, py; - for (int i = 0; i < qcnt; ++i) { - int j = i * 4 + 1; - if (i == qcnt - 1) pc = pl.size() - j - 1; - mx[0] = mx[1] = my_x[0] = my_x[1] = pl[j].x(); - my[0] = my[1] = pl[j].y(); - for (int k = 1; k < pc; ++k) { - px = pl[j + k].x(); - py = pl[j + k].y(); - mx[0] = qMin(mx[0], px); - mx[1] = qMax(mx[1], px); - if (my[0] > py) { - my[0] = py; - my_x[0] = px; - } - if (my[1] < py) { - my[1] = py; - my_x[1] = px; + if (pl.size() > 4) { + cl << pl.front(); + int qcnt = (pl.size() + 1) / 4; + pcnt = qcnt * 2 + 2; + int pc = 4; + qreal mx[2] = {0., 0.}, my[2] = {0., 0.}, my_x[2] = {0., 0.}, px, py; + for (int i = 0; i < qcnt; ++i) { + int j = i * 4 + 1; + if (i == qcnt - 1) pc = pl.size() - j - 1; + mx[0] = mx[1] = my_x[0] = my_x[1] = pl[j].x(); + my[0] = my[1] = pl[j].y(); + for (int k = 1; k < pc; ++k) { + px = pl[j + k].x(); + py = pl[j + k].y(); + mx[0] = qMin(mx[0], px); + mx[1] = qMax(mx[1], px); + if (my[0] > py) { + my[0] = py; + my_x[0] = px; + } + if (my[1] < py) { + 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.; - 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]); - } - cl << pl.back(); + cl << pl.back(); + } else + cl = pl; // qDebug() << "lod" << t._lod.size() << "->" << cl.size(); } }