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@824: qreal distance (const QPointF &p, const QPointF &q); insilmaril@650: insilmaril@792: insilmaril@792: class Vector:public QPointF insilmaril@792: { insilmaril@792: public: insilmaril@792: Vector (); insilmaril@792: Vector (const QPointF &p); insilmaril@792: Vector (qreal x, qreal y); insilmaril@792: insilmaril@792: friend inline bool operator==(const Vector &v1, const Vector &v2 ) insilmaril@792: { return v1.x()==v2.x() && v1.y()==v2.y(); } insilmaril@792: insilmaril@835: bool isNull(); insilmaril@792: virtual void normalize (); insilmaril@792: virtual qreal dotProduct (const QPointF &b); insilmaril@792: virtual void scale (const qreal &f); insilmaril@792: virtual void invert (); insilmaril@798: virtual QPointF toQPointF(); insilmaril@792: }; insilmaril@792: 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@792: std::string toStdString (); insilmaril@792: Vector at (const int &i) const ; insilmaril@792: virtual void translate ( const Vector &offset ); insilmaril@792: virtual void translate ( qreal dx, qreal dy ); insilmaril@789: private: insilmaril@792: Vector _centroid; insilmaril@789: qreal _area; insilmaril@789: }; 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@792: void projectPolygon(Vector axis, ConvexPolygon polygon, qreal &min, qreal &max) ; insilmaril@789: insilmaril@662: qreal intervalDistance(qreal minA, qreal maxA, qreal minB, qreal maxB); insilmaril@792: PolygonCollisionResult polygonCollision(ConvexPolygon polygonA, insilmaril@792: ConvexPolygon polygonB, Vector velocity); insilmaril@662: insilmaril@789: #endif