insilmaril@789: #ifndef GEOMETRY insilmaril@789: #define GEOMETRY insilmaril@650: insilmaril@656: #include insilmaril@650: insilmaril@650: QRectF addBBox(QRectF r1, QRectF r2); insilmaril@754: bool isInBox(const QPointF &p, const QRectF &box); insilmaril@650: insilmaril@789: class ConvexPolygon:public QPolygonF insilmaril@789: { insilmaril@789: public: insilmaril@789: ConvexPolygon (); insilmaril@789: ConvexPolygon (QPolygonF p); insilmaril@789: void calcCentroid() ; insilmaril@789: QPointF centroid() const; insilmaril@789: qreal weight() const; insilmaril@789: private: insilmaril@789: QPointF _centroid; insilmaril@789: qreal _area; insilmaril@789: }; insilmaril@789: insilmaril@656: QPointF normalize (const QPointF &p); insilmaril@650: insilmaril@662: insilmaril@662: qreal dotProduct (const QPointF &a, const QPointF &b); insilmaril@662: insilmaril@789: QPointF scale (const QPointF &v,const qreal &f); insilmaril@789: QPointF invert (const QPointF &v); insilmaril@789: insilmaril@662: class PolygonCollisionResult { insilmaril@662: public: insilmaril@662: // Are the polygons going to intersect forward in time? insilmaril@662: bool willIntersect; insilmaril@662: insilmaril@662: // Are the polygons currently intersecting? insilmaril@662: bool intersect; insilmaril@662: insilmaril@662: // The translation to apply to the first polygon to push the polygons apart. insilmaril@662: QPointF minTranslation; insilmaril@662: }; insilmaril@662: insilmaril@662: insilmaril@789: void projectPolygon(QPointF axis, QPolygonF polygon, qreal &min, qreal &max) ; insilmaril@789: insilmaril@662: qreal intervalDistance(qreal minA, qreal maxA, qreal minB, qreal maxB); insilmaril@789: PolygonCollisionResult polygonCollision(QPolygonF polygonA, insilmaril@662: QPolygonF polygonB, QPointF velocity); insilmaril@662: insilmaril@789: #endif