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 };

http://dive4elements.wald.intevation.org