pub enum S2Projection {
S2LinearProjection,
S2TanProjection,
S2QuadraticProjection,
}Expand description
We have implemented three different projections from cell-space (s,t) to cube-space (u,v): linear, quadratic, and tangent. They have the following tradeoffs:
Linear - This is the fastest transformation, but also produces the least uniform cell sizes. Cell areas vary by a factor of about 5.2, with the largest cells at the center of each face and the smallest cells in the corners.
Tangent - Transforming the coordinates via atan() makes the cell sizes more uniform. The areas vary by a maximum ratio of 1.4 as opposed to a maximum ratio of 5.2. However, each call to atan() is about as expensive as all of the other calculations combined when converting from points to cell ids, i.e. it reduces performance by a factor of 3.
Quadratic - This is an approximation of the tangent projection that is much faster and produces cells that are almost as uniform in size. It is about 3 times faster than the tangent projection for converting cell ids to points or vice versa. Cell areas vary by a maximum ratio of about 2.1.
§Here is a table comparing the cell uniformity using each projection. “Area ratio” is the maximum ratio over all subdivision levels of the largest cell area to the smallest cell area at that level, “edge ratio” is the maximum ratio of the longest edge of any cell to the shortest edge of any cell at the same level, and “diag ratio” is the ratio of the longest diagonal of any cell to the shortest diagonal of any cell at the same level. “ToPoint” and “FromPoint” are the times in microseconds required to convert cell ids to and from points (unit vectors) respectively. “ToPointRaw” is the time to convert to a non-unit-length vector, which is all that is needed for some purposes. Area Edge Diag ToPointRaw ToPoint FromPoint Ratio Ratio Ratio (microseconds)
Linear: 5.200 2.117 2.959 0.020 0.087 0.085 Tangent: 1.414 1.414 1.704 0.237 0.299 0.258 Quadratic: 2.082 1.802 1.932 0.033 0.096 0.108
The worst-case cell aspect ratios are about the same with all three projections. The maximum ratio of the longest edge to the shortest edge within the same cell is about 1.4 and the maximum ratio of the diagonals within the same cell is about 1.7.
NOTE: Currently Tan only has 1e-12 accuracy while Quadratic is within 1e-15.
Variants§
S2LinearProjection
Linear projection
S2TanProjection
Tangent projection
S2QuadraticProjection
Quadratic projection
Trait Implementations§
Source§impl Clone for S2Projection
impl Clone for S2Projection
Source§fn clone(&self) -> S2Projection
fn clone(&self) -> S2Projection
1.0.0§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for S2Projection
impl Debug for S2Projection
Source§impl Default for S2Projection
impl Default for S2Projection
Source§fn default() -> S2Projection
fn default() -> S2Projection
impl Copy for S2Projection
Auto Trait Implementations§
impl Freeze for S2Projection
impl RefUnwindSafe for S2Projection
impl Send for S2Projection
impl Sync for S2Projection
impl Unpin for S2Projection
impl UnwindSafe for S2Projection
Blanket Implementations§
§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§unsafe fn clone_to_uninit(&self, dest: *mut u8)
unsafe fn clone_to_uninit(&self, dest: *mut u8)
clone_to_uninit)Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<R, P> ReadPrimitive<R> for P
impl<R, P> ReadPrimitive<R> for P
Source§fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
ReadEndian::read_from_little_endian().