Mercurial > dive4elements > river
diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/MainValuesWFacet.java @ 2775:5016609663e2
Draw line from w-annotation to duration curve, rough version.
flys-artifacts/trunk@4514 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Felix Wolfsteller <felix.wolfsteller@intevation.de> |
---|---|
date | Fri, 25 May 2012 09:13:43 +0000 |
parents | c68f4f227c09 |
children | 772d0c8100d3 |
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/MainValuesWFacet.java Fri May 25 09:05:07 2012 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/MainValuesWFacet.java Fri May 25 09:13:43 2012 +0000 @@ -3,13 +3,18 @@ import java.util.ArrayList; import java.util.List; +import org.apache.log4j.Logger; + import de.intevation.artifacts.Artifact; import de.intevation.artifacts.CallContext; +import de.intevation.artifacts.DataProvider; import de.intevation.artifactdatabase.state.DefaultFacet; import de.intevation.flys.artifacts.MainValuesArtifact; +import de.intevation.flys.artifacts.math.Linear; import de.intevation.flys.artifacts.model.FacetTypes; +import de.intevation.flys.artifacts.model.WQDay; import de.intevation.flys.jfree.FLYSAnnotation; import de.intevation.flys.jfree.StickyAxisAnnotation; @@ -21,6 +26,9 @@ extends DefaultFacet implements FacetTypes { + /** Own logger. */ + private static Logger logger = Logger.getLogger(RelativePointFacet.class); + /** Do we want MainValues at Gauge (not interpolated)? */ protected boolean isAtGauge; @@ -34,6 +42,40 @@ /** + * Set the hit-point in W where a line drawn from the axis would hit the + * curve in WQDay (if hit). + * Employ linear interpolation. + */ + protected static void setHitPoint(WQDay wqday, StickyAxisAnnotation annotation) { + int idx = 0; + float w = annotation.getPos(); + boolean wIncreases = wqday.getW(0) < wqday.getW(wqday.size()-1); + if (wIncreases) { + while (idx < wqday.size() && wqday.getW(idx) < w) { + idx++; + } + } + else { + idx = wqday.size() -1; + while (idx > 0 && wqday.getW(idx) > w) { + idx--; + } + } + + double day = 0d; + int mod = (wIncreases) ? -1 : +1; + if (idx != 0 && idx <= wqday.size()-1) { + day = Linear.linear(w, wqday.getW(idx +mod), wqday.getW(idx), + wqday.getDay(idx+mod), wqday.getDay(idx)); + annotation.setHitPoint((float)day); + } + else { + logger.debug("StickyAnnotation does not hit wqday curve"); + } + } + + + /** * Returns the data this facet requires. * * @param artifact the owner artifact. @@ -48,11 +90,30 @@ List<NamedDouble> ws = mvArtifact.getMainValuesW(isAtGauge); List<StickyAxisAnnotation> xy = new ArrayList<StickyAxisAnnotation>(); + // BLACKBOARD/DURATIONCURVE / reference point ... + WQDay wqdays = null; + List<DataProvider> providers = context. + getDataProvider(DurationCurveFacet.BB_DURATIONCURVE); + if (providers.size() < 1) { + logger.warn("Could not find durationcurve data provider."); + } + else { + wqdays = (WQDay) providers.get(0).provideData( + DurationCurveFacet.BB_DURATIONCURVE, + null, + context); + } + for (NamedDouble w: ws) { - xy.add(new StickyAxisAnnotation( - w.getName(), - (float) w.getValue(), - StickyAxisAnnotation.SimpleAxis.Y_AXIS)); + StickyAxisAnnotation annotation = + new StickyAxisAnnotation( + w.getName(), + (float) w.getValue(), + StickyAxisAnnotation.SimpleAxis.Y_AXIS); + xy.add(annotation); + if (wqdays != null) { + setHitPoint(wqdays, annotation); + } } return new FLYSAnnotation(description, xy);