Add examples to documentation

This commit is contained in:
Arne Keller 2019-02-02 18:11:30 +01:00
parent 4ac40016fb
commit e85580a92c
3 changed files with 96 additions and 2 deletions

View File

@ -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}

View File

@ -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<RunState>) {
let (points, lines, route1, route2_start) = gen_params(house, route);
print!(

View File

@ -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 {