use crate::GeoTransform;
pub type WorldFile = [f64; 6];
pub fn world_to_geotransform(wf: &WorldFile) -> GeoTransform {
[
wf[4] - wf[0] / 2.0 - wf[2] / 2.0, wf[0], wf[2], wf[5] - wf[3] / 2.0 - wf[1] / 2.0, wf[1], wf[3], ]
}
pub fn geotransform_to_world(gt: &GeoTransform) -> WorldFile {
[
gt[1], gt[4], gt[2], gt[5], gt[0] + gt[1] / 2.0 + gt[2] / 2.0, gt[3] + gt[5] / 2.0 + gt[4] / 2.0, ]
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn roundtrip_no_rotation() {
let gt = [100.0, 10.0, 0.0, 500.0, 0.0, -10.0];
let wf = geotransform_to_world(>);
let gt2 = world_to_geotransform(&wf);
for i in 0..6 {
assert!((gt[i] - gt2[i]).abs() < 1e-10, "index {i}");
}
}
#[test]
fn roundtrip_with_rotation() {
let gt = [100.0, 10.0, 2.0, 500.0, -1.0, -10.0];
let wf = geotransform_to_world(>);
let gt2 = world_to_geotransform(&wf);
for i in 0..6 {
assert!((gt[i] - gt2[i]).abs() < 1e-10, "index {i}");
}
}
#[test]
fn world_file_origin_is_pixel_centre() {
let gt = [0.0, 10.0, 0.0, 100.0, 0.0, -10.0];
let wf = geotransform_to_world(>);
assert!((wf[4] - 5.0).abs() < 1e-10); assert!((wf[5] - 95.0).abs() < 1e-10); }
}