+#ifndef GEOMETRY
+#define GEOMETRY
+
+#include <QPolygonF>
+
+namespace Geometry {
+qreal distance(const QPointF &p, const QPointF &q);
+};
+
+QRectF addBBox(QRectF r1, QRectF r2);
+QSize addBBoxSize(QSize s1, QSize s2);
+bool isInBox(const QPointF &p, const QRectF &box);
+
+class Vector : public QPointF {
+ public:
+ Vector();
+ Vector(const QPointF &p);
+ Vector(qreal x, qreal y);
+ virtual ~Vector();
+
+ friend inline bool operator==(const Vector &v1, const Vector &v2)
+ {
+ return v1.x() == v2.x() && v1.y() == v2.y();
+ }
+
+ bool isNull();
+ virtual void normalize();
+ virtual qreal dotProduct(const QPointF &b);
+ virtual void scale(const qreal &f);
+ virtual void invert();
+ virtual QPointF toQPointF();
+};
+
+class ConvexPolygon : public QPolygonF {
+ public:
+ ConvexPolygon();
+ ConvexPolygon(QPolygonF p);
+ virtual ~ConvexPolygon();
+ void calcCentroid();
+ QPointF centroid() const;
+ qreal weight() const;
+ std::string toStdString();
+ Vector at(const int &i) const;
+ virtual void translate(const Vector &offset);
+ virtual void translate(qreal dx, qreal dy);
+
+ private:
+ Vector _centroid;
+ qreal _area;
+};
+
+class PolygonCollisionResult {
+ public:
+ // Are the polygons going to intersect forward in time?
+ bool willIntersect;
+
+ // Are the polygons currently intersecting?
+ bool intersect;
+
+ // The translation to apply to the first polygon to push the polygons apart.
+ QPointF minTranslation;
+};
+
+void projectPolygon(Vector axis, ConvexPolygon polygon, qreal &min, qreal &max);
+
+qreal intervalDistance(qreal minA, qreal maxA, qreal minB, qreal maxB);
+PolygonCollisionResult polygonCollision(ConvexPolygon polygonA,
+ ConvexPolygon polygonB,
+ Vector velocity);
+
+#endif
\ No newline at end of file