Как преобразовать JSONArray в список с помощью Gson?

QPainterPath QGraphicsItem::shape() const

Возвращает форму этого элемента как QPainterPath в локальных координатах. Форма используется для многих вещей, включая обнаружение столкновений, тесты ударов и для функций QGraphicsScene :: items ().

Реализация по умолчанию вызывает boundingRect (), чтобы вернуть простую прямоугольную форму, но подклассы могут переопределите эту функцию, чтобы вернуть более точную форму для непрямоугольных элементов.

Для обнаружения мелкого столкновения вам необходимо использовать:

bool QGraphicsItem::collidesWithItem(const QGraphicsItem * other, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const

, которые вы также можете переопределить, потому что проверка на столкновение между кругами быстрее, чем проверка painterpaths для пересечения.

Я сам этого не использовал, но, похоже, функция, которую вы используете, даст вам «грубое обнаружение», поэтому вы должны вручную проверить, действительно ли кто-то из них пересекается с мелкозернистым методом. Это экономит производительность, вы используете грубую проверку, чтобы изолировать потенциальных кандидатов на столкновение, а затем проверять только те элементы, используя более медленный метод. В вашем случае это не удобство, потому что тест столкновения с кругом будет таким же быстрым, если не быстрее, чем тест с ограничивающей коробкой, но именно так разработан Qt. В идеале вы должны будете передать свою собственную функцию обнаружения столкновений на collidingItems().

Также последнее, но не менее важное: после того, как вы получите список collidingItems, вы можете легко проверить наличие столкновений по кругу на месте, без использования shape() и collidesWithItem() ... Это фактически избавит вас от некоторого времени процессора от необходимости лишних виртуальных функций, плюс время для их повторного использования ...

Таким образом, вы можете использовать что-то например:

inline bool circCollide(QGraphicsItem * item, QList<QGraphicsItem *> items) {
    QPointF c1 = item->boundingRect().center();
    foreach (QGraphicsItem * t, items) {
        qreal distance = QLineF(c1, t->boundingRect().center()).length();
        qreal radii = (item->boundingRect().width() + t->boundingRect().width()) / 2;
        if ( distance <= radii ) return true; 
    }
    return false;
}

... и сделать это на месте:

if (circCollide(this, collidingItems())) ... we have a collision
30
задан Community 23 May 2017 в 12:32
поделиться