diff --git a/build.earth b/build.earth index 3376dd6..a8527ee 100644 --- a/build.earth +++ b/build.earth @@ -14,21 +14,14 @@ docs-build: RUN DEBIAN_FRONTEND=noninteractive apt-get -qq -y install bison flex libffi-dev libxml2-dev libgdk-pixbuf2.0-dev libcairo2-dev libpango1.0-dev fonts-lyx cmake RUN gem install asciidoctor-mathematical - COPY --dir ./design-workflow . + COPY --dir ./docs . - RUN asciidoctor -r asciidoctor-mathematical -a mathematical-format=sv -a "!webfonts" -- ./design-workflow/*.adoc + RUN asciidoctor -r asciidoctor-mathematical -a mathematical-format=svg -a "!webfonts" -- ./docs/*.adoc RUN \ - cd ./design-workflow/ && \ - rm -rf \ - *.adoc \ - *.ods \ - *.csv \ - *.txt.gz \ - *.ipynb \ - .ipynb_checkpoints \ + find docs -type f -not -iname '*.html' -not -iname '*.png' -not -iname '*.svg' -delete && \ : - SAVE ARTIFACT ./design-workflow + SAVE ARTIFACT ./docs docs: FROM golang:latest @@ -38,9 +31,9 @@ docs: RUN cd minify && go install ./cmd/minify - COPY +docs-build/./design-workflow/ ./design-workflow/ + COPY +docs-build/docs/ ./docs/ RUN minify --version - RUN minify --sync --recursive --output output/ ./design-workflow/ + RUN minify --sync --recursive --output output/ ./docs/ # RUN mv output/static/* output/ # RUN rmdir output/static diff --git a/docs/DESIGN.adoc b/docs/DESIGN.adoc index 740979d..149cb4c 100644 --- a/docs/DESIGN.adoc +++ b/docs/DESIGN.adoc @@ -193,19 +193,21 @@ S2 addresses map to a cell at a given level. Two cell level candidates were chos .Statistics of the two candidates for cell levels for this project. More can be seen link:https://s2geometry.io/resources/s2cell_statistics[here^] |=== -|Level |Min area |Max area |Average area |Number of cells +|Level |Min area |Max area |Average area |Number of cells |Bits required |22 |2.90m^2^ |6.08m^2^ |4.83m^2^ |1.05*10^14^ +|47 |23 |0.73m^2^ |1.52m^2^ |1.21m^2^ |4.22*10^14^ +|49 |=== diff --git a/this_algorithm/src/lib.rs b/this_algorithm/src/lib.rs index c65b501..d5f5060 100644 --- a/this_algorithm/src/lib.rs +++ b/this_algorithm/src/lib.rs @@ -13,7 +13,7 @@ use std::{ mod conversions; use thiserror::Error; -use s2::{cellid::CellID, latlng::LatLng, s1::Deg}; +use s2::{cell::Cell, cellid::CellID, latlng::LatLng, s1::Deg}; use words::Word; pub type Number = u32; @@ -49,6 +49,14 @@ pub struct Address<'a> { words: [&'a Word<'a>; 3], } +// pub trait Alg { +// type Err; + +// fn to_cellid(&self) -> Result; + +// fn from_cellid(); +// } + impl FromStr for Address<'_> { type Err = Error; @@ -88,32 +96,24 @@ impl FromStr for Address<'_> { components.into_iter().skip(1).collect::>() }; - match extract_version(number) { - 0 => Self::parse_v0(number, other_components), - ver => Err(Error::InvalidVersion(ver)), - } + Address::from_components(number, other_components) } } impl Address<'_> { + /// Converts a latitude and longitude into an encoded address pub fn from_lat_lon(lat: f64, lon: f64) -> Self { let cellid = conversions::lat_lon_to_cellid(lat, lon); v0::UnpackedCellID::from(cellid).into() - - // Self::cellid_to_v0(&cellid) } - // fn cellid_to_v0(cell_id: &CellID) -> Self { - // // The raw binary representation of the cellid - // let raw_cellid = cell_id.0; - - // // Self { - // // number, - // // words: words.into_inner().unwrap(), - // // } + // /// Decodes an address to latitude and longitude + // pub fn to_lat_lon(&self) -> (f64, f64) { + // let cellid = self.as_cell_id(); // } + // Parses an address v0 given the number and word components fn parse_v0(number: Number, word_components: Vec<&str>) -> Result { if !(V0_MIN_NUMBER..=V0_MAX_NUMBER).contains(&number) { return Err(Error::NumberOutOfRange(number)); @@ -135,8 +135,36 @@ impl Address<'_> { Ok(Self { number, words }) } + + /// Builds an `Address` from a number and all word components + fn from_components(number: Number, other_components: Vec<&str>) -> Result { + match extract_version(number) { + 0 => Self::parse_v0(number, other_components), + ver => Err(Error::InvalidVersion(ver)), + } + } + + fn as_cell_id(&self) -> Result { + match extract_version(self.number) { + 0 => { + let ten_bits = 0b1111_1111_11; + let thirteen_bits = 0b1111_1111_1111_1; + let mut ret = self.number as u64 & ten_bits; + for w in self.words { + ret = (ret << 13) | (w.number as u64 & thirteen_bits); + } + ret = (ret << 15) | (0x1 << 14); + + Ok(CellID(ret)) + } + ver => Err(Error::InvalidVersion(ver)), + } + } } +/// Extracts a version number from a number +/// +/// The version number is set by the two bits 11 and 12 fn extract_version(number: Number) -> Version { ((number >> 10) & 0b11) as Version } diff --git a/this_algorithm/src/v0.rs b/this_algorithm/src/v0.rs index ed2c68c..8102052 100644 --- a/this_algorithm/src/v0.rs +++ b/this_algorithm/src/v0.rs @@ -11,6 +11,7 @@ pub struct UnpackedCellID { } impl From for UnpackedCellID { + /// Convert a `CellID` to an `UnpackedCellID` fn from(cell_id: CellID) -> Self { Self::from(cell_id.0) } @@ -39,3 +40,11 @@ impl From for Address<'_> { } } } + +// impl>> From for UnpackedCellID { +// fn from(addr: A) -> Self { +// let number_bits = addr. + +// CellID(ret) +// } +// }