use beambook::{geometry::{point,rectangle,ORIGIN},Color,Book,Page,Plot};
use beamplot::{
plot::*,
font::Font,
homography::Homography,
maps::{Map,LinearMap,ExponentialMap}
};
fn main() {
let font = Font::new();
let mut bk = Book::new();
let mut pg = Page::new();
let origin = ORIGIN;
let dx = 100.0;
let pressure0 = 350.0;
let mut pl = Plot::new();
let size = 10.0;
let p1 = point(0.0,200.0);
let p3 = dx*point(1.0,0.0);
let p2 = p1 + p3;
let y0 = 0.0;
let y1 = 1013.25;
let x0 = -0.5;
let x1 = 1.5;
let x_map = LinearMap::new(0.0,p3.x,x0,x1);
let y_map = ExponentialMap::new(0.0,p1.y,y0,y1);
let tick_spacing = size/4.0;
let ticks_y = try_ticks(10,&y_map,
|pos,y| if pos == Position::Last { format!("hPa {}",y) } else { format!("{}",y) },
tick_spacing).unwrap();
println!("Ticks Y: {:?}",ticks_y);
let ticks_x = try_ticks(5,&x_map,|_,x| format!("{:.1}",x),tick_spacing).unwrap();
println!("Ticks X: {:?}",ticks_x);
ruler(&font,size,origin,p1,true,false,&ticks_y).plot(&mut pl);
ruler(&font,size,p1,p2,false,true,&ticks_x).plot(&mut pl);
if x0*x1 < 0.0 { pl.line(0x888,origin+x_map.inverse(0.0)*point(1.0,0.0),origin+p1+x_map.inverse(0.0)*point(1.0,0.0)); }
pl.rectangle(0xfff,rectangle(origin,p2));
let mut f1 = |p:f64| (-sq((p - 0.2*pressure0)/150.0)).exp() + 0.05*(p/25.0).cos();
let mut f2 = |p:f64| (-sq((p - 1.0*pressure0)/150.0)).exp() + 0.10*(p/30.0).cos();
let mut f3 = |p:f64| (-sq((p - 1.5*pressure0)/150.0)).exp() + 0.15*(p/35.0).cos();
let mut g = |f:&mut dyn Fn(f64)->f64,color:Color| {
curve(origin,p1,p2,
&y_map,
&x_map,
1.0,
false,
color,
f).plot(&mut pl)
};
g(&mut f1,0xf00);
g(&mut f2,0x0f0);
g(&mut f3,0x0ff);
bottom_align(&text_lines(&font, size, 0xfff, &["T"]).rc()).transformed(&Homography::translation(origin)).plot(&mut pl);
let origin = origin + point(size,0.0) + p3;
if x0*x1 < 0.0 { pl.line(0x888,origin+x_map.inverse(0.0)*point(1.0,0.0),origin+p1+x_map.inverse(0.0)*point(1.0,0.0)); }
pl.rectangle(0xfff,rectangle(origin,origin+p2));
let mut f1 = |p:f64| (-sq((p - 0.2*pressure0)/10.0)).exp() + 0.05*(p/25.0).cos();
let mut f2 = |p:f64| (-sq((p - 1.0*pressure0)/10.0)).exp() + 0.10*(p/30.0).cos();
let mut f3 = |p:f64| (-sq((p - 1.5*pressure0)/10.0)).exp() + 0.15*(p/35.0).cos();
let mut g = |f:&mut dyn Fn(f64)->f64,color:Color| {
curve(origin,origin+p1,origin+p2,
&y_map,
&x_map,
1.0,
false,
color,
f).plot(&mut pl)
};
g(&mut f1,0xf00);
g(&mut f2,0x0f0);
g(&mut f3,0x0ff);
ruler(&font,size,origin+p1,origin+p2,false,true,&ticks_x).plot(&mut pl);
bottom_align(&text_lines(&font, size, 0xfff, &["H_2O"]).rc()).transformed(&Homography::translation(origin)).plot(&mut pl);
let origin = origin + point(size,0.0) + p3;
if x0*x1 < 0.0 { pl.line(0x888,origin+x_map.inverse(0.0)*point(1.0,0.0),origin+p1+x_map.inverse(0.0)*point(1.0,0.0)); }
pl.rectangle(0xfff,rectangle(origin,origin + p2));
let mut f1 = |p:f64| (-sq((p - 0.2*pressure0)/50.0)).exp() + 0.15*(p/15.0).cos();
let mut f2 = |p:f64| (-sq((p - 1.0*pressure0)/50.0)).exp() + 0.05*(p/20.0).cos();
let mut f3 = |p:f64| (-sq((p - 1.5*pressure0)/50.0)).exp() + 0.10*(p/25.0).cos();
let mut f4 = |p:f64| (-sq((p - 1.2*pressure0)/30.0)).exp() + 0.12*(p/50.0).cos();
let mut g = |f:&mut dyn Fn(f64)->f64,color:Color| {
curve(origin,origin + p1,origin + p2,
&y_map,
&x_map,
1.0,
false,
color,
f).plot(&mut pl)
};
g(&mut f1,0xf00);
g(&mut f2,0x0f0);
g(&mut f3,0x0ff);
g(&mut f4,0xff0);
ruler(&font,size,origin+p1,origin+p2,false,true,&ticks_x).plot(&mut pl);
bottom_align(&text_lines(&font, size, 0xfff, &["CH_4"]).rc()).transformed(&Homography::translation(origin)).plot(&mut pl);
let subtitle =
left_align(&top_align(&legend(&font,size,
&[(0xf00,"IASI"),
(0x0f0,"TROPOMI"),
(0x0ff,"IASI+L1(TROPOMI)"),
(0xff0,"IASI+L2(TROPOMI)")],
0xfff).rc())).transformed(&Homography::translation(origin + p3));
subtitle.plot(&mut pl);
bottom_align(
&text_lines(&font,
1.5*size,
0xfff,
&[
&format!("Averaging kernels, p_0={:.3} hPa",
pressure0),
"Note that the kernels have been normalized by pressure",
"Error amplification: 3x,1.5x, Q=σAT^4"
]).rc())
.transformed(&Homography::translation(point(0.0,subtitle.area.a.y - 2.0*size))).plot(&mut pl);
pg.plot(pl);
bk.page(pg);
bk.save_to_file("traj.mpk").unwrap();
}
fn sq(x:f64)->f64 { x*x }