4 Stimmen

QPolygonF/QLineF Schnittpunkt

QPolygonF hat Methoden zum Vereinigen, Schneiden und Subtrahieren mit anderen QPolygonFs, aber ich muss einen Schnittpunkttest mit einem QLineF durchführen. Dies scheint in der API zu fehlen.

Ich denke, ich könnte so etwas tun:

if (polygon .containsPoint (line .p1 ()) != polygon .containsPoint (line .p2 ())
    return true;

QPointF a = polygon .back ();
foreach (QPointF b, polygon)
{
    if (QLineF :: BoundedIntersection == line .intersect (QPointF (a, b))
       return true;
    a = b;
}

return false;

Wahrscheinlich lauern in den obigen Angaben einige numerische Überraschungen, die ich lieber nicht nennen möchte.

Gibt es irgendwo in der Qt-API eine bereitgestellte Methode, die ich nicht sehen kann?

5voto

hmuelner Punkte 8027

Die Implementierung von QPolygonF::intersected ist:

QPainterPath subject; subject.addPolygon(*this);
QPainterPath clip; clip.addPolygon(r);

return subject.intersected(clip).toFillPolygon();

d.h. QPolygonF verwendet QPainterPath-Methoden, um die Schnittpunkte zu erzeugen. Sie könnten also tun:

  • einen QPainterPath aus den Linien des Polygons erstellen
  • einen QPainterPath aus Ihrer Zeile machen
  • sie überschneiden
  • Überprüfung des Ergebnisses mit isEmpty()
  • Ermitteln des Schnittpunkts mit boundingRect()

ICH HABE DAS NICHT VERSUCHT! Das müssen Sie selbst überprüfen. Ich bin mir nicht sicher, ob dies in Bezug auf die numerische Stabilität und Leistung besser ist als Ihre Lösung, daher sollten Sie einige Tests schreiben.

1voto

spraff Punkte 30606

Leider lautet die Antwort "nein".

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X