diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-01-08 15:48:23 -0800 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2013-01-09 16:17:57 -0800 |
commit | 88313f10778f22c77e9a8615f886da7b798ef023 (patch) | |
tree | 5eb46f459516182cf93ba13a8dbb47ebd309b15f | |
parent | c0ce218df494a527111ce9180aef84ea0d34e333 (diff) | |
download | subsurface-88313f10778f22c77e9a8615f886da7b798ef023.tar.gz |
Clean up duplicated depth interpolation
We have several places where we interpolate the depth based on two
samples and the time between them. Some of them use floating point, some
of them don't, some of them meant to do it but didn't.
Just use a common helper function for it. I seriously doubt the floating
point here really matters, since doing it in integers is not going to
overflow unless we're interpolating between two samples that are hours
apart at hundreds of meters of depth, but hey, it gives that rounding to
the nearest millimeter. Which I'm sure matters.
Anyway, we can probably just get rid of the rounding and the floating
point math, but it won't really hurt either, so at least do it
consistently.
The interpolation could be for other things than just depth, but we
probably don't have anything else we'd want to interpolate. But make the
function naming generic just in case.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r-- | dive.h | 9 | ||||
-rw-r--r-- | divelist.c | 3 | ||||
-rw-r--r-- | planner.c | 2 | ||||
-rw-r--r-- | profile.c | 14 |
4 files changed, 13 insertions, 15 deletions
@@ -4,6 +4,7 @@ #include <stdlib.h> #include <stdint.h> #include <time.h> +#include <math.h> #include <glib.h> #include <glib/gstdio.h> @@ -221,6 +222,14 @@ static inline int mbar_to_PSI(int mbar) return to_PSI(p); } +/* Linear interpolation between 'a' and 'b', when we are 'part'way into the 'whole' distance from a to b */ +static inline int interpolate(int a, int b, int part, int whole) +{ + /* It is doubtful that we actually need floating point for this, but whatever */ + double x = (double) a * (whole - part) + (double) b * part; + return rint(x / whole); +} + struct sample { duration_t time; depth_t depth; diff --git a/divelist.c b/divelist.c index aaf7d2fcb..024d9bfb3 100644 --- a/divelist.c +++ b/divelist.c @@ -834,8 +834,7 @@ static void add_dive_to_deco(struct dive *dive) int j; for (j = t0; j < t1; j++) { - int depth = 0.5 + psample->depth.mm + (j - t0) * - (sample->depth.mm - psample->depth.mm) / (t1 - t0); + int depth = interpolate(psample->depth.mm, sample->depth.mm, j - t0, t1 - t0); (void) add_segment(depth_to_mbar(depth, dive) / 1000.0, &dive->cylinder[sample->sensor].gasmix, 1, sample->po2 / 1000.0, dive); } @@ -99,7 +99,7 @@ double tissue_at_end(struct dive *dive, char **cached_datap) if (i > 0) lastdepth = psample->depth.mm; for (j = t0; j < t1; j++) { - int depth = lastdepth + (j - t0) * (sample->depth.mm - lastdepth) / (t1 - t0); + int depth = interpolate(lastdepth, sample->depth.mm, j - t0, t1 - t0); tissue_tolerance = add_segment(depth_to_mbar(depth, dive) / 1000.0, &dive->cylinder[gasidx].gasmix, 1, sample->po2, dive); } @@ -8,7 +8,6 @@ #include <stdarg.h> #include <string.h> #include <time.h> -#include <math.h> #include "dive.h" #include "display.h" @@ -1596,15 +1595,6 @@ static void calculate_max_limits(struct dive *dive, struct divecomputer *dc, str pi->maxtemp = maxtemp; } -/* Average between 'a' and 'b', when we are 'part'way into the 'whole' distance from a to b */ -static int average_depth(int a, int b, int part, int whole) -{ - double x; - - x = (a * (whole - part) + b * part) / whole; - return rint(x); -} - static struct plot_data *populate_plot_entries(struct dive *dive, struct divecomputer *dc, struct plot_info *pi) { int idx, maxtime, nr, i; @@ -1653,7 +1643,7 @@ static struct plot_data *populate_plot_entries(struct dive *dive, struct divecom /* .. but update depth and time, obviously */ entry->sec = lasttime + offset; - entry->depth = average_depth(lastdepth, depth, offset, delta); + entry->depth = interpolate(lastdepth, depth, offset, delta); /* And clear out the sensor pressure, since we'll interpolate */ SENSOR_PRESSURE(entry) = 0; @@ -1867,7 +1857,7 @@ static void calculate_deco_information(struct dive *dive, struct divecomputer *d t1 = entry->sec; tissue_tolerance = 0; for (j = t0; j < t1; j++) { - int depth = 0.5 + (entry - 1)->depth + (j - t0) * (entry->depth - (entry - 1)->depth) / (t1 - t0); + int depth = interpolate(entry[-1].depth, entry[0].depth, j - t0, t1 - t0); double min_pressure = add_segment(depth_to_mbar(depth, dive) / 1000.0, &dive->cylinder[cylinderindex].gasmix, 1, entry->po2, dive); if (min_pressure > tissue_tolerance) |