I am trying to determine the point at which the hitcan removal path (basically a string, but I represented it as QPainterPath in my example) intersects with an element in my scene. I'm not sure if there is a way to find this point using the functions provided by QPainterPath , QLineF , etc. The code below shows what I'm trying to do:
#include <QtWidgets> bool hit(const QPainterPath &projectilePath, QGraphicsScene *scene, QPointF &hitPos) { const QList<QGraphicsItem *> itemsInPath = scene->items(projectilePath, Qt::IntersectsItemBoundingRect); if (!itemsInPath.isEmpty()) { const QPointF projectileStartPos = projectilePath.elementAt(0); float shortestDistance = std::numeric_limits<float>::max(); QGraphicsItem *closest = 0; foreach (QGraphicsItem *item, itemsInPath) { QPointF distanceAsPoint = item->pos() - projectileStartPos; float distance = abs(distanceAsPoint.x() + distanceAsPoint.y()); if (distance < shortestDistance) { shortestDistance = distance; closest = item; } } QPainterPath targetShape = closest->mapToScene(closest->shape()); // hitPos = /* the point at which projectilePath hits targetShape */ hitPos = closest->pos(); // incorrect; always gives top left qDebug() << projectilePath.intersects(targetShape); // true qDebug() << projectilePath.intersected(targetShape); // QPainterPath: Element count=0 // To show that they do actually intersect.. QPen p1(Qt::green); p1.setWidth(2); QPen p2(Qt::blue); p2.setWidth(2); scene->addPath(projectilePath, p1); scene->addPath(targetShape, p2); return true; } return false; } int main(int argc, char *argv[]) { QApplication app(argc, argv); QGraphicsView view; view.setViewportUpdateMode(QGraphicsView::FullViewportUpdate); QGraphicsScene *scene = new QGraphicsScene; view.setScene(scene); view.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); view.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); QGraphicsItem *target = scene->addRect(0, 0, 25, 25); target->setTransformOriginPoint(QPointF(12.5, 12.5)); target->setRotation(35); target->setPos(100, 100); QPainterPath projectilePath; projectilePath.moveTo(200, 200); projectilePath.lineTo(0, 0); projectilePath.lineTo(200, 200); QPointF hitPos; if (hit(projectilePath, scene, hitPos)) { scene->addEllipse(hitPos.x() - 2, hitPos.y() - 2, 4, 4, QPen(Qt::red)); } scene->addPath(projectilePath, QPen(Qt::DashLine)); scene->addText("start")->setPos(180, 150); scene->addText("end")->setPos(20, 0); view.show(); return app.exec(); }
projectilePath.intersects(targetShape) returns true , but projectilePath.intersected(targetShape) returns an empty path.
Is there any way to achieve this?
Mitch source share