1741
|
Qt / 2D и 3D графика / Re: оптимизация paint() QGraphicsItem'а
|
: Марта 18, 2011, 22:05
|
Хм.. C++ (Qt) void PolarAxis::paint(QPainter *p, const QStyleOptionGraphicsItem *option,QWidget *widget) { p->setMatrix(scale_matrix); p->drawEllipse(x-rad,y-rad,rad*2,rad*2); p->drawLine(x,y,x,y-rad); QPen *dotPen=new QPen(Qt::DashDotLine); // Зачем? dotPen->setWidthF(0.3); QVector<qreal> dashes; dashes <<10 <<10; dotPen->setDashPattern(dashes); p->setPen(*dotPen); for (int i=rad-15;i>0;i-=15) p->drawEllipse(x-i,y-i,i*2,i*2); for (int i=0; i>-360; i-=10){ p->drawLine(x,y,x+rad*cos(i*pi/180),y+rad*sin(i*pi/180)); double x2=x+(rad+20)*cos(i*pi/180+90*pi/180+rotate*pi/180)-15; double y2=y+(rad+20)*sin(i*pi/180+90*pi/180+rotate*pi/180)-7.5; p->drawText(x2,y2,30,15,Qt::AlignCenter,QString("%1").arg(abs(i))); } }
Во-первых зачем создавать dotPen в куче? Во-вторых из-за него у вас утечка, поскольку не видно где он уничтожается В-третьих C++ (Qt) void PolarPlot::resizeEvent(QResizeEvent *re) { QRect *rct=new QRect(0,0,re->size().height()-25,re->size().width()-25); // Те же грабли plotScene->setSceneRect(*rct); double h1=re->size().height(); double h2=re->oldSize().height(); double koef=h1/h2; pa->rescale(koef); //в pa объект класса PolarAxis }
всё сказанное выше, но приминительно к rct А теперь представте, что будет при интенсивном ресайзе и отрисовки..
|
|
|
1743
|
Программирование / С/C++ / Re: Как сделать кратко/красиво
|
: Марта 15, 2011, 23:17
|
Не въехал с сынтаксысом. Вроде "начальное значение" для accumulate обязательно,
Да, попутал)) Вот окончательно: C++ (Qt) class MyFunctor { public: CMesh * operator()(CMesh *a, CMesh *b) { if ((a->mFriction == b->mFriction) && (a->mFriction == m_unique_friction.back()) && m_tag) { a->Append(b); b->Clear(); } return a; } bool frictionIsContains(float f) { vector<float>::iterator it = find(m_unique_friction.begin(), m_unique_friction.end(), f); if (it == m_unique_friction.end()) { m_unique_friction.push_back(f); m_tag = true; return !m_tag; } m_tag = false; return !m_tag; } private: vector<float> m_unique_friction; bool m_tag; }; void CMesh::CreateShapes( TMeshPtrVec & mesh, TShapePtrVec & shape ) { TMeshPtrVec::iterator it = mesh.begin(); MyFunctor func; for (; it != mesh.end(); ++it) { if (func.frictionIsContains((*it)->mFriction)) continue; CMesh *cm = accumulate(it, mesh.end(), *it, func); shape.push_back(cm->CreateShape()); } }
|
|
|
1744
|
Программирование / С/C++ / Re: Как сделать кратко/красиво
|
: Марта 15, 2011, 22:35
|
Тогда как вариант: C++ (Qt) class MyFunctor { public: CMesh * operator()(CMesh *a, CMesh *b) { if ((a->mFriction == b->mFriction) && (a->mFriction == m_unique_friction.back()) && m_tag) { a->Append(b); b->Clear(); return a; } return 0; } bool frictionIsContains(float f) { vector<double>::iterator it = find(m_unique_friction.begin(), m_unique_friction.end(), f); if (it != m_unique_friction.end()) { m_unique_friction.push_back(f); m_tag = true; return m_tag; } m_tag = false; return m_tag; } private: vector<float> m_unique_friction; bool m_tag; }; void CMesh::CreateShapes( TMeshPtrVec & mesh, TShapePtrVec & shape ) { TMeshPtrVec::iterator it = mesh.begin(); MyFunctor func; for (; it != mesh.end(); ++it) { if (!func.frictionIsContains((*it)->mFriction)) continue; CMesh *cm = accumulate(it, mesh.end(), func); shape.push_back(cm->CreateShape()); } }
|
|
|
1745
|
Программирование / С/C++ / Re: Как сделать кратко/красиво
|
: Марта 15, 2011, 21:44
|
Можно непосредственно в функции myBinaryPredicate "сливать" данные из одного (a) в другой (b) (с помощью Append), если они равны.
Может даже это и будет работать (не знаю), но делать такие "масштабные" действия в ф-ции предназначенной просто для сравнения - никак не гуд. Почему эт? Это всё равно придётся делать) Кстати, зачем тогда придумали ещё и объекты функций? Правильно, для большей гибкости. Да и копирование вектора (с последующим resize) хорошего впечатления не производит. Нельзя сделать как-то "через голову", не слишком привлекая мутность STL?
Да он всё равно локален и разрушится при выходе из функции. Сколько там (в mesh) в среднем элементов планируется держать? Если без этого временного вектора v, то тогда лучше использовать find_if, но это будет медленее и так кратко не думаю что получится.
|
|
|
1746
|
Программирование / С/C++ / Re: Как сделать кратко/красиво
|
: Марта 15, 2011, 21:05
|
В смысле долит? Этот код создаёт только вектор с указателями на уникальные mFriction.. Он ничё никуда не доливает)
Ну а зачем такой вектор нужен? Ведь задача объединить (с помощью Append) подходящие элементы и создать для них одну CShape. Можно непосредственно в функции myBinaryPredicate "сливать" данные из одного (a) в другой (b) (с помощью Append), если они равны. Кстати о птичках: если уж создавать вектор уникальных, то не лучше ли сначала отсортировать, а затем один раз вызвать unique_copy (а то увлеклись списыванием Улыбающийся)
Можно, конечно) Я просто Вашу бдительность проверял))
|
|
|
1747
|
Программирование / С/C++ / Re: Как сделать кратко/красиво
|
: Марта 15, 2011, 20:47
|
Хотя я это не проверял)
Та вижу что нет  Пусть первые 2 элемента имеют одинаковый ключ (mFriction). Тогда, если я правильно понимаю, unique_copy поместит в выходной вектор лишь первый из них, второй не будет долит к первому - а должен В смысле долит? Этот код создаёт только вектор с указателями на уникальные mFriction.. Он ничё никуда не доливает) Если я правильно понимаю, то доливание одного вектора в другой, если у них одинаковые mFriction можно произвести в myBinaryPredicate...
|
|
|
1748
|
Программирование / С/C++ / Re: Как сделать кратко/красиво
|
: Марта 15, 2011, 20:17
|
Ну вот, например: C++ (Qt) bool myBinaryPredicate(CMesh* a, CMesh* b) { return (a->mFriction == b->mFriction); } bool compare (CMesh* a, CMesh* b) { return (a->mFriction < b->mFriction); } void CMesh::CreateShapes( TMeshPtrVec & mesh, TShapePtrVec & shape ) { TMeshPtrVec v = mesh; TMeshPtrVec::iterator it = unique_copy (mesh.begin(), mesh.end(), v.begin(), myBinaryPredicate); sort (v.begin(), it, compare); it=unique_copy (v.begin(), it, v.begin(), myBinaryPredicate); v.resize( it - v.begin()); /* v - теперь содержит указатели на CMesh c уникальными значениями mFriction */ /* Дальше все действия с ним.. */ }
Хотя я это не проверял)
|
|
|
1751
|
Qt / Вопросы новичков / Re: При наведении мыши...
|
: Марта 14, 2011, 21:53
|
Поле из 100 кнопок.. И при движение мыши это всё ещё и мигает белое-чёрное, белое-чёрное.. Интересно)) Бредовая догадка: не морской бой часом?
Приз в студию! Да, морской бой  По программированию задали Насчет кнопок - разобрался. Конечно, скорость не ахти, но уже времени нет оптимизировать код) Элементарно, Ватсон.. Вы уже об этом упоминали ранее. Кнопки - это не самый лучший вариант.
|
|
|
1752
|
Qt / Вопросы новичков / Re: При наведении мыши...
|
: Марта 14, 2011, 21:06
|
Поле из 100 кнопок.. И при движение мыши это всё ещё и мигает белое-чёрное, белое-чёрное.. Интересно)) Бредовая догадка: не морской бой часом?
|
|
|
|
|