rrenkert@7791: package org.dive4elements.river.artifacts.model; rrenkert@7791: rrenkert@7791: import org.dive4elements.artifactdatabase.state.Facet; rrenkert@7791: import org.dive4elements.artifacts.Artifact; rrenkert@7791: import org.dive4elements.artifacts.CallContext; rrenkert@7791: import org.dive4elements.river.artifacts.D4EArtifact; rrenkert@7791: import org.dive4elements.river.artifacts.access.RiverAccess; rrenkert@7791: import org.dive4elements.river.artifacts.context.RiverContext; rrenkert@7791: import org.dive4elements.river.artifacts.math.MovingAverage; rrenkert@7791: import org.dive4elements.river.artifacts.states.DefaultState.ComputeType; rrenkert@7791: rrenkert@7791: rrenkert@7791: public class DifferenceCurveFilterFacet rrenkert@7791: extends DifferenceCurveFacet rrenkert@7791: { rrenkert@7791: public DifferenceCurveFilterFacet() { rrenkert@7791: } rrenkert@7791: rrenkert@7791: public DifferenceCurveFilterFacet( rrenkert@7791: int index, rrenkert@7791: String name, rrenkert@7791: String description, rrenkert@7791: ComputeType type, rrenkert@7791: String stateID, rrenkert@7791: String hash rrenkert@7791: rrenkert@7791: ) { rrenkert@7791: super(index, name, description, type, stateID, hash); rrenkert@7791: } rrenkert@7791: rrenkert@7791: /** rrenkert@7791: * Get difference curve data. rrenkert@7791: * @return a WKms at given index. rrenkert@7791: */ rrenkert@7791: @Override rrenkert@7791: public Object getData(Artifact artifact, CallContext context) { rrenkert@7791: WKms result = (WKms)super.getData(artifact, context); rrenkert@7791: rrenkert@7791: Double start = (Double)context.getContextValue("startkm"); rrenkert@7791: Double end = (Double)context.getContextValue("endkm"); rrenkert@7791: if(start != null && end != null) { andre@8607: if (start > end) { andre@8607: Double buf = start; andre@8607: start = end; andre@8607: end = buf; andre@8607: } rrenkert@7791: RiverContext fc = (RiverContext)context.globalContext(); rrenkert@7791: // Adaptive smoothing, based on zoom factor/diagram extents. rrenkert@7791: ZoomScale scales = (ZoomScale)fc.get("zoomscale"); rrenkert@7791: RiverAccess access = new RiverAccess((D4EArtifact)artifact); rrenkert@7791: String river = access.getRiverName(); rrenkert@7791: rrenkert@7791: double radius = scales.getRadius(river, start, end); rrenkert@7791: rrenkert@7791: double[][] oldData = new double[2][result.size()]; rrenkert@7791: for (int i = 0; i < result.size(); i++) { rrenkert@7791: oldData[0][i] = result.getKm(i); rrenkert@7791: oldData[1][i] = result.getW(i); rrenkert@7791: } rrenkert@7791: rrenkert@7791: double[][] diffs = MovingAverage.weighted(oldData, radius); rrenkert@7791: WKmsImpl newData = new WKmsImpl(); rrenkert@7791: for(int j = 0; j < diffs[0].length; j++) { rrenkert@7791: newData.add(diffs[0][j], diffs[1][j]); rrenkert@7791: } rrenkert@7791: return newData; rrenkert@7791: } rrenkert@7791: return result; rrenkert@7791: } rrenkert@7791: rrenkert@7791: rrenkert@7791: /** Copy deeply. */ rrenkert@7791: @Override rrenkert@7791: public Facet deepCopy() { rrenkert@7791: WaterlevelFacet copy = new DifferenceCurveFilterFacet(); rrenkert@7791: copy.set(this); rrenkert@7791: copy.type = type; rrenkert@7791: copy.stateId = stateId; rrenkert@7791: copy.hash = hash; rrenkert@7791: return copy; rrenkert@7791: } rrenkert@7791: }