Formatting and colors

This commit is contained in:
Arne Keller 2019-03-31 18:02:07 +02:00
parent 573788fbfc
commit 443eb4217c
2 changed files with 16 additions and 12 deletions

View File

@ -69,7 +69,8 @@ pub(crate) fn dump_latex_code(route: &[RunState], polys: &[Polygon]) {
println!("\\tkzDrawSegment(R{},R{})", idx - 1, idx); println!("\\tkzDrawSegment(R{},R{})", idx - 1, idx);
} }
for idx in 0..route.len() { 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}}"); println!("\\end{{tikzpicture}}");
} }

View File

@ -218,6 +218,7 @@ fn main() {
// neu gefundene Routen speichern // neu gefundene Routen speichern
states.extend(all); states.extend(all);
} }
// beste Lösung ausgeben
eprintln!("Finale Lösung:"); eprintln!("Finale Lösung:");
let route = best; let route = best;
let last = route.last().unwrap(); 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) // (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 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. /// 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. /// 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 { fn best_bus_pos(opt: &Opt, total_distance: f64, lisa: Point) -> f64 {
let x_l = lisa.x(); // a let x_l = lisa.x(); // a
let y_l = lisa.y(); // b let y_l = lisa.y(); // b
// y-Koordinate des Busses: d
// Länge, die Lisa noch laufen muss: l // y-Koordinate des Busses: d
// Verhältnis beider Geschwindigkeiten: x = bus / lisa // Länge, die Lisa noch laufen muss: l
// l^2 = sqrt(a^2 + (b - xl - d)^2) // Verhältnis beider Geschwindigkeiten: x = bus / lisa
// die quadratische Gleichung hat zwei Lösungen (siehe Dok.) // l^2 = sqrt(a^2 + (b - xl - d)^2)
// nach der ABC-Formel muss b^2 - 4ac = 0 sein, damit die Gleichung nur eine Lösung hat: // die quadratische Gleichung hat zwei Lösungen (siehe Dok.)
// (2xb-2xd)^2 - 4*((1-x^2)*(-a^2-b^2-d^2+2bd)) = 0 // nach der ABC-Formel muss b^2 - 4ac = 0 sein, damit die Gleichung nur eine Lösung hat:
// (eine WolframAlpha-Eingabe später..) // (2xb-2xd)^2 - 4*((1-x^2)*(-a^2-b^2-d^2+2bd)) = 0
// d = sqrt(a^2 * (x^2 - 1)) + b // (eine WolframAlpha-Eingabe später..)
// in dieser Berechnung wird auch die bereits zurückgelegte Strecke berücksichtigt: // 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() y_l - (((opt.bus / opt.lisa).powi(2) - 1.0) * x_l.powi(2)).sqrt()
- total_distance * (opt.bus / opt.lisa) - total_distance * (opt.bus / opt.lisa)
} }