1
0
Fork 0

waypoints in file

master
frederic wagner 2022-07-22 07:02:45 +02:00
parent a255fc5c1e
commit d2b3840518
4 changed files with 43 additions and 32 deletions

View File

@ -27,3 +27,5 @@
0.10: 0.10:
* Display performances enhancement. * Display performances enhancement.
* Waypoints information is embedded in file and extracted from comments on
points.

View File

@ -1,12 +1,11 @@
- direction is still shitty on gps - direction is still shitty on gps
- split on points with comments
and encode them as waypoints
- code is becoming messy - code is becoming messy
- turn off gps when moving to next waypoint - turn off gps when moving to next waypoint
- display distance to next water/toilet - display distance to next water/toilet
- display distance to next waypoint
- meters seem to be a bit too long - meters seem to be a bit too long

View File

@ -1,6 +1,6 @@
let simulated = false; let simulated = true;
let file_version = 2; let file_version = 3;
let code_key = 47490; let code_key = 47490;
let interests_colors = [ let interests_colors = [
@ -177,18 +177,19 @@ class Status {
g.setColor(1.0, 0.0, 0.0); g.setColor(1.0, 0.0, 0.0);
} }
g.drawLine(previous_x, previous_y, x, y); g.drawLine(previous_x, previous_y, x, y);
}
if (this.path.is_waypoint(i-1)) { if (this.path.is_waypoint(i-1)) {
g.setColor(g.theme.fg);
g.fillCircle(previous_x, previous_y, 6);
g.setColor(g.theme.bg);
g.fillCircle(previous_x, previous_y, 5);
}
g.setColor(g.theme.fg); g.setColor(g.theme.fg);
g.fillCircle(previous_x, previous_y, 6); g.fillCircle(previous_x, previous_y, 4);
g.setColor(g.theme.bg); g.setColor(g.theme.bg);
g.fillCircle(previous_x, previous_y, 5); g.fillCircle(previous_x, previous_y, 3);
} }
g.setColor(g.theme.fg);
g.fillCircle(previous_x, previous_y, 4);
g.setColor(g.theme.bg);
g.fillCircle(previous_x, previous_y, 3);
previous_x = x; previous_x = x;
previous_y = y; previous_y = y;
@ -224,14 +225,19 @@ class Path {
let points_number = header[2]; let points_number = header[2];
if ((key != code_key)||(version>file_version)) { if ((key != code_key)||(version>file_version)) {
E.showMessage("Invalid gpc file"); E.showMessage("Invalid gpc file");
return; load();
} }
// path points // path points
this.points = Float64Array(buffer, offset, points_number*2); this.points = Float64Array(buffer, offset, points_number*2);
offset += 8 * points_number * 2;
// path waypoints
let waypoints_len = Math.ceil(points_number / 8.0);
this.waypoints = Uint8Array(buffer, offset, waypoints_len);
offset += waypoints_len;
// interest points // interest points
offset += 8 * points_number * 2;
let interests_number = header[3]; let interests_number = header[3];
this.interests_coordinates = Float64Array(buffer, offset, interests_number * 2); this.interests_coordinates = Float64Array(buffer, offset, interests_number * 2);
offset += 8 * interests_number * 2; offset += 8 * interests_number * 2;
@ -247,22 +253,8 @@ class Path {
offset += 2 * starts_length; offset += 2 * starts_length;
} }
// if start, end or steep direction change
// we are buzzing and displayed specially
is_waypoint(point_index) { is_waypoint(point_index) {
if ((point_index == 0)||(point_index == this.len -1)) { return (this.waypoints[Math.floor(point_index / 8)] & (point_index % 8));
return true;
} else {
let p1 = this.point(point_index-1);
let p2 = this.point(point_index);
let p3 = this.point(point_index+1);
let d1 = p2.minus(p1);
let d2 = p3.minus(p2);
let a1 = Math.atan2(d1.lat, d1.lon);
let a2 = Math.atan2(d2.lat, d2.lon);
let direction_change = Math.abs(a2-a1);
return ((direction_change > Math.PI / 3.0)&&(direction_change < Math.PI * 5.0/3.0));
}
} }
// execute op on all segments. // execute op on all segments.
@ -513,3 +505,4 @@ if (files.length <= 1) {
} else { } else {
drawMenu(); drawMenu();
} }

View File

@ -11,7 +11,7 @@ mod osm;
use osm::{parse_osm_data, InterestPoint}; use osm::{parse_osm_data, InterestPoint};
const KEY: u16 = 47490; const KEY: u16 = 47490;
const FILE_VERSION: u16 = 2; const FILE_VERSION: u16 = 3;
#[derive(Debug, PartialEq, Clone, Copy)] #[derive(Debug, PartialEq, Clone, Copy)]
pub struct Point { pub struct Point {
@ -349,7 +349,12 @@ fn compress_coordinates(points: &[(i32, i32)]) -> Vec<(i16, i16)> {
xdiffs.zip(ydiffs).collect() xdiffs.zip(ydiffs).collect()
} }
fn save_gpc<P: AsRef<Path>>(path: P, points: &[Point], buckets: &[Bucket]) -> std::io::Result<()> { fn save_gpc<P: AsRef<Path>>(
path: P,
points: &[Point],
waypoints: &HashSet<Point>,
buckets: &[Bucket],
) -> std::io::Result<()> {
let mut writer = BufWriter::new(File::create(path)?); let mut writer = BufWriter::new(File::create(path)?);
eprintln!("saving {} points", points.len()); eprintln!("saving {} points", points.len());
@ -380,6 +385,18 @@ fn save_gpc<P: AsRef<Path>>(path: P, points: &[Point], buckets: &[Bucket]) -> st
.flat_map(|p| [p.x, p.y]) .flat_map(|p| [p.x, p.y])
.try_for_each(|c| writer.write_all(&c.to_le_bytes()))?; .try_for_each(|c| writer.write_all(&c.to_le_bytes()))?;
let mut waypoints_bits = std::iter::repeat(0u8)
.take(points.len() / 8 + if points.len() % 8 != 0 { 1 } else { 0 })
.collect::<Vec<u8>>();
points.iter().enumerate().for_each(|(i, p)| {
if waypoints.contains(p) {
waypoints_bits[i / 8] |= 1 << (i % 8)
}
});
waypoints_bits
.iter()
.try_for_each(|byte| writer.write_all(&byte.to_le_bytes()))?;
unique_interest_points unique_interest_points
.iter() .iter()
.flat_map(|p| [p.point.x, p.point.y]) .flat_map(|p| [p.point.x, p.point.y])
@ -672,5 +689,5 @@ async fn main() {
) )
.unwrap(); .unwrap();
save_gpc("test.gpc", &rp, &buckets).unwrap(); save_gpc("test.gpc", &rp, &waypoints, &buckets).unwrap();
} }