mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-05-28 01:53:48 +08:00
[plot] draw curves at low resolution when moving/selecting in log plotter
much faster when dealing with huge logs
This commit is contained in:
+9
-16
@@ -48,14 +48,6 @@ let remove_same_t = fun l ->
|
||||
| l -> l in
|
||||
loop 0 l
|
||||
|
||||
let rec remove_older t0 = function
|
||||
(t,_)::l when t < t0 -> remove_older t0 l
|
||||
| l -> l
|
||||
|
||||
let rec remove_newer t0 = function
|
||||
(t,v)::l when t <= t0 -> (t,v)::remove_newer t0 l
|
||||
| l -> []
|
||||
|
||||
let compute_ticks = fun min_y max_y ->
|
||||
let delta = max_y -. min_y in
|
||||
|
||||
@@ -303,7 +295,7 @@ class plot = fun ~width ~height ~packing () ->
|
||||
let renderer = fig_renderer (self#da_renderer ())#size in
|
||||
self#recompute ~renderer ()
|
||||
|
||||
method recompute = fun ?(renderer=self#da_renderer ()) () ->
|
||||
method recompute = fun ?(renderer=self#da_renderer ()) ?(low_res=false) () ->
|
||||
let (width, height) = renderer#size in
|
||||
renderer#init ();
|
||||
|
||||
@@ -330,12 +322,11 @@ class plot = fun ~width ~height ~packing () ->
|
||||
(* Curves *)
|
||||
let title_y = ref margin in
|
||||
Hashtbl.iter (fun title curve ->
|
||||
let points = Array.to_list (Array.map (fun (t, v) -> (scale_x t, scale_y v)) curve.values) in
|
||||
(* let points = remove_same_t points in *)
|
||||
let points = remove_older (scale_x min_x) points in
|
||||
let points = remove_newer (scale_x max_x) points in
|
||||
let step = if low_res then 10 else 1 in
|
||||
let points = ref [] in
|
||||
Array.iteri (fun i (t, v) -> if t > min_x && t <= max_x && (i mod step = 0) then points := List.rev_append [(scale_x t, scale_y v)] !points) curve.values;
|
||||
renderer#set_color curve.color;
|
||||
renderer#lines points;
|
||||
renderer#lines !points;
|
||||
|
||||
(* Title *)
|
||||
let (w, h) = renderer#create_text title in
|
||||
@@ -410,7 +401,7 @@ class plot = fun ~width ~height ~packing () ->
|
||||
max_x <- max_x +. dx;
|
||||
min_y <- min_y +. dy;
|
||||
max_y <- max_y +. dy;
|
||||
self#recompute ()
|
||||
self#recompute ~low_res:true ()
|
||||
|
||||
method button_press = fun ev ->
|
||||
pressed_button <- Some (GdkEvent.Button.button ev);
|
||||
@@ -432,7 +423,7 @@ class plot = fun ~width ~height ~packing () ->
|
||||
Some 1 ->
|
||||
motion_x <- x;
|
||||
motion_y <- y;
|
||||
self#recompute ();
|
||||
self#recompute ~low_res:true ();
|
||||
true
|
||||
| Some 2 -> (* middle button, scroll *)
|
||||
self#scroll (truncate (press_x-.x)) (truncate (y-.press_y));
|
||||
@@ -461,6 +452,8 @@ class plot = fun ~width ~height ~packing () ->
|
||||
self#recompute ()
|
||||
end;
|
||||
true
|
||||
| 2 -> self#recompute (); (* recompute at full resolution after a scroll *)
|
||||
true
|
||||
| _ -> false
|
||||
|
||||
method zoom = fun ev ->
|
||||
|
||||
Reference in New Issue
Block a user