]> git.tdb.fi Git - ext/subsurface.git/commitdiff
Make pressure plot shading by sac rate consistent
authorDirk Hohndel <dirk@hohndel.org>
Sat, 19 Nov 2011 19:43:37 +0000 (14:43 -0500)
committerDirk Hohndel <dirk@hohndel.org>
Sat, 19 Nov 2011 20:12:30 +0000 (15:12 -0500)
Some parts of the existing code used the depth at the time of the sample
to calculate the sac rate - it makes much more sense to use the average
depth. But that requires us to loop over the entries and average the
individual sac rates per segment instead of just using the beginning and
end depth of the multi-segment interval we use for smoothing purposes.

This may seem like a subtle detail, but it does in fact matter when we
plot the synthetic tank pressure values that we create when we have no
tank pressure data in the samples.

Another detail we change here is to not artificially start with a forward
looking segment of the full SAC_WINDOW but instead just start with the
first two data points and then simply let the time window grow until it
hits SAC_WINDOW - at which point it becomes a sliding window.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
profile.c

index 3b69f18398d2888b41be42a76bd1c603eebc1600..9fab8b2e89f5ae72cf4732f91e48d4a3cb73de00 100644 (file)
--- a/profile.c
+++ b/profile.c
@@ -670,19 +670,19 @@ static void plot_cylinder_pressure(struct graphics_context *gc, struct plot_info
                        last = i;
                        last_entry = entry;
                        if (first_plot) {
-                               /* don't start with a sac of 0 */
-                               int fe = i + 1;
-                               struct plot_data *future_entry = pi->entry + fe;
-                               while (fe < pi->nr && future_entry->sec - entry->sec < SAC_WINDOW) {
-                                       fe++;
-                                       future_entry = pi->entry + fe;
-                               }
-                               sac = GET_LOCAL_SAC(entry, future_entry, dive);
+                               /* don't start with a sac of 0, so just calculate the first one */
+                               sac = GET_LOCAL_SAC(entry, pi->entry + i + 1, dive);
+                       }
+               } else {
+                       int j;
+                       sac = 0;
+                       for (j = last; j < i; j++)
+                               sac += GET_LOCAL_SAC(pi->entry + j, pi->entry + j + 1, dive);
+                       sac /= (i - last);
+                       if (entry->sec - last_entry->sec >= SAC_WINDOW) {
+                               last++;
+                               last_entry = pi->entry + last;
                        }
-               } else if (entry->sec - last_entry->sec >= SAC_WINDOW) {
-                       sac = GET_LOCAL_SAC(last_entry, entry, dive);
-                       last++;
-                       last_entry = pi->entry + last;
                }
                set_sac_color(gc, sac, dive->sac);
                if (lift_pen) {
@@ -998,10 +998,11 @@ static void fill_missing_tank_pressures(struct dive *dive, struct plot_info *pi,
                                        list = NULL;
                                        continue;
                                }
-                               magic = (nlist->end - cur_pr[entry->cylinderindex]) / pt;                               }
+                               magic = (nlist->end - cur_pr[entry->cylinderindex]) / pt;
+                       }
                        if (pt != 0.0) {
                                double cur_pt = (entry->sec - (entry-1)->sec) *
-                                       (1 + entry->depth / 10000.0);
+                                       (1 + (entry->depth + (entry-1)->depth) / 20000.0);
                                INTERPOLATED_PRESSURE(entry) =
                                        cur_pr[entry->cylinderindex] + cur_pt * magic;
                                cur_pr[entry->cylinderindex] = INTERPOLATED_PRESSURE(entry);
@@ -1217,7 +1218,7 @@ static struct plot_info *create_plot_info(struct dive *dive, int nr_samples, str
                }
                /* finally, do the discrete integration to get the SAC rate equivalent */
                current->pressure_time += (entry->sec - (entry-1)->sec) *
-                                               (1 + entry->depth / 10000.0);
+                       (1 + (entry->depth + (entry-1)->depth) / 20000.0);
                missing_pr |= !SENSOR_PRESSURE(entry);
        }