#ifndef __CONVEX_H_
#define __CONVEX_H_

#include "DualCoding/DualCoding.h"

using namespace DualCoding;

class MyPolygonData : public PolygonData {
private:
    class convexHullPoint {
    public:
        int x, y;
        float angle;

        convexHullPoint() : x(0), y(0), angle(0) {}
        convexHullPoint(int _x, int _y, float _a) : x(_x), y(_y), angle(_a) {}

        static int crossProduct(const convexHullPoint &p1, const convexHullPoint &p2, const convexHullPoint &p3) {
            return (p2.x - p1.x)*(p3.y - p1.y) - (p3.x - p1.x)*(p2.y - p1.y);
        }

        class pointCompare : public binary_function<convexHullPoint, convexHullPoint, bool> {
        private:
            const convexHullPoint &pivot;
        public:
            pointCompare(const convexHullPoint &_pivot) : pivot(_pivot) {}
            bool operator() (const convexHullPoint &p1, const convexHullPoint &p2) {
                if ( p1.angle < p2.angle )
                    return true;
                else if ( p1.angle > p2.angle )
                    return false;
                else {
                    int const d1x = pivot.x - p1.x;
                    int const d1y = pivot.y - p1.y;
                    int const d2x = pivot.x - p2.x;
                    int const d2y = pivot.y - p2.y;
                    return (d1x*d1x+d1y*d1y) < (d2x*d2x+d2y*d2y);
                }
            }
        };
    };
public:
    static Shape<PolygonData> ConvexHull(std::vector<Point> pts, ShapeSpace &ShS, const fmat::Transform &tmartinv);
};
#endif

