#hilbert #fractal #curve #morton #z-order #data-points #codec

no-std lindel

A crate for Hilbert and Morton encoding and decoding; in a word, linearising and delinearising

2 releases

0.1.1 Mar 26, 2021
0.1.0 Mar 25, 2021

#1492 in Algorithms

Download history 1449/week @ 2024-03-30 784/week @ 2024-04-06 1922/week @ 2024-04-13 1468/week @ 2024-04-20 1374/week @ 2024-04-27 756/week @ 2024-05-04 581/week @ 2024-05-11 898/week @ 2024-05-18 866/week @ 2024-05-25 1070/week @ 2024-06-01 778/week @ 2024-06-08 961/week @ 2024-06-15 1178/week @ 2024-06-22 907/week @ 2024-06-29 222/week @ 2024-07-06 69/week @ 2024-07-13

2,452 downloads per month
Used in fractal-analysis

MIT/Apache

64KB
1K SLoC

Lindel (lineariser-delineariser)

Introduction

The lindel crate offers functions for transforming arrays of primitive unsigned integers to Morton or Hilbert keys and back, via the eponymous encoding processes. This helps linearise data points while preserving some measure of locality.

This crate is an extension of the morton-encoding crate.

Getting started

If it is not necessary to use lindel with nalgebra, it is sufficient to insert the line

lindel = "0.1"

under the [dependencies] section. Otherwise, the following section must be inserted to the project's Cargo.toml file:

[dependencies.lindel]
version = "0.1"
features = ["nalgebra"]

Usage

Primitive integers

use lindel::*;
let input = 99251;
let output_1: [u8; 5] = hilbert_decode(input);
let output_2: [u32; 2] = morton_decode(input);
let input = [543u32, 23765];
let output_1 = input.hilbert_index();
let output_2 = input.z_index();

Please note the necessity of specifying the output data-types for the decoding operations.

Points:

use nalgebra::Point;
use nalgebra::U4;
use lindel::nalgebra_points::Lineariseable;
type FourDees = Point<u32, U4>;
let input = 26327612u128;
let pnt = FourDees::from_z_index(input);
let result = pnt.hilbert_index();

New large uints:

lindel::create_lineariseable_data_type!(u128, 33, NewKey);
let input = [870u128; 33];
let hind = NewKey::hilbert_index(input);
let zind = NewKey::z_index(input);
let reinstated_input = hind.from_hilbert_index();
assert_eq!(input, reinstated_input);
let reinstated_input = NewKey::from_z_index(zind);
assert_eq!(input, reinstated_input);

Advantages and Disadvantages

Long story short: Choose Morton encoding (“z-indexing”) if speed is more important than locality. Otherwise, feel free to use Hilbert encoding everywhere.

Dependencies

~0.5–1MB
~21K SLoC