From e85580a92cb525243875a83801d06cd34b2c4490 Mon Sep 17 00:00:00 2001 From: Arne Keller Date: Sat, 2 Feb 2019 18:11:30 +0100 Subject: [PATCH] Add examples to documentation --- DokumentationAufgabe1.tex | 35 +++++++++++++++++++++- src/display.rs | 61 +++++++++++++++++++++++++++++++++++++++ src/main.rs | 2 +- 3 files changed, 96 insertions(+), 2 deletions(-) diff --git a/DokumentationAufgabe1.tex b/DokumentationAufgabe1.tex index 6518919..1191aea 100644 --- a/DokumentationAufgabe1.tex +++ b/DokumentationAufgabe1.tex @@ -224,9 +224,42 @@ Außerdem wird Lisa auf einer optimalen Route vor dem letzten Abschnitt immer vo \end{figure} \section{Umsetzung} -Das Programm durchsucht in einer Breitensuche alle Wege, die über Polygonecken führen. Priorisiert werden jene Wege, bei denen Lisa theoretisch am längsten warten könnte. Um die Wege abzuschließen, probiert das Programm verschiedene Treffpunkte mit dem Bus durch (je einen pro Meter y-Achse). Derjenige, bei dem Lisa sich am meisten Zeit lassen kann, wird gespeichert, falls nicht schon eine bessere Lösung gefunden wurde. +Das Programm durchsucht in einer optimierten Breitensuche alle Wege, die über Polygonecken führen. Priorisiert werden jene Wege, bei denen Lisa theoretisch am längsten warten könnte. Um die Route abzuschließen, probiert das Programm danach immer, einen optimalen Weg zur y-Achse zu finden (dieser trifft sie im 60\degree-Winkel, wie oben beschrieben). Die Route, bei dem Lisa sich am meisten Zeit lassen kann, wird gespeichert, falls nicht schon eine bessere Lösung gefunden wurde. Die Suche ist beendet, sobald alle unvollständigen Routen die beste Wartezeit nicht mehr verbessern können. + +Die so gefundene Route kann in einer svg-Datei gespeichert werden. Der Weg von Lisa und dem Bus ist animiert. Zusätzlich zu den unbedingt benötigten Ausgaben wie z.B. der Start- und Zielzeit gibt das Programm auch noch die theoretisch (ohne Hindernisse) beste Startzeit und während der Suche gefundene Verbesserungen aus. \section{Beispiele} +Alle Beispiele sind im Maßstab 1:70m. +\begin{figure}[H] +\centering +\input{run1.tkz} +\caption{Beispiel 1} +\label{fig:bsp1} +\end{figure} +\begin{figure}[H] +\centering +\input{run2.tkz} +\caption{Beispiel 2} +\label{fig:bsp2} +\end{figure} +\begin{figure}[H] +\centering +\input{run3.tkz} +\caption{Beispiel 3} +\label{fig:bsp3} +\end{figure} +\begin{figure}[H] +\centering +\input{run4.tkz} +\caption{Beispiel 4} +\label{fig:bsp4} +\end{figure} +\begin{figure}[H] +\centering +\input{run5.tkz} +\caption{Beispiel 5} +\label{fig:bsp5} +\end{figure} \section{Quellcode} \lstinputlisting[frame=single,language=Rust,breaklines=true]{src/main.rs} diff --git a/src/display.rs b/src/display.rs index 98c643d..3cba526 100644 --- a/src/display.rs +++ b/src/display.rs @@ -8,6 +8,67 @@ use std::fs; use super::*; +pub(crate) fn dump_latex_code(route: &[RunState], polys: &[Polygon]) { + const SCALE: f64 = 70.0; + let mut xmax = 0.0; + let mut ymax = 0.0; + for poly in polys { + for point in poly.exterior.points_iter() { + let x = point.x() / SCALE; + let y = point.y() / SCALE; + if x > xmax { + xmax = x; + } + if y > ymax { + ymax = y; + } + } + } + if route[route.len()-1].pos.y()/SCALE > ymax { + ymax = route[route.len()-1].pos.y()/SCALE; + } + println!("\\begin{{tikzpicture}}"); + println!("\\tkzInit[xmax={},ymax={}]", xmax + 0.3, ymax + 0.3); + println!("\\tkzAxeXY"); + println!("\\tkzGrid"); + for (idx, poly) in polys.iter().enumerate() { + print!("\\tkzDefPoints{{"); + for (poly_idx, point) in poly.exterior.points_iter().enumerate() { + let x = point.x() / SCALE; + let y = point.y() / SCALE; + print!("{}/{}/P{}_{}", x, y, idx, poly_idx); + if poly_idx != poly.exterior.0.len() - 1 { + print!(","); + } + if x > xmax { + xmax = x; + } + if y > ymax { + ymax = y; + } + } + println!("}}"); + print!("\\tkzDrawPolygon[fill=black,line width=1pt,opacity=0.5]("); + for (poly_idx, _) in poly.exterior.points_iter().enumerate() { + print!("P{}_{}", idx, poly_idx); + if poly_idx != poly.exterior.0.len() - 1 { + print!(","); + } + } + println!(")"); + } + for (idx, s) in route.iter().enumerate() { + println!("\\tkzDefPoint({},{}){{R{}}}", s.pos.x()/SCALE, s.pos.y()/SCALE, idx); + } + for idx in 1..route.len() { + println!("\\tkzDrawSegment(R{},R{})", idx-1, idx); + } + for idx in 0..route.len() { + println!("\\tkzDrawPoint[fill=red,color=black,size=13](R{})", idx); + } + println!("\\end{{tikzpicture}}"); +} + pub(crate) fn dump_route(house: Point, polys: &[Polygon], route: &Vec) { let (points, lines, route1, route2_start) = gen_params(house, route); print!( diff --git a/src/main.rs b/src/main.rs index 322b696..ca12ba0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -177,7 +177,7 @@ fn main() { eprintln!("Länge: {:.0}m", length); let seconds = length / (15.0 / 3.6); eprintln!("Dauer: {:02.0}:{:02.0}", seconds / 60.0, seconds % 60.0); - display::dump_route(house, &polys, &route); + display::dump_latex_code(&route, &polys); } fn none_intersect(polys: &[Polygon], line: &Line) -> bool {