mirror of
https://github.com/a-b-street/abstreet.git
synced 2024-11-30 18:24:04 +03:00
fixing path trace cases that wind up with points too squished together
This commit is contained in:
parent
a98383db8f
commit
ca058331e5
@ -5,6 +5,7 @@
|
||||
- try fixed pt again, for determinism purposes mostly
|
||||
- successful: Lines of ~0 length gone
|
||||
- but due to bad polyline shifting, some things would loudly break if we squished pts down always
|
||||
- might be cleaner to make polyline slice return Optional
|
||||
|
||||
- underlying problems
|
||||
- bad polyline shifting remains
|
||||
|
@ -162,6 +162,15 @@ impl PolyLine {
|
||||
self.length()
|
||||
);
|
||||
}
|
||||
if result.len() == 1 {
|
||||
panic!(
|
||||
"Slice [{}, {}] didn't work on a polyline of length {} with points {}",
|
||||
start,
|
||||
end,
|
||||
self.length(),
|
||||
self
|
||||
);
|
||||
}
|
||||
|
||||
(PolyLine::new(result), end - dist_so_far)
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
use crate::{BusRouteID, BusStopID, LaneID, LaneType, Map, Position, Traversable, TurnID};
|
||||
use dimensioned::si;
|
||||
use geom::{PolyLine, Pt2D};
|
||||
use geom::{PolyLine, Pt2D, EPSILON_DIST};
|
||||
use ordered_float::NotNan;
|
||||
use serde_derive::{Deserialize, Serialize};
|
||||
use std::collections::{BinaryHeap, HashMap, VecDeque};
|
||||
@ -85,14 +85,14 @@ impl PathStep {
|
||||
PathStep::Lane(id) => {
|
||||
let l = map.get_l(*id);
|
||||
// Might have a pedestrian at a front_path lined up with the end of a lane
|
||||
if start == l.length() {
|
||||
if start >= l.length() - EPSILON_DIST {
|
||||
None
|
||||
} else {
|
||||
Some(l.lane_center_pts.slice(start, start + dist_ahead))
|
||||
}
|
||||
}
|
||||
PathStep::ContraflowLane(id) => {
|
||||
if start == 0.0 * si::M {
|
||||
if start < EPSILON_DIST {
|
||||
None
|
||||
} else {
|
||||
let pts = map.get_l(*id).lane_center_pts.reversed();
|
||||
@ -102,7 +102,7 @@ impl PathStep {
|
||||
}
|
||||
PathStep::Turn(id) => {
|
||||
let geom = &map.get_t(*id).geom;
|
||||
if geom.length() == 0.0 * si::M {
|
||||
if start >= geom.length() - EPSILON_DIST {
|
||||
None
|
||||
} else {
|
||||
Some(geom.slice(start, start + dist_ahead))
|
||||
@ -227,16 +227,18 @@ impl Path {
|
||||
PathStep::ContraflowLane(l) => map.get_l(l).lane_center_pts.reversed().length(),
|
||||
_ => 0.0 * si::M,
|
||||
};
|
||||
if let Some((new_pts, dist)) =
|
||||
self.steps[i].slice(map, start_dist_this_step, dist_remaining)
|
||||
{
|
||||
if pts_so_far.is_some() {
|
||||
let pts = pts_so_far.unwrap().extend(&new_pts);
|
||||
pts_so_far = Some(pts);
|
||||
} else {
|
||||
pts_so_far = Some(new_pts);
|
||||
if dist_remaining - start_dist_this_step > EPSILON_DIST {
|
||||
if let Some((new_pts, dist)) =
|
||||
self.steps[i].slice(map, start_dist_this_step, dist_remaining)
|
||||
{
|
||||
if pts_so_far.is_some() {
|
||||
let pts = pts_so_far.unwrap().extend(&new_pts);
|
||||
pts_so_far = Some(pts);
|
||||
} else {
|
||||
pts_so_far = Some(new_pts);
|
||||
}
|
||||
dist_remaining = dist;
|
||||
}
|
||||
dist_remaining = dist;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -851,7 +851,13 @@ impl DrivingSimState {
|
||||
)
|
||||
.unwrap()
|
||||
} else {
|
||||
c.on.slice(0.0 * si::M, c.dist_along, map).0
|
||||
if c.dist_along > EPSILON_DIST {
|
||||
c.on.slice(0.0 * si::M, c.dist_along, map).0
|
||||
} else {
|
||||
// TODO Kinda weird to consider the car not present, but eventually cars spawning
|
||||
// at borders should appear fully anyway.
|
||||
return None;
|
||||
}
|
||||
};
|
||||
|
||||
let body = if let Some(ref parking) = c.parking {
|
||||
|
Loading…
Reference in New Issue
Block a user