Seite 1 von 1

QPolygonF und containsPoint

Verfasst: 27. Februar 2009 16:57
von AlGaN
Hallo,

ich habe ein Problem mit der o.g.Klasse und dessen Membermethode.In meinem Code werden sehr viele gezeichnet. Dazu kapsele ich die Polygone in einer Klasse:

Code: Alles auswählen

class Polygon
{
public:
    Polygon( Item* parent = 0);

[...]

    void dump() const;

private:
    QPolygonF mPolygon;
In der Qt-Doku steht, dass der erste und der letzte Punkt von QPolygonF implizit verbunden sind (da QPolygonF ja nur eine Ableitung von QVector< QPointF > ist):
void QPainter::drawPolygon ( const QPointF * points, int pointCount, Qt::FillRule fillRule = Qt::OddEvenFill )
Draws the polygon defined by the first pointCount points in the array points using the current pen and brush.
The first point is implicitly connected to the last point, and the polygon is filled with the current brush().
Testweise habe ich mal für jedes QPolygonF die Methode isClosed() aufgerufen und erhalte immmer false, auch wenn es sich bei dem Polygon um ein einfaches Rechteck mit vier QPointF's handelt - eigentlich müsste Qt doch selbst dafür sorgen, dass das QPolygonF geschlossen ist, welchen Sinn macht sonst die Angabe mit der impliziten Verkettung von 1. und letztem Punkt im QVector<QPointF> ? Ist es nicht so, dass ein Polygon per definitionem geschlossen ist,ansonsten wäre es ja eine Polyline...

Hintergrund: Ich versuche,die Methode bool QPolygonF::containsPoint ( const QPointF & point, Qt::FillRule fillRule ) const mit der Standard-Fill-Rule Qt::OddEvenFill aufzurufen, dabei scheint mein Programm aber abzustürzen :(

Bin für jeden Hinweis dankbar, die Qt-Doku ist an dieser Stelle bestenfalls missverständlich

P.S. Ist es abhängig davon, ob das Polygon konvex ist?

AlGaN

Verfasst: 28. Februar 2009 11:42
von franzf
Ein QPolygonF ist NIE per default closed. Hast du denn die Doku gelesen zu isCLosed()? Da steht, dass es nur ein true gibt, wenn der erste und der letzte Punkt im vector gleich sind. Automatisch geschlossen ist es nur, wenn du den Konstruktor mit dem QRectF aufrufst.

Dass dein Programm crasht, wenn du containsPoint() aufrufst, wage ich zu bezweifeln. Ich denke eher, es liegt daran, dass du QPainter::drawPolygon mit dem QPointF* + size aufrufst, und der QPointF oder size falsch sind, und du dadurch ne Zugriffsverletzung hast.
Nimm doch dann einfach
void QPainter::drawPolygon ( const QPolygonF & points, Qt::FillRule fillRule = Qt::OddEvenFill )
Das passt dann sicher...

Wenn es das nicht ist, wäre ein bisschen mehr Code nicht schlecht. Solltest du nicht wissen was relevant ist, einfach dein ganzes Projekt als zip in den Anhang packen.

Verfasst: 1. März 2009 18:32
von AlGaN
Hallo franz,

danke für deine Antwort.

Ok, ich hab jetzt einen Revert auf die Vorversion gemacht im svn, es liegt wohl definitiv an meinem Code, auch wenn ich den Fehler nicht finden konnte.

Dass QPolygonF geschlossen ist, hatte ich aus der Methode void QPainter::drawPolygon ( const QPointF * points, int pointCount, Qt::FillRule fillRule = Qt::OddEvenFill ) geschlossen, aber da wird ja auch der Zeiger auf ein Array auf const QPointF übergeben...

Mathematisch ist das aber IMHO aber trotzdem nicht eindeutig, da ein Polygon, das nicht geschlossen ist, eine Polyline ist...

Verfasst: 1. März 2009 19:43
von franzf
AlGaN hat geschrieben:Dass QPolygonF geschlossen ist, hatte ich aus der Methode void QPainter::drawPolygon ( const QPointF * points, int pointCount, Qt::FillRule fillRule = Qt::OddEvenFill ) geschlossen, aber da wird ja auch der Zeiger auf ein Array auf const QPointF übergeben...
Aber die erwähnte drawPolygon-Methode hat rein gar nix mit QPolygon zu tun! Du übergibst einen Pointer auf das erste Element eines Arrays (!nicht QVector!) aus QPointFs, zusätzlich die Anzahl der Elemente des Arrays. Und genau nur in dieser Methode von QPainter wird das letze Element wieder mit dem ersten des Arrays verbunden.
Das hat nix mit der Klasse QPolygon zu tun (die du in meinen Augen besser verwenden solltest, außer du weißt wirklich absolut exakt, wie viele Punkte in deinem Array sind - sonst gibts SegFaults).