Various fixes for non-standard speeds
This commit is contained in:
parent
affe26209f
commit
ca53032e54
@ -74,16 +74,16 @@ pub(crate) fn dump_latex_code(route: &[RunState], polys: &[Polygon]) {
|
|||||||
println!("\\end{{tikzpicture}}");
|
println!("\\end{{tikzpicture}}");
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn dump_route(house: Point, polys: &[Polygon], route: &[RunState]) {
|
pub(crate) fn dump_route(opt: Opt, house: Point, polys: &[Polygon], route: &[RunState]) {
|
||||||
let (points, lines, route1, route2_start) = gen_params(house, route);
|
let (points, lines, route1, route2_start) = gen_params(opt, house, route);
|
||||||
print!(
|
print!(
|
||||||
"{}",
|
"{}",
|
||||||
generate_svg(&points, &lines, polys, &route1, route2_start)
|
generate_svg(&points, &lines, polys, &route1, route2_start)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn save_svg(filename: &str, house: Point, polys: &[Polygon], route: &[RunState]) {
|
pub(crate) fn save_svg(opt: Opt, filename: &str, house: Point, polys: &[Polygon], route: &[RunState]) {
|
||||||
let (points, lines, route1, route2_start) = gen_params(house, route);
|
let (points, lines, route1, route2_start) = gen_params(opt, house, route);
|
||||||
fs::write(
|
fs::write(
|
||||||
filename,
|
filename,
|
||||||
generate_svg(&points, &lines, polys, &route1, route2_start),
|
generate_svg(&points, &lines, polys, &route1, route2_start),
|
||||||
@ -93,6 +93,7 @@ pub(crate) fn save_svg(filename: &str, house: Point, polys: &[Polygon], route: &
|
|||||||
|
|
||||||
#[allow(clippy::type_complexity)]
|
#[allow(clippy::type_complexity)]
|
||||||
fn gen_params(
|
fn gen_params(
|
||||||
|
opt: Opt,
|
||||||
house: Point,
|
house: Point,
|
||||||
route: &[RunState],
|
route: &[RunState],
|
||||||
) -> (
|
) -> (
|
||||||
@ -114,7 +115,7 @@ fn gen_params(
|
|||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
let route1 = route.iter().map(|x| x.pos).collect::<Vec<_>>();
|
let route1 = route.iter().map(|x| x.pos).collect::<Vec<_>>();
|
||||||
let route2_start = last.pos.translate(0.0, -last.total_distance * 2.0);
|
let route2_start = last.pos.translate(0.0, -last.total_distance * (opt.bus/opt.lisa));
|
||||||
(points, lines, route1, route2_start)
|
(points, lines, route1, route2_start)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -126,11 +127,18 @@ pub(crate) fn generate_svg(
|
|||||||
route2_start: Point,
|
route2_start: Point,
|
||||||
) -> String {
|
) -> String {
|
||||||
let dot_radius = 25.2;
|
let dot_radius = 25.2;
|
||||||
|
let width = route1.iter().map(|p| p.x()).chain(polys.iter().map(|x| x.exterior().0.iter().map(|p| p.x)).flatten()).max_by(|a, b| a.partial_cmp(b).unwrap()).unwrap() + dot_radius * 2.0;
|
||||||
|
let upper_y = polys.iter().map(|x| x.exterior().0.iter().map(|p| p.y)).flatten().chain(Some(route1.last().unwrap().y())).max_by(|a, b| a.partial_cmp(b).unwrap()).unwrap();
|
||||||
let mut document = Document::new()
|
let mut document = Document::new()
|
||||||
// view box at (x,y), (w,h)
|
// view box at (x,y), (w,h)
|
||||||
.set(
|
.set(
|
||||||
"viewBox",
|
"viewBox",
|
||||||
(-dot_radius, -route1.last().unwrap().y() - dot_radius, route1.iter().map(|p| p.x()).max_by(|a, b| a.partial_cmp(b).unwrap()).unwrap() + dot_radius * 2.0, -route2_start.y() + route1.last().unwrap().y() + dot_radius * 2.0),
|
(
|
||||||
|
-dot_radius,
|
||||||
|
-upper_y - dot_radius,
|
||||||
|
width,
|
||||||
|
-route2_start.y() + upper_y + dot_radius * 2.0
|
||||||
|
)
|
||||||
)
|
)
|
||||||
.set("xmlns:xlink", "http://www.w3.org/1999/xlink");
|
.set("xmlns:xlink", "http://www.w3.org/1999/xlink");
|
||||||
|
|
||||||
|
11
src/main.rs
11
src/main.rs
@ -16,7 +16,7 @@ type Line = geo::Line<f64>;
|
|||||||
type LineString = geo::LineString<f64>;
|
type LineString = geo::LineString<f64>;
|
||||||
type Polygon = geo::Polygon<f64>;
|
type Polygon = geo::Polygon<f64>;
|
||||||
|
|
||||||
#[derive(StructOpt)]
|
#[derive(StructOpt, Clone, Copy)]
|
||||||
#[structopt(name = "aufgabe1", about = "Implementierung für Aufgabe 1")]
|
#[structopt(name = "aufgabe1", about = "Implementierung für Aufgabe 1")]
|
||||||
struct Opt {
|
struct Opt {
|
||||||
/// Debug-Modus aktivieren
|
/// Debug-Modus aktivieren
|
||||||
@ -66,7 +66,7 @@ fn main() {
|
|||||||
// Startzeitpunkt berechnen
|
// Startzeitpunkt berechnen
|
||||||
let calc_time = |total_distance, y| {
|
let calc_time = |total_distance, y| {
|
||||||
NaiveTime::from_hms(7, 30, 0)
|
NaiveTime::from_hms(7, 30, 0)
|
||||||
- Duration::seconds(((total_distance * 2.0 - y) / bus_speed) as i64)
|
- Duration::seconds(((total_distance * (opt.bus/opt.lisa) - y) / bus_speed) as i64)
|
||||||
};
|
};
|
||||||
// Ankuftszeit berechnen
|
// Ankuftszeit berechnen
|
||||||
let calc_end_time = |total_distance, y| {
|
let calc_end_time = |total_distance, y| {
|
||||||
@ -150,7 +150,7 @@ fn main() {
|
|||||||
// Lisa trifft Bus mit 60°-Winkel
|
// Lisa trifft Bus mit 60°-Winkel
|
||||||
let next = Point::new(
|
let next = Point::new(
|
||||||
0.0,
|
0.0,
|
||||||
last.pos.y() + 30.0f64.to_radians().tan() * last.pos.x(),
|
last.pos.y() + (opt.lisa/opt.bus).asin().tan() * last.pos.x(),
|
||||||
);
|
);
|
||||||
let line = Line::new(last.pos, next);
|
let line = Line::new(last.pos, next);
|
||||||
// freier Weg?
|
// freier Weg?
|
||||||
@ -180,6 +180,7 @@ fn main() {
|
|||||||
best_delay = delay;
|
best_delay = delay;
|
||||||
if opt.save_intermediates {
|
if opt.save_intermediates {
|
||||||
display::save_svg(
|
display::save_svg(
|
||||||
|
opt,
|
||||||
&format!("{}{}.svg", save_prefix, save_counter),
|
&format!("{}{}.svg", save_prefix, save_counter),
|
||||||
house,
|
house,
|
||||||
&polys,
|
&polys,
|
||||||
@ -228,7 +229,7 @@ fn main() {
|
|||||||
if opt.tkz {
|
if opt.tkz {
|
||||||
display::dump_latex_code(&route, &polys);
|
display::dump_latex_code(&route, &polys);
|
||||||
} else {
|
} else {
|
||||||
display::dump_route(house, &polys, &route);
|
display::dump_route(opt, house, &polys, &route);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -273,5 +274,5 @@ fn distance(a: Point, b: Point) -> f64 {
|
|||||||
fn max_possible_delay(opt: &Opt, total_distance: f64, lisa: Point) -> f64 {
|
fn max_possible_delay(opt: &Opt, total_distance: f64, lisa: Point) -> f64 {
|
||||||
let x_l = lisa.x();
|
let x_l = lisa.x();
|
||||||
let y_l = lisa.y();
|
let y_l = lisa.y();
|
||||||
y_l - (3.0 * x_l.powi(2)).sqrt() - total_distance * (opt.bus/opt.lisa)
|
y_l - (((opt.bus/opt.lisa).powi(2) - 1.0) * x_l.powi(2)).sqrt() - total_distance * (opt.bus/opt.lisa)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user