An open API service indexing awesome lists of open source software.

https://github.com/yvt/zhang_hilbert

A Rust crate for generating an arbitrary-sized pseudo-Hilbert scan
https://github.com/yvt/zhang_hilbert

Last synced: 5 months ago
JSON representation

A Rust crate for generating an arbitrary-sized pseudo-Hilbert scan

Awesome Lists containing this project

README

          

# `zhang_hilbert`

[docs.rs](https://docs.rs/zhang_hilbert/)

This crate provides iterator types that produce an arbitrary-sized
pseudo-Hilbert scan based on “A Pseudo-Hilbert Scan for Arbitrarily-Sized
Arrays” by Zhang, et al.

![](https://ipfs.io/ipfs/QmUbNnFkcyHQrg3CpNf3ykVq6dm7vG7CGzU8tryzWvXrEf/thecurve.svg)

```rust
use zhang_hilbert::ArbHilbertScan32;
for [x, y] in ArbHilbertScan32::new([11, 42]) {
assert!(x >= 0 && y >= 0 && x < 11 && y < 42);
println!("{:?}", [x, y]);
}
```

## Differences from the original algorithm

### The last `E_B(E, O)` block

This implementation uses a different curve-type selection rule for the
last `E_B(E, O)` block in a `E_R(E, O)` rectangle. This makes the leaving
point fixed at a known point in more cases, making the output suitable for
tiling.

```
cargo run --example hilbertgen -- -a zhang 6 7
,---, ,---, ,---, ,---,
'-, '-' ,-' '-, '-' ,-'
,-' ,-, '-, ,-' ,-, '-,
'-, | '---' '-, | '---'
,-' '-, ,-- ,-' '-----,
'-, ,-' '-, '-, ,-----'
--' '-----' --' '------
Original This implementation

cargo run --example hilbertgen -- -a zhang 4 3
,------ ,-----,
'-----, '-, ,-'
------' --' '--
Original This implementation
```

### Aspect-ratio bounded tiling

The algorithm accepts any rectangle size, but the output quality
deteriorates as the proportions of the rectangle gets distant from square.
`ArbHilbertScanCore` improves it by dividing the rectangle into multiple
rectangles whose proportions are closer to square than the original
rectangle is (thus their aspect ratios are bounded).

```
$ cargo run --example hilbertgen -- 40 7
,---, ,---, ,---, ,---, ,---, ,-, ,---, ,---, ,---, ,---, ,-, ,---, ,---, ,---,
'-, '-' ,-' '-, '-' ,-' '-, '-' '-' ,-' '-, '-' ,-' '-, '-' '-' ,-' '-, '-' ,-'
,-' ,-, '-, ,-' ,-, '-, ,-' ,-, ,-, '-, ,-' ,-, '-, ,-' ,-, ,-, '-, ,-' ,-, '-,
'-, | '---' '-, | '---' '---' | | '---' '-, | '---' '---' | | '---' '-, | '---'
,-' '-----, ,-' '-----, ,-----' '-----, ,-' '-----, ,-----' '-----, ,-' '-----,
'-, ,-----' '-, ,-----' '-----, ,-----' '-, ,-----' '-----, ,-----' '-, ,-----'
--' '---------' '-------------' '---------' '-------------' '---------' '------

$ cargo run --example hilbertgen -- -a zhang 40 7
,-----------------------, ,-, ,-, ,-, ,-, ,-, ,-, ,-, ,-, ,-, ,---------------,
'---------------------, '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' ,-------------'
,---------------------' ,-, ,-, ,-, ,-, ,-, ,-, ,-, ,-, ,-, ,-, '-------------,
'-----------------------' '-' '-' '-' '-' '-' | | '-' '-' '-' '---------------'
,---------------------------------------------' '-----------------------------,
'---------------------------------------------, ,-----------------------------'
----------------------------------------------' '------------------------------
```

### The `division` function

The `division` function was modified for efficient implementation. As a
result, it produces an different output for the input `3⋅2ⁿ`.

License: MIT/Apache-2.0