| 1 | /*! |
| 2 | |
| 3 | One of the key features of Plotters is flexible coordinate system abstraction and this module |
| 4 | provides all the abstraction used for the coordinate abstarction of Plotters. |
| 5 | |
| 6 | Generally speaking, the coordinate system in Plotters is responsible for mapping logic data points into |
| 7 | pixel based backend coordinate. This task is abstracted by a simple trait called |
| 8 | [CoordTranslate](trait.CoordTranslate.html). Please note `CoordTranslate` trait doesn't assume any property |
| 9 | about the coordinate values, thus we are able to extend Plotters's coordinate system to other types of coorindate |
| 10 | easily. |
| 11 | |
| 12 | Another important trait is [ReverseCoordTranslate](trait.ReverseCoordTranslate.html). This trait allows some coordinate |
| 13 | retrieve the logic value based on the pixel-based backend coordinate. This is particularly interesting for interactive plots. |
| 14 | |
| 15 | Plotters contains a set of pre-defined coordinate specifications that fulfills the most common use. See documentation for |
| 16 | module [types](types/index.html) for details about the basic 1D types. |
| 17 | |
| 18 | The coordinate system also can be tweaked by the coordinate combinators, such as logarithmic coordinate, nested coordinate, etc. |
| 19 | See documentation for module [combinators](combinators/index.html) for details. |
| 20 | |
| 21 | Currently we support the following 2D coordinate system: |
| 22 | |
| 23 | - 2-dimensional Cartesian Coordinate: This is done by the combinator [Cartesian2d](cartesian/struct.Cartesian2d.html). |
| 24 | |
| 25 | */ |
| 26 | |
| 27 | use plotters_backend::BackendCoord; |
| 28 | |
| 29 | pub mod ranged1d; |
| 30 | |
| 31 | /// The coordinate combinators |
| 32 | /// |
| 33 | /// Coordinate combinators are very important part of Plotters' coordinate system. |
| 34 | /// The combinator is more about the "combinator pattern", which takes one or more coordinate specification |
| 35 | /// and transform them into a new coordinate specification. |
| 36 | pub mod combinators { |
| 37 | pub use super::ranged1d::combinators::*; |
| 38 | } |
| 39 | |
| 40 | /// The primitive types supported by Plotters coordinate system |
| 41 | pub mod types { |
| 42 | pub use super::ranged1d::types::*; |
| 43 | } |
| 44 | |
| 45 | mod ranged2d; |
| 46 | /// Ranged coordinates in 3d. |
| 47 | pub mod ranged3d; |
| 48 | |
| 49 | /// Groups Cartesian ranged coordinates in 2d and 3d. |
| 50 | pub mod cartesian { |
| 51 | pub use super::ranged2d::cartesian::{Cartesian2d, MeshLine}; |
| 52 | pub use super::ranged3d::Cartesian3d; |
| 53 | } |
| 54 | |
| 55 | mod translate; |
| 56 | pub use translate::{CoordTranslate, ReverseCoordTranslate}; |
| 57 | |
| 58 | /// The coordinate translation that only impose shift |
| 59 | #[derive(Debug, Clone)] |
| 60 | pub struct Shift(pub BackendCoord); |
| 61 | |
| 62 | impl CoordTranslate for Shift { |
| 63 | type From = BackendCoord; |
| 64 | fn translate(&self, from: &Self::From) -> BackendCoord { |
| 65 | (from.0 + (self.0).0, from.1 + (self.0).1) |
| 66 | } |
| 67 | } |
| 68 | |
| 69 | impl ReverseCoordTranslate for Shift { |
| 70 | fn reverse_translate(&self, input: BackendCoord) -> Option<BackendCoord> { |
| 71 | Some((input.0 - (self.0).0, input.1 - (self.0).1)) |
| 72 | } |
| 73 | } |
| 74 | |