use std::ops::Add;
use std::ops::Neg;
use std::ops::Sub;
pub static COORD_PRECISION: f64 = 1e-1;
#[derive(PartialEq, Clone, Copy, Debug)]
pub struct Coordinate {
pub x: f64,
pub y: f64,
}
#[derive(PartialEq, Clone, Copy, Debug)]
pub struct Point(pub Coordinate);
impl Point {
pub fn new(x: f64, y: f64) -> Point {
Point(Coordinate { x: x, y: y })
}
pub fn x(&self) -> f64 {
self.0.x
}
pub fn set_x(&mut self, x: f64) -> &mut Point {
self.0.x = x;
self
}
pub fn y(&self) -> f64 {
self.0.y
}
pub fn set_y(&mut self, y: f64) -> &mut Point {
self.0.y = y;
self
}
pub fn lng(&self) -> f64 {
self.x()
}
pub fn set_lng(&mut self, lng: f64) -> &mut Point {
self.set_x(lng)
}
pub fn lat(&self) -> f64 {
self.y()
}
pub fn set_lat(&mut self, lat: f64) -> &mut Point {
self.set_y(lat)
}
pub fn dot(&self, point: &Point) -> f64 {
self.x() * point.x() + self.y() * point.y()
}
}
impl Neg for Point {
type Output = Point;
fn neg(self) -> Point {
Point::new(-self.x(), -self.y())
}
}
impl Add for Point {
type Output = Point;
fn add(self, rhs: Point) -> Point {
Point::new(self.x() + rhs.x(), self.y() + rhs.y())
}
}
impl Sub for Point {
type Output = Point;
fn sub(self, rhs: Point) -> Point {
Point::new(self.x() - rhs.x(), self.y() - rhs.y())
}
}
#[derive(PartialEq, Clone, Debug)]
pub struct MultiPoint(pub Vec<Point>);
#[derive(PartialEq, Clone, Debug)]
pub struct LineString(pub Vec<Point>);
#[derive(PartialEq, Clone, Debug)]
pub struct MultiLineString(pub Vec<LineString>);
#[derive(PartialEq, Clone, Debug)]
pub struct Polygon(pub LineString, pub Vec<LineString>);
#[derive(PartialEq, Clone, Debug)]
pub struct MultiPolygon(pub Vec<Polygon>);
#[derive(PartialEq, Clone, Debug)]
pub struct GeometryCollection(pub Vec<Geometry>);
#[derive(PartialEq, Clone, Debug)]
pub enum Geometry {
Point(Point),
LineString(LineString),
Polygon(Polygon),
MultiPoint(MultiPoint),
MultiLineString(MultiLineString),
MultiPolygon(MultiPolygon),
GeometryCollection(GeometryCollection),
}
#[cfg(test)]
mod test {
use ::types::*;
#[test]
fn type_test() {
let c = Coordinate {
x: 40.02f64,
y: 116.34,
};
let p = Point(c);
let Point(c2) = p;
assert_eq!(c, c2);
assert_eq!(c.x, c2.x);
assert_eq!(c.y, c2.y);
}
}