mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Use the analyzed local minima/maxima for depth text plotting
Instead of relying on our ad-hoc minmax finder, just use the local minima/maxima information directly. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
28cadad144
commit
86e48bfe10
1 changed files with 18 additions and 69 deletions
87
profile.c
87
profile.c
|
@ -129,10 +129,10 @@ static void plot_text(struct graphics_context *gc, const text_render_options_t *
|
||||||
cairo_show_text(cr, buffer);
|
cairo_show_text(cr, buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void render_depth_sample(struct graphics_context *gc, struct sample *sample, const text_render_options_t *tro)
|
static void render_depth_sample(struct graphics_context *gc, struct plot_data *entry, const text_render_options_t *tro)
|
||||||
{
|
{
|
||||||
int sec = sample->time.seconds;
|
int sec = entry->sec;
|
||||||
depth_t depth = sample->depth;
|
depth_t depth = { entry->val };
|
||||||
const char *fmt;
|
const char *fmt;
|
||||||
double d;
|
double d;
|
||||||
|
|
||||||
|
@ -149,76 +149,28 @@ static void render_depth_sample(struct graphics_context *gc, struct sample *samp
|
||||||
plot_text(gc, tro, sec, depth.mm, fmt, d);
|
plot_text(gc, tro, sec, depth.mm, fmt, d);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
static void plot_text_samples(struct graphics_context *gc, struct plot_info *pi)
|
||||||
* Find the next minimum/maximum point.
|
|
||||||
*
|
|
||||||
* We exit early if we hit "enough" of a depth reversal,
|
|
||||||
* which is roughly 10 feet.
|
|
||||||
*/
|
|
||||||
static struct sample *next_minmax(struct sample *sample, struct sample *end, int minmax)
|
|
||||||
{
|
|
||||||
const int enough = 3000;
|
|
||||||
struct sample *result;
|
|
||||||
int depthlimit;
|
|
||||||
|
|
||||||
if (sample >= end)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
depthlimit = sample->depth.mm;
|
|
||||||
result = NULL;
|
|
||||||
|
|
||||||
for (;;) {
|
|
||||||
int depth;
|
|
||||||
|
|
||||||
sample++;
|
|
||||||
if (sample >= end)
|
|
||||||
return NULL;
|
|
||||||
depth = sample->depth.mm;
|
|
||||||
|
|
||||||
if (minmax) {
|
|
||||||
if (depth <= depthlimit) {
|
|
||||||
if (depthlimit - depth > enough)
|
|
||||||
break;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (depth >= depthlimit) {
|
|
||||||
if (depth - depthlimit > enough)
|
|
||||||
break;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
result = sample;
|
|
||||||
depthlimit = depth;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void plot_text_samples(struct graphics_context *gc, struct sample *a, struct sample *b)
|
|
||||||
{
|
{
|
||||||
static const text_render_options_t deep = {14, 1.0, 0.2, 0.2, CENTER, TOP};
|
static const text_render_options_t deep = {14, 1.0, 0.2, 0.2, CENTER, TOP};
|
||||||
static const text_render_options_t shallow = {14, 1.0, 0.2, 0.2, CENTER, BOTTOM};
|
static const text_render_options_t shallow = {14, 1.0, 0.2, 0.2, CENTER, BOTTOM};
|
||||||
|
int i;
|
||||||
|
|
||||||
for (;;) {
|
for (i = 0; i < pi->nr; i++) {
|
||||||
if (b <= a)
|
struct plot_data *entry = pi->entry + i;
|
||||||
break;
|
|
||||||
a = next_minmax(a, b, 1);
|
if (entry->val < 2000)
|
||||||
if (!a)
|
|
||||||
break;
|
|
||||||
render_depth_sample(gc, a, &deep);
|
|
||||||
a = next_minmax(a, b, 0);
|
|
||||||
if (!a)
|
|
||||||
break;
|
|
||||||
if (a->depth.mm < 2500)
|
|
||||||
continue;
|
continue;
|
||||||
render_depth_sample(gc, a, &shallow);
|
|
||||||
|
if (entry == entry->max[2])
|
||||||
|
render_depth_sample(gc, entry, &deep);
|
||||||
|
|
||||||
|
if (entry == entry->min[2])
|
||||||
|
render_depth_sample(gc, entry, &shallow);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void plot_depth_text(struct dive *dive, struct graphics_context *gc)
|
static void plot_depth_text(struct dive *dive, struct graphics_context *gc, struct plot_info *pi)
|
||||||
{
|
{
|
||||||
struct sample *sample, *end;
|
|
||||||
int maxtime, maxdepth;
|
int maxtime, maxdepth;
|
||||||
|
|
||||||
/* Get plot scaling limits */
|
/* Get plot scaling limits */
|
||||||
|
@ -228,10 +180,7 @@ static void plot_depth_text(struct dive *dive, struct graphics_context *gc)
|
||||||
gc->scalex = maxtime;
|
gc->scalex = maxtime;
|
||||||
gc->scaley = maxdepth;
|
gc->scaley = maxdepth;
|
||||||
|
|
||||||
sample = dive->sample;
|
plot_text_samples(gc, pi);
|
||||||
end = dive->sample + dive->samples;
|
|
||||||
|
|
||||||
plot_text_samples(gc, sample, end);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void plot_smoothed_profile(struct graphics_context *gc, struct plot_info *pi)
|
static void plot_smoothed_profile(struct graphics_context *gc, struct plot_info *pi)
|
||||||
|
@ -625,7 +574,7 @@ static void plot(struct graphics_context *gc, int w, int h, struct dive *dive)
|
||||||
plot_depth_profile(dive, gc, pi);
|
plot_depth_profile(dive, gc, pi);
|
||||||
|
|
||||||
/* Text on top of all graphs.. */
|
/* Text on top of all graphs.. */
|
||||||
plot_depth_text(dive, gc);
|
plot_depth_text(dive, gc, pi);
|
||||||
plot_cylinder_pressure_text(dive, gc);
|
plot_cylinder_pressure_text(dive, gc);
|
||||||
|
|
||||||
/* And info box in the lower right corner.. */
|
/* And info box in the lower right corner.. */
|
||||||
|
|
Loading…
Add table
Reference in a new issue