Mercurial > dive4elements > river
comparison artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedloadDiameterResult.java @ 8581:073ea4bcea58
(issue1755) Interpolate BedQuality Results
This adds an interpolation function to each various bedQuality result class.
Imho this is ok as the interpolation function can be seen as part of the result.
The interpolation function is initalized on first use and can be accessed through
get.*Interpol functions.
author | Andre Heinecke <andre.heinecke@intevation.de> |
---|---|
date | Mon, 16 Mar 2015 15:36:38 +0100 |
parents | af13ceeba52a |
children |
comparison
equal
deleted
inserted
replaced
8580:d9f038b8e2ce | 8581:073ea4bcea58 |
---|---|
7 */ | 7 */ |
8 | 8 |
9 package org.dive4elements.river.artifacts.model.minfo; | 9 package org.dive4elements.river.artifacts.model.minfo; |
10 | 10 |
11 import org.dive4elements.river.artifacts.model.DateRange; | 11 import org.dive4elements.river.artifacts.model.DateRange; |
12 import org.dive4elements.river.utils.DoubleUtil; | |
13 | |
12 import gnu.trove.TDoubleArrayList; | 14 import gnu.trove.TDoubleArrayList; |
13 | 15 |
16 import org.apache.commons.math.analysis.polynomials.PolynomialSplineFunction; | |
17 | |
18 import org.apache.commons.math.ArgumentOutsideDomainException; | |
14 | 19 |
15 public class BedloadDiameterResult | 20 public class BedloadDiameterResult |
16 extends BedQualityDiameterResult | 21 extends BedQualityDiameterResult |
17 { | 22 { |
18 protected TDoubleArrayList diameter; | 23 protected TDoubleArrayList diameter; |
24 protected PolynomialSplineFunction interpol; | |
25 | |
26 /** Set to true if this result can't be interpolated.*/ | |
27 protected boolean nonInterpolResult; | |
19 | 28 |
20 public BedloadDiameterResult( | 29 public BedloadDiameterResult( |
21 String type, | 30 String type, |
22 TDoubleArrayList diameter, | 31 TDoubleArrayList diameter, |
23 TDoubleArrayList km, | 32 TDoubleArrayList km, |
24 DateRange range | 33 DateRange range |
25 ) { | 34 ) { |
26 super (type, km); | 35 super (type, km); |
27 this.diameter = diameter; | 36 this.diameter = diameter; |
37 interpol = null; | |
38 nonInterpolResult = false; | |
28 } | 39 } |
29 | 40 |
30 public double getDiameter(int ndx) { | 41 public double getDiameter(int ndx) { |
31 if (diameter != null) { | 42 if (diameter != null) { |
32 return this.diameter.get(ndx); | 43 return this.diameter.get(ndx); |
39 return diameter.get(kms.indexOf(km)); | 50 return diameter.get(kms.indexOf(km)); |
40 } | 51 } |
41 return Double.NaN; | 52 return Double.NaN; |
42 } | 53 } |
43 | 54 |
55 public double getDiameterInterpol(double km) { | |
56 if (nonInterpolResult) { | |
57 return Double.NaN; | |
58 } | |
59 if (interpol == null) { | |
60 interpol = DoubleUtil.getLinearInterpolator(kms, diameter); | |
61 if (interpol == null) { | |
62 nonInterpolResult = true; | |
63 return Double.NaN; | |
64 } | |
65 } | |
66 try { | |
67 return interpol.value(km); | |
68 } catch (ArgumentOutsideDomainException e) { | |
69 /* This is expected for many results. */ | |
70 return Double.NaN; | |
71 } | |
72 } | |
73 | |
44 public double[][] getDiameterData() { | 74 public double[][] getDiameterData() { |
45 return new double[][] { | 75 return new double[][] { |
46 kms.toNativeArray(), | 76 kms.toNativeArray(), |
47 diameter.toNativeArray() | 77 diameter.toNativeArray() |
48 }; | 78 }; |