# HG changeset patch # User Sascha L. Teichmann # Date 1261551226 0 # Node ID 422275fc99278ffad1b28853866420c70e30b9cd # Parent 23e9352df09b3ff19beb113b0dbca9f9cf7c249a Refactored the XYColumn and Point2d code a bit to be more reusable in 3D. gnv-artifacts/trunk@479 c6561f87-3c4e-4783-a992-168aeb5c3f6f diff -r 23e9352df09b -r 422275fc9927 gnv-artifacts/ChangeLog --- a/gnv-artifacts/ChangeLog Tue Dec 22 20:45:45 2009 +0000 +++ b/gnv-artifacts/ChangeLog Wed Dec 23 06:53:46 2009 +0000 @@ -1,3 +1,21 @@ +2009-12-23 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/math/XYColumn.java: Extends from + Point2d now to make some of the code (x/y sorting, envelope, etc.) + reusable in 3D from 2D code. + + * src/main/java/de/intevation/gnv/math/IJKey.java: New: The (i, j) hashing + is now moved to this class because of the new inheritance of XYColumn. + + * src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java: + Adjusted the (i, j) hashing. + + * src/main/java/de/intevation/gnv/math/Point2d.java: Added a new constructor + to make it easier to extend from it. + + * src/main/java/de/intevation/gnv/math/Interpolation2D.java: Made the buffer + extend calculation a static method to be reusable in 3D case. + 2009-12-22 Sascha L. Teichmann * doc/conf/conf.xml: Load salinity palette correctly. diff -r 23e9352df09b -r 422275fc9927 gnv-artifacts/src/main/java/de/intevation/gnv/math/IJKey.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/IJKey.java Wed Dec 23 06:53:46 2009 +0000 @@ -0,0 +1,31 @@ +package de.intevation.gnv.math; + +import java.io.Serializable; + +/** + * @author Sascha L. Teichmann + */ +public class IJKey +implements Serializable +{ + public int i; + public int j; + + public IJKey() { + } + + public IJKey(int i, int j) { + this.i = i; + this.j = j; + } + + public int hashCode() { + return (i << 16) | j; + } + + public boolean equals(Object obj) { + IJKey other = (IJKey)obj; + return i == other.i && j == other.j; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r 23e9352df09b -r 422275fc9927 gnv-artifacts/src/main/java/de/intevation/gnv/math/Interpolation2D.java --- a/gnv-artifacts/src/main/java/de/intevation/gnv/math/Interpolation2D.java Tue Dec 22 20:45:45 2009 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/Interpolation2D.java Wed Dec 23 06:53:46 2009 +0000 @@ -26,6 +26,62 @@ private Interpolation2D() { } + public static final double [] calculateBuffer( + List points + ) { + HashMap> iMap = + new HashMap>(); + + HashMap> jMap = + new HashMap>(); + + for (int k = points.size()-1; k >= 0; --k) { + Point2d p = points.get(k); + + ArrayList jList = jMap.get(p.j); + ArrayList iList = jMap.get(p.i); + + if (jList == null) { + iMap.put(p.j, jList = new ArrayList()); + } + jList.add(p); + + if (iList == null) { + jMap.put(p.i, iList = new ArrayList()); + } + iList.add(p); + } + + double dxMax = -Double.MAX_VALUE; + double dyMax = -Double.MAX_VALUE; + + for (ArrayList v: jMap.values()) { + Collections.sort(v, Point2d.Y_COMPARATOR); + for (int i = 1, L = v.size(); i < L; ++i) { + double dy = Math.abs(v.get(i).x - v.get(i-1).x); + if (dy > dyMax) { + dyMax = dy; + } + } + } + + dyMax += 1e-5d; + + for (ArrayList v: iMap.values()) { + Collections.sort(v, Point2d.X_COMPARATOR); + for (int i = 1, L = v.size(); i < L; ++i) { + double dx = Math.abs(v.get(i).x - v.get(i-1).x); + if (dx > dxMax) { + dxMax = dx; + } + } + } + + dxMax += 1e-5d; + + return new double [] { dxMax, dyMax }; + } + public static void interpolate( List path, List points, @@ -47,61 +103,9 @@ return; } - HashMap> map = new HashMap>(); - - for (int k = M-1; k >= 0; --k) { - Point2d p = points.get(k); - - ArrayList list = map.get(p.j); - - if (list == null) { - map.put(p.j, list = new ArrayList()); - } - list.add(p); - } - - double dxMax = -Double.MAX_VALUE; - - for (ArrayList v: map.values()) { - Collections.sort(v, Point2d.X_COMPARATOR); - for (int i = 1, L = v.size(); i < L; ++i) { - double dx = Math.abs(v.get(i).x - v.get(i-1).x); - if (dx > dxMax) { - dxMax = dx; - } - } - } - - dxMax += 1e-5d; - - map.clear(); - - for (int k = M-1; k >= 0; --k) { - Point2d p = points.get(k); - - ArrayList list = map.get(p.i); - - if (list == null) { - map.put(p.i, list = new ArrayList()); - } - list.add(p); - } - - double dyMax = -Double.MAX_VALUE; - - for (ArrayList v: map.values()) { - Collections.sort(v, Point2d.Y_COMPARATOR); - for (int i = 1, L = v.size(); i < L; ++i) { - double dy = Math.abs(v.get(i).y - v.get(i-1).y); - if (dy > dyMax) { - dyMax = dy; - } - } - } - - dyMax += 1e-5d; - - map = null; + double [] buffer = calculateBuffer(points); + double dxMax = buffer[0]; + double dyMax = buffer[1]; if (log.isDebugEnabled()) { log.debug("buffer size: " + dxMax + " / " + dyMax); diff -r 23e9352df09b -r 422275fc9927 gnv-artifacts/src/main/java/de/intevation/gnv/math/Point2d.java --- a/gnv-artifacts/src/main/java/de/intevation/gnv/math/Point2d.java Tue Dec 22 20:45:45 2009 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/Point2d.java Wed Dec 23 06:53:46 2009 +0000 @@ -59,6 +59,12 @@ public Point2d() { } + public Point2d(double x, double y, int i, int j) { + super(x, y); + this.i = i; + this.j = j; + } + public Point2d(double x, double y, double z, int i, int j) { super(x, y, z); this.i = i; diff -r 23e9352df09b -r 422275fc9927 gnv-artifacts/src/main/java/de/intevation/gnv/math/XYColumn.java --- a/gnv-artifacts/src/main/java/de/intevation/gnv/math/XYColumn.java Tue Dec 22 20:45:45 2009 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/XYColumn.java Wed Dec 23 06:53:46 2009 +0000 @@ -1,32 +1,24 @@ package de.intevation.gnv.math; -import java.io.Serializable; import java.util.ArrayList; import java.util.List; /** * @author Ingo Weinzierl + * @author Sascha L. Teichmann */ public class XYColumn -implements Serializable +extends Point2d { + protected List values; - private double x; - private double y; - - private int i; - private int j; - - private List values; + public XYColumn() { + } public XYColumn(double x, double y, int i, int j) { - this.x = x; - this.y = y; - this.i = i; - this.j = j; + super(x, y, i, j); } - public void add(HeightValue value) { if (values == null) { values = new ArrayList(); @@ -34,20 +26,8 @@ values.add(value); } - public HeightValue[] getValues() { return (HeightValue[]) values.toArray(new HeightValue[values.size()]); } - - - public int hashCode() { - return (i << 16) | j; - } - - - public boolean equals(Object obj) { - XYColumn other = (XYColumn) obj; - - return i == other.i && j == other.j && x == other.x && y == other.y; - } } +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r 23e9352df09b -r 422275fc9927 gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java --- a/gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java Tue Dec 22 20:45:45 2009 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java Wed Dec 23 06:53:46 2009 +0000 @@ -40,9 +40,12 @@ import de.intevation.gnv.geobackend.base.query.QueryExecutor; import de.intevation.gnv.geobackend.base.query.QueryExecutorFactory; import de.intevation.gnv.geobackend.base.query.exception.QueryException; + import de.intevation.gnv.math.AttributedXYColumns; import de.intevation.gnv.math.HeightValue; import de.intevation.gnv.math.XYColumn; +import de.intevation.gnv.math.IJKey; + import de.intevation.gnv.state.describedata.KeyValueDescibeData; import de.intevation.gnv.state.exception.StateException; import de.intevation.gnv.state.timeseries.TimeSeriesOutputState; @@ -156,7 +159,7 @@ protected AttributedXYColumns preProcess(Collection results) { AttributedXYColumns attColumns = new AttributedXYColumns(); - Map map = new HashMap(); + Map map = new HashMap(1013); Iterator iter = results.iterator(); int sIdx = -1; @@ -200,14 +203,16 @@ int k = result.getInteger(kIdx); int z = result.getInteger(zIdx); - XYColumn col = new XYColumn(point.getX(), point.getY(), i, j); - XYColumn old = (XYColumn)map.get(col); + IJKey key = new IJKey(i, j); - if (old == null) { - map.put(old = col, col); + XYColumn col = (XYColumn)map.get(key); + + if (col == null) { + col = new XYColumn(point.getX(), point.getY(), i, j); + map.put(key, col); } - old.add(new HeightValue(z, v, k)); + col.add(new HeightValue(z, v, k)); } catch (ParseException pe) { log.warn("Error while parsing geometry.", pe);