diff --git a/src/display.rs b/src/display.rs index ebe0f45..8917e32 100644 --- a/src/display.rs +++ b/src/display.rs @@ -69,7 +69,8 @@ pub(crate) fn dump_latex_code(route: &[RunState], polys: &[Polygon]) { println!("\\tkzDrawSegment(R{},R{})", idx - 1, idx); } for idx in 0..route.len() { - println!("\\tkzDrawPoint[fill=red,color=black,size=13](R{})", idx); + let color = if idx == 0 || idx == route.len() - 1 { "green" } else { "red" }; + println!("\\tkzDrawPoint[fill={},color=black,size=13](R{})", color, idx); } println!("\\end{{tikzpicture}}"); } diff --git a/src/main.rs b/src/main.rs index 7527ab4..12befff 100644 --- a/src/main.rs +++ b/src/main.rs @@ -218,6 +218,7 @@ fn main() { // neu gefundene Routen speichern states.extend(all); } + // beste Lösung ausgeben eprintln!("Finale Lösung:"); let route = best; let last = route.last().unwrap(); @@ -295,6 +296,7 @@ fn none_intersect(polys: &[Polygon], line: &Line) -> bool { } // (dieser Fall tritt auf, wenn die Linie von einer Polygon-Ecke zu einer anderen Ecke verläuft) } + // keine Überschneidung gefunden: der Weg ist frei! true } @@ -305,20 +307,21 @@ fn distance(a: Point, b: Point) -> f64 { /// Mit dieser Funktion kann man bestimmen, wo der Bus zu Lisas Startzeit war. /// Die Funktion nimmt an, dass Lisa, von ihrer aktuellen Position aus, den Bus ohne Umwege erreichen kann. -/// Sehr hilfreich als Heuristik, da sie nie schlechter als das eigentliche Ergebnis sein kann. +/// Sehr hilfreich als Heuristik, da die theoretisch beste Lösung nie schlechter als das eigentliche Ergebnis sein kann. fn best_bus_pos(opt: &Opt, total_distance: f64, lisa: Point) -> f64 { let x_l = lisa.x(); // a let y_l = lisa.y(); // b - // y-Koordinate des Busses: d - // Länge, die Lisa noch laufen muss: l - // Verhältnis beider Geschwindigkeiten: x = bus / lisa - // l^2 = sqrt(a^2 + (b - xl - d)^2) - // die quadratische Gleichung hat zwei Lösungen (siehe Dok.) - // nach der ABC-Formel muss b^2 - 4ac = 0 sein, damit die Gleichung nur eine Lösung hat: - // (2xb-2xd)^2 - 4*((1-x^2)*(-a^2-b^2-d^2+2bd)) = 0 - // (eine WolframAlpha-Eingabe später..) - // d = sqrt(a^2 * (x^2 - 1)) + b - // in dieser Berechnung wird auch die bereits zurückgelegte Strecke berücksichtigt: + + // y-Koordinate des Busses: d + // Länge, die Lisa noch laufen muss: l + // Verhältnis beider Geschwindigkeiten: x = bus / lisa + // l^2 = sqrt(a^2 + (b - xl - d)^2) + // die quadratische Gleichung hat zwei Lösungen (siehe Dok.) + // nach der ABC-Formel muss b^2 - 4ac = 0 sein, damit die Gleichung nur eine Lösung hat: + // (2xb-2xd)^2 - 4*((1-x^2)*(-a^2-b^2-d^2+2bd)) = 0 + // (eine WolframAlpha-Eingabe später..) + // d = sqrt(a^2 * (x^2 - 1)) + b + // in dieser Berechnung wird auch die bereits zurückgelegte Strecke berücksichtigt: y_l - (((opt.bus / opt.lisa).powi(2) - 1.0) * x_l.powi(2)).sqrt() - total_distance * (opt.bus / opt.lisa) }