Add examples to documentation
This commit is contained in:
parent
4ac40016fb
commit
e85580a92c
@ -224,9 +224,42 @@ Außerdem wird Lisa auf einer optimalen Route vor dem letzten Abschnitt immer vo
|
|||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
\section{Umsetzung}
|
\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}
|
\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}
|
\section{Quellcode}
|
||||||
\lstinputlisting[frame=single,language=Rust,breaklines=true]{src/main.rs}
|
\lstinputlisting[frame=single,language=Rust,breaklines=true]{src/main.rs}
|
||||||
|
@ -8,6 +8,67 @@ use std::fs;
|
|||||||
|
|
||||||
use super::*;
|
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>) {
|
pub(crate) fn dump_route(house: Point, polys: &[Polygon], route: &Vec<RunState>) {
|
||||||
let (points, lines, route1, route2_start) = gen_params(house, route);
|
let (points, lines, route1, route2_start) = gen_params(house, route);
|
||||||
print!(
|
print!(
|
||||||
|
@ -177,7 +177,7 @@ fn main() {
|
|||||||
eprintln!("Länge: {:.0}m", length);
|
eprintln!("Länge: {:.0}m", length);
|
||||||
let seconds = length / (15.0 / 3.6);
|
let seconds = length / (15.0 / 3.6);
|
||||||
eprintln!("Dauer: {:02.0}:{:02.0}", seconds / 60.0, seconds % 60.0);
|
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 {
|
fn none_intersect(polys: &[Polygon], line: &Line) -> bool {
|
||||||
|
Loading…
Reference in New Issue
Block a user