/**
* Copyright (C) 2008-2012 10gen Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*/
#pragma once
#include "mongo/pch.h"
#include "mongo/db/jsobj.h"
namespace mongo {
struct Point;
double distance(const Point& p1, const Point &p2);
bool distanceWithin(const Point &p1, const Point &p2, double radius);
void checkEarthBounds(const Point &p);
double spheredist_rad(const Point& p1, const Point& p2);
double spheredist_deg(const Point& p1, const Point& p2);
struct Point {
Point();
Point(double x, double y);
explicit Point(const BSONElement& e);
explicit Point(const BSONObj& o);
string toString() const;
double x;
double y;
};
struct Circle {
Circle();
Circle(double radius, Point center);
double radius;
Point center;
};
class Box {
public:
Box();
Box(double x, double y, double size);
Box(Point min, Point max);
BSONArray toBSON() const;
string toString() const;
bool between(double min, double max, double val, double fudge = 0) const;
bool onBoundary(double bound, double val, double fudge = 0) const;
bool mid(double amin, double amax, double bmin, double bmax, bool min, double* res) const;
double intersects(const Box& other) const;
double area() const;
double maxDim() const;
Point center() const;
void truncate(double min, double max);
void fudge(double error);
bool onBoundary(Point p, double fudge = 0);
bool inside(Point p, double fudge = 0) const;
bool inside(double x, double y, double fudge = 0) const;
bool contains(const Box& other, double fudge = 0);
Point _min;
Point _max;
};
class Polygon {
public:
Polygon();
Polygon(vector points);
void add(Point p);
int size() const;
bool contains(const Point& p) const;
/*
* Return values:
* -1 if no intersection
* 0 if maybe an intersection (using fudge)
* 1 if there is an intersection
*/
int contains(const Point &p, double fudge) const;
/**
* Calculate the centroid, or center of mass of the polygon object.
*/
Point centroid();
Box bounds();
private:
bool _centroidCalculated;
Point _centroid;
Box _bounds;
bool _boundsCalculated;
vector _points;
};
} // namespace mongo