trail: actually redraw when we are near the boundary

avoid repainting same segments over and over to make stuff faster.
Speed optimalizations (faster but less correct).
pull/3616/head
Pavel Machek 2024-09-13 17:12:22 +02:00
parent 3d4661c099
commit 594a7e446a
1 changed files with 51 additions and 43 deletions

View File

@ -296,8 +296,11 @@ var zoom = {
clear : function() { clear : function() {
this.buf.reset().clear(); this.buf.reset().clear();
}, },
/* Origin in lat/lon */
origin : 0,
geoNew : function(p, is) { geoNew : function(p, is) {
this.clear(); this.clear();
this.origin = p;
let i = Bangle.project(p); let i = Bangle.project(p);
this.x1 = i.x - is; this.x1 = i.x - is;
this.x2 = i.x + is; this.x2 = i.x + is;
@ -447,22 +450,16 @@ function toxy(pp, p) {
return r; return r;
} }
function paint(pp, p1, p2, thick) { var start = {}, destination = {}, num = 0, dist = 0;
if (0) {
let d1 = toxy(pp, p1);
let d2 = toxy(pp, p2);
//print(d1, d2);
drawThickLine(pp.g, d1.x, d1.y, d2.x, d2.y, thick);
} else
zoom.geoLine(p1, p2);
}
var destination = {}, num = 0, dist = 0;
function read(pp, n) { function read(pp, n) {
let f = require("Storage").open(n+".st", "r"); let f = require("Storage").open(n+".st", "r");
let l = f.readLine(); let l = f.readLine();
let prev = 0; let prev = 0;
g.setColor(0, 0, 0);
g.setFont("Vector", 31);
while (l!==undefined) { while (l!==undefined) {
l = ""+l; l = ""+l;
let p = egt.parse(l); let p = egt.parse(l);
@ -473,6 +470,7 @@ function read(pp, n) {
paint(pp, prev, p, 1); paint(pp, prev, p, 1);
} else { } else {
zoom.geoNew(p, 3000); zoom.geoNew(p, 3000);
start = p;
pp.lat = p.lat; pp.lat = p.lat;
pp.lon = p.lon; pp.lon = p.lon;
} }
@ -480,23 +478,21 @@ function read(pp, n) {
} }
l = f.readLine(); l = f.readLine();
if (!(num % 30)) { if (!(num % 30)) {
if (!pp.g) g.clear();
ui.drawMsg(num + "\n" + fmt.fmtDist(dist / 1000)); zoom.geoPaint(prev, 0, 1500);
else { g.drawString(num + "\n" + fmt.fmtDist(dist / 1000), 3, 3);
zoom.geoPaint(prev, 0, 1500); g.flip();
g.flip();
}
print(num, "points"); print(num, "points");
if (!(num % 300)) {
zoom.geoNew(prev, 3000);
}
} }
num++; num++;
} }
if (!pp.g) ui.drawMsg(num + "\n" + fmt.fmtDist(dist / 1000));
ui.drawMsg(num + "\n" + fmt.fmtDist(dist / 1000));
destination = prev; destination = prev;
} }
zoom.init(176);
function time_read(n) { function time_read(n) {
print("Converting..."); print("Converting...");
to_storage(n); to_storage(n);
@ -518,7 +514,7 @@ function time_read(n) {
setTimeout(step, 100); setTimeout(step, 100);
} }
var track_name = "", inf, point_num, track = [], track_points = 30, north = {}; var track_name = "", inf, point_num, track = [], track_points = 30, north = {}, point_drawn;
function step_init() { function step_init() {
inf = require("Storage").open(track_name + ".st", "r"); inf = require("Storage").open(track_name + ".st", "r");
@ -526,7 +522,9 @@ function step_init() {
north.lat = 89.9; north.lat = 89.9;
north.lon = 0; north.lon = 0;
point_num = 0; point_num = 0;
point_drawn = 0;
track = []; track = [];
zoom.geoNew(start, 3000);
} }
function load_next() { function load_next() {
@ -542,38 +540,53 @@ function load_next() {
continue; continue;
} }
p.point_num = point_num++; p.point_num = point_num++;
p.passed = 0;
print("Loading ", p.point_num); print("Loading ", p.point_num);
track.push(p); track.push(p);
} }
return 1; return 1;
} }
function paint(pp, p1, p2, thick) {
zoom.geoLine(p1, p2);
}
function paint_all(pp) { function paint_all(pp) {
let prev = 0; let prev = 0;
let mDist = 99999999999, m = 0; let mDist = 99999999999, m = 0;
const fast = 0; const fast = 0;
let new_drawn = -1;
g.setColor(1, 0, 0); g.setColor(1, 0, 0);
for (let i = track.length-1; i > 1; i--) {
let p = track[i];
if (point_drawn >= p.point_num)
break;
prev = track[i-1];
paint(pp, prev, p, 3);
if (new_drawn == -1)
new_drawn = p.point_num;
}
if (new_drawn != -1)
point_drawn = new_drawn;
for (let i = 1; i < track.length; i++) { for (let i = 1; i < track.length; i++) {
let p = track[i]; let p = track[i];
prev = track[i-1]; prev = track[i-1];
if (0 && fmt.distance(p, pp) < 100)
p.passed = 1;
if (!fast) { if (!fast) {
let d = distSegment(prev, p, pp); let d = distSegment(prev, p, pp);
if (d < mDist) { if (d < mDist) {
mDist = d; mDist = d;
m = i; m = i;
} else { } else if (mDist < 10 && d > 100)
g.setColor(0, 0, 0); break;
}
} }
paint(pp, prev, p, 3);
} }
if (fast) if (fast)
return { quiet: 0, offtrack : 0 }; return { quiet: 0, offtrack : 0 };
print("Best segment was", m, "dist", mDist); print("Best segment was", m, "dist", mDist);
if (fmt.distance(track[m], zoom.origin) > 1500) {
zoom.geoNew(track[m], 3000); // FIXME: this will flicker
point_drawn = 0;
}
let ahead = 0, a = fmt.bearing(track[m-1], track[m]), quiet = -1; let ahead = 0, a = fmt.bearing(track[m-1], track[m]), quiet = -1;
for (let i = m+1; i < track.length; i++) { for (let i = m+1; i < track.length; i++) {
let a2 = fmt.bearing(track[i-1], track[i]); let a2 = fmt.bearing(track[i-1], track[i]);
@ -583,6 +596,7 @@ function paint_all(pp) {
quiet = ahead + fmt.distance(pp, track[i-1]); quiet = ahead + fmt.distance(pp, track[i-1]);
print("...straight", ahead); print("...straight", ahead);
a = a2; a = a2;
break;
} }
ahead += fmt.distance(track[i-1], track[i]); ahead += fmt.distance(track[i-1], track[i]);
} }
@ -590,8 +604,7 @@ function paint_all(pp) {
return { quiet: quiet, offtrack: mDist }; return { quiet: quiet, offtrack: mDist };
} }
function step_to(pp, pass_all) { function step_to(pp, pass_all) {
if (0) { if (0) {
g.setColor(0.5, 0.5, 1); g.setColor(0.5, 0.5, 1);
paint(pp, pp, destination, 1); paint(pp, pp, destination, 1);
@ -602,8 +615,7 @@ function step_to(pp, pass_all) {
let quiet = paint_all(pp); let quiet = paint_all(pp);
if ((pass_all || track[0].passed) if (distSegment(track[0], track[1], pp) > 150
&& distSegment(track[0], track[1], pp) > 150
&& track.length > 10) { && track.length > 10) {
print("Dropping ", track[0].point_num); print("Dropping ", track[0].point_num);
track.shift(); track.shift();
@ -643,9 +655,9 @@ function step() {
pp.x = ui.w/2; pp.x = ui.w/2;
pp.y = ui.h*0.5; pp.y = ui.h*0.5;
g.setColor(0.5, 0.5, 1); g.setColor(0, 0, 1);
let sc = 2.5; let sc = 2.5;
g.fillPoly([ pp.x, pp.y, pp.x - 5*sc, pp.y + 12*sc, pp.x + 5*sc, pp.y + 12*sc ]); g.drawPoly([ pp.x, pp.y, pp.x - 5*sc, pp.y + 12*sc, pp.x + 5*sc, pp.y + 12*sc ], true);
} }
@ -675,7 +687,7 @@ function step() {
track.shift(); track.shift();
let v2 = getTime(); let v2 = getTime();
print("Step took", (v2-v1), "seconds"); print("Step took", (v2-v1), "seconds");
setTimeout(step, 1000); setTimeout(step, 10); /* FIXME! */
} }
function recover() { function recover() {
@ -723,6 +735,7 @@ fmt.init();
egt.init(); egt.init();
gps.init(); gps.init();
gps.start_gps(); gps.start_gps();
zoom.init(176);
const st = require('Storage'); const st = require('Storage');
@ -732,13 +745,8 @@ l = st.list(l, {sf:false});
print(l); print(l);
function load_track(x) { function load_track(x) {
print("Loading", x); Bangle.buzz(50, 1);
Bangle.buzz(50, 1); // Won't happen because load() is quicker ui.drawMsg("Loading\n"+x);
g.reset().clear()
.setFont("Vector", 40)
.drawString("Loading", 0, 30)
.drawString(x, 0, 80);
g.flip();
track_name = x; track_name = x;
time_read(x); time_read(x);